iptables防火墙(三)

2019-07-04 14:35:43 浏览数 (1)

第十三章 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配置文件

中即可实现重启生效了。

0 人点赞