iptables通常的只须要关注两个表,一个是nat表,一个是filter表,其余表暂时用不到,而后nat表里有三个链,filter表里有三个链,总结两个表,五个链linux
常见封包流程:
入站数据流向:数据包到达防火墙后首先被PREROUTING链处理(是否修改数据包地址等),而后进行路由选择(判断数据包发往何处),若是数据包的目标地址是防火墙本机(如:Internet用户访问网关的Web服务端口),那么内核将其传递给INPUT链进行处理(决定是否容许经过等)。服务器
转发数据流向:来自外界的数据包到达防火墙后首先被PREROUTTING链处理,而后再进行路由选择;若是数据包的目标地址是其余的外部地址(如局域网用户经过网关访问QQ服务器),则内核将其传递给FORWARD链进行处理(容许转发,拦截,丢弃),最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。tcp
出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网DNS服务时),首先被OUTPUT链处理,而后进行路由选择,再交给POSTROUTING链(是否修改数据包的地址等)进行处理。ide
下面实验下看看:
环境说明: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.service3d
2.开启131的网卡转发功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -pblog
3.131上设置容许255过来的网段进行地址假装,也就是129到达以后,能够用131为源地址进行"外网”的访问,(必需要这条配置,没有这条配置将源129改成131,客户端收到包以后,直接将包丢弃)
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -j MASQUERADEip
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)。