iptables一般的只需要关注两个表,一个是nat表,一个是filter表,其他表暂时用不到,然后nat表里有三个链,filter表里有三个链,总结两个表,五个链
入站数据流向:数据包到达防火墙后首先被PREROUTING链处理(是否修改数据包地址等),然后进行路由选择(判断数据包发往何处),如果数据包的目标地址是防火墙本机(如:Internet用户访问网关的Web服务端口),那么内核将其传递给INPUT链进行处理(决定是否允许通过等)。
转发数据流向:来自外界的数据包到达防火墙后首先被PREROUTTING链处理,然后再进行路由选择;如果数据包的目标地址是其他的外部地址(如局域网用户通过网关访问QQ服务器),则内核将其传递给FORWARD链进行处理(允许转发,拦截,丢弃),最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT链处理,然后进行路由选择,再交给POSTROUTING链(是否修改数据包的地址等)进行处理。
下面实验下看看:
环境说明:vmware下两台虚拟机,
192.168.255.129上搭建了ftp服务,被动模式,21为控制端口,1023至65535随机出现数据端口
192.168.255.131作为NAT服务器
目的将129的ftp服务其映射到192.168.255.131上的指定端口
准备工作,使129的网关地址为131
删除默认网关地址 : route delete default gw 网关ip(我这里是192.168.255.2)
新增默认网关地址: route add default gw 192.168.255.131
1.首先确保一点,192.168.255.129的网关地址为192.168.255.131,否则129有多个出口,二者无法关联映射
131要做的工作:去掉firewalld服务,关闭selinux,启用iptables服务,129无所谓,关闭firewalld和selinux就行了
systemctl stop firewald.service && sudo systemctl disable firewald.service
yum install iptables-services iptables-devel -y
systemctl enable iptables.service && sudo systemctl start iptables.service
2.开启131的网卡转发功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
3.131上设置允许255过来的网段进行地址伪装,也就是129到达之后,可以用131为源地址进行"外网”的访问,(要不要这条配置无所谓,只是为了让129可以上外网)
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -j MASQUERADE
4.131上设置DNAT,将去往166端口的请求转发到129的21端口,131上可以不用开166端口,他自己会转发,理论上166端口的包到达pre链就直接转给了129的21端口,根本没有到达131自己的INPUT链,所以不需要放行131INPUT链的166端口
iptables -t nat -I PREROUTING -p tcp -d 192.168.255.131 --dport 166 -j DNAT --to 192.168.255.129:21
5.131上开启ftp内核模块追踪相关数据端口
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
lsmod | grep ftp 有东西表示成功
6.接下来访问测试看看?成功了
7.通信详细流程
客户端访问192.168.255.131:166,这时候先经过131的prerouting链,判断是DNAT规则,将目的地址修改为192.168.255.129:21,经由路由选择,判断不是进入本机的数据包,而是转发包,传递给forward链进行处理(这里没有规则,默认许可),经由postrouting链(这里源ip是客户端ip仍旧没变,只允许255网段的修改源ip),最后转发到129,129处理结束之后(没开iptables),源ip为129,目的ip为客户端ip,判断目的ip不是跟自己一个网段,交给网关地址,129的回包直接到达131,131上经由PREROUTING链(这里直接通过),根据路由选择,判断不是到本机的,内核将其传递给FORWARD链进行处理(默认允许),再经由POSTROUTING链将源IP也就是129,修改为131的外网口地址(如果有外网口的话,这里就是131,通过iptables可以指定,如果是外网口就必须要指定SNAT,如果像这里,可以不用指定SNAT),最后源ip是131,目的地址客户端ip,返回给客户端。
原文地址:http://blog.51cto.com/9237101/2327394