上面左边是我的个人微信,如需进一步沟通,请加微信。 右边是我的公众号“Openstack私有云”,如有兴趣,请关注。
近期朋友一个防火墙故障,在紧急情况下,将外网专线插到一台linux服务器(红帽rhel5.3),使用linux的iptables完成了原来防火墙的端口转换NAT功能以及内网服务器上网的功能。下面记录一下过程。
在操作之前,复习了一下iptables的原理,我参考了下面这个网址,介绍的非常详细:
另外,参考了下面这个网址,和我的应用环境非常相似,都是单独使用一台linux服务器作为防火墙使用,提供给内网服务器nat地址端口转换以及上外网:
iptables主要有3个表filter、nat、mangle,5个链INPUT、OUTPUT、FORWORD、PREROUTING、POSTROUTING,可以实现非常复杂的各类防火墙功能,比如本机服务器的消息过滤、转发,nat端口映射,内外网消息转发等等。在我的应用当中,主要用到nat端口映射和内网外消息转发。
其他不多说,上重点,下面这张图,是简化了的iptables包处理流程图,消息从左到右。
1、使用一对一nat端口映射功能,消息流是图的下面直线那条线路,也就是说,需要配置NAT表的PREROUTING链,FILTER表的FORWORD链,以及NAT表的POSTROUTING链;
2、实现内网共享上网功能,其实使用的也是nat地址转换功能,需要在NAT表的POSTROUTING链上将内网的源地址转换为外网地址,同样的,还要设置FILTER表的FORWORD链,使内网的消息能够双向通过。对iptables设置完成之后,在内网需要共享上网的服务器上,需要将网关直接设置为iptables所在的服务器的内网IP地址。
操作记录:
简单说明一下网络结构,linux防火墙服务器的eth0连内网,eth3连外网,eth0地址10.1.1.8 ,eth3外网地址121.1.2.3 。其他内网服务器连接内网,网段是10.1.1.0/24,网关设置为10.1.1.8 。
一、 一对一NAT端口映射设置
1、首先将linux核心参数net.ipv4.ip_forward=1 打开
#vi /etc/sysctl.conf ~~ net.ipv4.ip_forward = 1 ~~ #sysctl -p
2、配置NAT表的PREROUTING链
iptables -t nat -A PREROUTING -d 121.1.2.3 -p tcp --dport 9998 -j DNAT --to 10.1.1.66:3389
3、配置NAT表的POSTROUTING链
iptables -t nat -A POSTROUTING -d 10.1.1.66 -p tcp --dport 3389 -j SNAT --to 10.1.1.8
4、配置FILTER表的FORWORD链
iptables -A FORWARD -o eth0 -d 10.1.1.66 -p tcp --dport 3389 -j ACCEPT
5、配置FILTER表的FORWORD链,使链路处于ESTABLISHED,RELATED状态消息回来的时候能够原路返回:
iptables -A FORWARD -i eth0 -s 10.1.1.66 -p tcp --sport 3389 -m state --state ESTABLISHED,RELATED -j ACCEPT
上面的设置是以10.1.1.66内网端口3389映射到外网121.1.2.3的9998端口为例。其他的一对一端口映射一样的设置方法。
二、实现内网共享上网功能
1、在NAT表的POSTROUTING链上将内网的源地址转换为外网地址:
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth3 -j SNAT --to-source 121.1.2.3
2、设置FILTER表的FORWORD链,使内网的消息能够双向通过:
iptables -A FORWARD -i eth0 -s 10.1.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 10.1.1.0/24 -j ACCEPT
3、在内网服务器上将网关设置为10.1.1.8:
route add default gw 10.1.1.8
4、在内网服务器上设置DNS地址:
#vi /etc/resolv.conf
nameserver xxx.xx.xx.x //根据实际情况设置
5、设置DNS端口udp 53端口能够通过,参考上面的“一对一NAT端口映射设置进行设置”方法进行设置
特别说明:
在我的环境当中,iptables表有一个链 RH-Firewall-1-INPUT ,简化了filter表的设置,对于需要通过filter的端口,需要在这个RH-Firewall-1-INPUT链中添加规则。比如:
iptables -I RH-Firewall-1-INPUT 12 -p tcp --dport 3389 -m state --state NEW -j ACCEPT