通过上一篇文章的学习,我们认识了Linux防火墙的表、链机构,并学会了编写简单的防火墙规则。Linux防火墙在很多时候承担着连接企业内、外网的重任,除了提供数据包过滤功能以外,有时还需要提供一些基本的网关应用。
在配置SNAT和DNAT之前,需要开启Linux系统中的地址转发功能,否则数据无法通过防火墙转发出去。
修改/etc/sysctl.conf配置文件件,将ip_forward的值设置为1即可。
[root@localhost /]#vim /etc/sysctl.conf
……//省略部分内容
net.ipv4.ip_forwaed=1 //将此行中的0改为1
[root@localhost /]#sysctl -p //重新读取修改后的配置
也可以开启临时的路由转发,可以执行以下操作。
[root@localhost /]#echo 1> /proc/sys/net/ipv4/ip_forward
或者
[root@localhost /]#sysctl -w net.ipv4.ip_forward=1
SNAT的策略及应用
SNAT:源地址转换,是Linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。
SNAT策略只能用在nat表的POSTROUTING链中,使用iptables命令编写SNAT策略时,需要结合“–to-source IP地址”选项来指定修改后的源IP地址。
列如:Linux网关服务器通过eth0和eth1分别连接Internet和局域网,其中eth0的IP地址为218.29.30.31,eth1的IP地址为192.168.1.1。现在要求在Linux网关服务器上配置规则,使用局域网内的所有用户可以通过共享的方式访问互联网。可执行以下操作。
1)开启路由转发,上面已经讲过,这里不在详述了。
2)在iptables的POSTROUTING中编写SNAT规则。
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT –to-source 218.29.30.31
3)在某些情况下,网关的外网IP地址可能不是固定的,列如使用ADSL宽带接入时,针对这这种需求,iptables提供了一个名为MASQUERASE(伪装)的数据包控制类型,MASQUERADE相当于SNAT的一个特列,同样同来修改数据包的源IP地址只过过它能过自动获取外网接口的IP地址。
参照上一个SNAT案例,若要使用MASQUERADE伪装策略,只需要去掉SNAT策略中的“–to-source IP地址”。然而改为“-j MASQUERADE”指定数据包的控制类型。对于ADSL宽带连接来说,连接名称通常为ppp0,ppp1等。操作如下
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
4)测试SNAT共享接入的结果
同过上面的配置,这时内部局域网访问互联网所使用的IP地址是网关服务器的外网接口地址了。我们可以在往外客户端执行“tcpdump -i eth0”监听访问本机的数据流,然后在内网ping外网客户端,然后查看外网客户端监听的状态,会发现,访问外网客户机的IP地址是网关服务器的外网接口地址,而不是内部局域网的地址。
DNAT策略及应用
DNAT:目标地址转换,是Linux防火墙的另一种地址转换操作,同样也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址,目标端口。
DNAT策略与SNAT策略非常相似,只不过应用方向反过来了。SNAT用来修改源地址IP,而DNAT用来修改目标IP地址,目标端口;SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链中。
列如:借助上述网络环境,公司内部局域网内搭建了一台web服务器,IP地址为192.168.1.7,现在需要将其发布到互联网上,希望通过互联网访问web服务器。那么我们可以执行如下操作。
1)在iptables的PREROUTING中编写DNAT规则。
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.7:80
2)再列如:公司的web服务器192.168.1.7需要通过互联网远程管理,由于考虑到安全问题,管理员不希望使用默认端口进行访问,这时我们可以使用DNAT修改服务的默认端口。操作如下:
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp –dport 2346 -j DNAT –to-destination 192.168.1.7:22
3)在外网客户端浏览器中访问网关服务器的外网接口,可以发现访问的居然是内网192.168.1.7的web服务器的网页。而在使用sshd连接2346端口时,居然可以远程连接到192.168.1.7服务器上。