iptables一般的只需要关注两个表,一个是nat表,一个是filter表,其他表暂时用不到,然后nat表里有三个链,filter表里有三个链,总结两个表,五个链

常见封包流程: 入站数据流向:数据包到达防火墙后首先被PREROUTING链处理(是否修改数据包地址等),然后进行路由选择(判断数据包发往何处),如果数据包的目标地址是防火墙本机(如:Internet用户访问网关的Web服务端口),那么内核将其传递给INPUT链进行处理(决定是否允许通过等)。

转发数据流向:来自外界的数据包到达防火墙后首先被PREROUTTING链处理,然后再进行路由选择;如果数据包的目标地址是其他的外部地址(如局域网用户通过网关访问QQ服务器),则内核将其传递给FORWARD链进行处理(允许转发,拦截,丢弃),最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。

出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT链处理,然后进行路由选择,再交给POSTROUTING链(是否修改数据包的地址等)进行处理。

下面实验下看看: 环境说明:vmware下两台虚拟机,虚拟机中的网关地址为192.168.255.2,宿主机的vm8网卡地址为192.168.255.1 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.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改为131,客户端收到包之后,直接将包丢弃) 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.通信详细流程(我想了好久,只有以下这种说法能说通) 第一个阶段:公网客户端1.3去往255.131:166,查找自身路由,将包发送给255.1,然后再由255.1转发给255.131:166,131发现PREROUTING链具有规则,于是将目的地址131:166转换成129:21端口(DNAT),经过FORWARD链(默认允许通过),经过POSTROUTING链,将源IP修改为192.168.255.131(SNAT)。发往129. 第二个阶段:129处理完封包请求,将包回传给131。此时源IP为192.168.255.129,目的IP为:192.168.255.131. 第三阶段:131上收到此包请求,经由PREROUTING链(没有匹配),发现目的IP是本机的,再交给INPUT链,再交给上层应用,发现有客户端正在访问该地址,于是将目的地址改为客户端IP,再经过NAT的OUTPUT链(允许通过),再经过filter表的OUTPUT链(通过),通过POSTROUTING链,将源IP192.168.255.129修改为192.168.255.131(SNAT),将包回传给255.1.最终到达客户端1.3

8.一些实验数据 A.我在131上配置PREROUTING链,宿主机上访问192.168.255.131:166,129上没有任何数据过来

B.继续在131上增加配置POSTROUTING链,宿主机上再次访问,129上有数据了,这次我们加上wireshark一起看,131到达129上,但是129将数据返回给了131,认为源IP是255网段,POSTROUTING链生效,将源IP129修改为131,又返回给了255.1(这里宿主机和虚拟机是一个网段,即192.168.255.0/24,将客户端看成了192.168.255.1了,所以才会出现这种情况,而且最后还可以成功访问192.168.255.131:166)。