前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iptables防火墙(三)

iptables防火墙(三)

作者头像
晓天
发布2019-07-04 14:35:43
1.9K0
发布2019-07-04 14:35:43
举报
文章被收录于专栏:Linux、云计算技术交流

第十三章 iptables防火墙(三)

13.3 iptables实现NAT

13.3.1 SNAT配置

NAT(net address translation)网络地址转换,功能是为了实现内网访问公网的。我们知道,IPv4由于可用ip数量有限,不能满足于全球主机网络通信的需求,所以人们设计了内、公网分类的方式。即有些IP仅允许在企业内部局域网使用,不同企业的局域网允许使用相同的IP段。这些IP我们称之为内网IP,内网IP共有以下三大段:

A类:10.X.X.X 共一个

B类:172.16.X.X -- 172.31.X.X 共32个

C类:192.168.0.X– 192.168.255.X 共255个

除了这些内网IP外,其他IP都属于公网ip。公网上的路由器,内部都做了一个规则,审核所有经过的数据包,如果数据包中的源ip或目的ip中出现了内网ip,则立即会被路由器丢弃,无法到达接收方。所以,内网ip只能在内部局域网内使用,是不允许上公网的,公网上只支持公网ip间的通信。因此,内网主机为了能够访问公网,必须在局域网的网关路由器上开启nat功能。具体原理先参看下图:

如图,客户机B访问web网站时,封装的数据包中源port 2000、目的port 80、源ip 10.2、目的ip 202.0.0.1,因为源ip是内网地址,所以会被公网屏蔽,所以必须由路由做nat转换。数据包传递给路由器后,路由器开启一个nat代理进程(假设端口是3000),并以自己外网卡的身份代替主机B上网,会把数据包中的源port、源ip改为自己的代理信息,则数据包可以在公网传输了。同时将转换信息记录到缓存中,公网服务器回复时,会回复到路由器外网卡上,目的port也是nat代理进程的端口(即3000),路由器再查找缓存,找到对应的内网主机,转发给主机B,则内网主机上网成功。若同时有内网其他主机也请求访问公网,则路由器会新开启一个nat进程,端口也是新号(如3001),通过不同的端口号,对应不同的内网客户端。同一客户端的多个进程,路由器也会开多个nat进程,使用不同端口,一一对应,完成代理访问。因为,代理时是对数据包中的源地址做转换的,所以又称为SNAT功能。

iptables中还有两个链:POSTROUTING、PREROUTING,负责代理。iptables –L时是看不到这两个链的,需要在命令后加-t nat参数,表示专项查看nat链。下面来看一下具体命令:

iptables -F

iptables -L -t nat ---查看nat链

iptables -F -t nat ---清空nat链

iptables -t nat -A POSTROUTING -o ens33 -s 192.168.10.0/24 -j SNAT --to-source 202.0.0.2 --- 开启源地址代理snat

注: POSTROUTING是snat的专用链 -o 指定外网卡 -s 指定代理的内网段 -j SNAT 表示做源地址代理转换 --to-source 指定数据包中源ip转化成的ip,即外网卡ip。

iptables -L -t nat ---再次查看nat链,可见加入的代理规则了

现在内网客户端可访问web网站了。访问后,在客户端B上我们使用netstat -n 查看正在通信的连接可见到连接信息:

图中可见,源地址、目的地址的信息,即是数据包中封装信息。

然后到web服务器端,同样使用netstat–n命令查看访问:

可见,服务器收到的是路由器的请求。

注:两张图中,会发现客户端的端口都是1036,其实这只是路由器的默认设置:路由器为了便于对应,nat进程默认都使用与客户端进程的相同进程号,但是如果进程号已被占用,则会再使用另一个端口号,也就是说并不是必须要和客户端进程号一致。

PS:为了方便演示,我这里使用的是windows的客户端与web服务器,读者也可以使用Linux系统,效果是一样的。

13.3.2 DNAT端口映射

上个实验,是服务器在公网上,客户端在内网。但是如果反过来,如果web服务器在内网,想让公网的客户端访问呢?由于内网在公网上是被屏蔽的,所以公网客户端是无法直接访问内网服务器,那同样也需要路由器做代理。

可以想象,公网客户端最远能够访问到路由器的外网卡,所以可以借助于nat,在外网卡上,手动开启一个端口,假设8000,并设置8000端口被访问时,引导到内网的web服务器上。这种引导被称为端口映射。

端口映射的封装如图所示,可见路由器这时是做的目的地址的转换,因此又称为DNAT。命令如下:

iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8000 -j DNAT --to-destination 192.168.10.2:80

注:PREROUTING是dnat的专用链 -i 指定外网卡 -p tcp --dport 指定映射端口 -j DNAT表示目的地址转换 --to-destination 指定内网服务器及其端口。

映射开启后,公网客户端的浏览器地址栏输入:http://202.0.0.2:8000即可访问内网web服务器成功。访问成功后,我们仍可以在双方运行netstat -n 查看各自的连接信息。

但是,这样使用8000作为映射口的话,公网客户访问时还需要特殊指定端口,很不方便,所以我们可以把映射口设定与内网web服务器相同的端口号,即80,则客户端访问就方便多了。

也就是以上命令中设置 -p tcp --dport 80 就行了。

注:若路由器上开启的映射端口为80,则路由器本身的80口必须未被占用,即路由器上没有配置web服务。

另外,当路由器开启了SNAT或DNAT功能后,我们可以想象到,对于公网来讲,内网是完全屏蔽在内的,通信时公网主机传输的数据中的目的ip都是路由器的外网卡ip,所以可以说通信的目的都是路由器,则若增加常规的规则,都需要加到INPUT链中,不可以加到FORWARD链中。

PS:其实在实际生产环境中,企业内的服务器都是不是在内部局域网的,也都是采用这种端口映射的方式让公网访问的。不同服务只需要映射不同的端口即可,如:DNS服务可以映射UDP 53端口(注:路由器外网卡需要开启的映射口是UDP协议的53),FTP服务可以映射TCP 21 20端口等。

13.4 设置永久规则

iptables的命令与之前的所有服务一样,都有重启失效的问题。我们设置完毕规则后,可以使用如下两种操作实现重启生效:

方式一:

service iptables save ---永久保存当前防火墙设置

这种做法实质上是把当前的各规则链设置保存到/etc/sysconfig/iptables文件中,可以vi这个文件看看,会有如下信息,即我们手动输入的命令信息。

保存后,每次重启iptables服务都会自动生效了。

方式二:

iptables-save ---查看当前所有链的信息

注:该命令显示的信息是按照配置文件的格式显示的

所以我们可以将该命令的结果直接导入到/etc/sysconfig/iptables配置文件

中即可实现重启生效了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档