之前的文章:将Linux做成一个网关 文章中我们通过iptables的SNAT将IP的源地址修改成网关地址。下图展示了iptables 5钩子函数和两个常用的表nat和filter。其中
INPUT :过滤所有目标地址是本机的数据包
FORWARD :过滤所有路过本机的数据包
OUTPUT :过滤所有由本机产生的数据包
PREROUTING :可以在数据包到达时改变目标地址
POSTROUTING :在数据包离开时改变数据包的源地址。
我们通过SNAT规则将客户端源地址CIP替换成网关地址GIP,但大家有没有意识到一个问题,网络回包的目的地址是啥?由于出去的数据包源地址是网关地址,回来的数据包的目的地址当然也是网关地址GIP。但问题是:我们并没有设置DNAT规则,那么是如何将回来数据包的目的地址重新修改成CIP呢 ?
绿色:源地址,红色:目标地址
其实,无论是SNAT还是DNAT,他们都附带了一个反向操作。iptables会通过conntrack维护连接状态,这个连接状态非常简单就是维护一个Map映射,将一个连接转到另外一个连接并记录连接状态,下面是一个Demo。
tcp 6 6 CLOSE src="/c2021/img/data-img.jpg" data-src=172.18.0.4 dst=110.242.68.3 sport=51230 dport=80 src="/c2021/img/data-img.jpg" data-src=110.242.68.3 dst=172.17.79.163 sport=80 dport=51230 [ASSURED] mark=0 use=1
可以看到状态已经是CLOSE了, 源 172.18.0.4:51230 目标110.242.68.3:80 的这个连接,经过SNAT出去后,这个源地址会替换成GIP 172.17.79.163发送出去,发送的源端口就是51230,等到回来的包目的是172.17.79.163:51230 源是110.242.68.3:80 到达的时候,就可以执行DNAT(UNSANT) 将目的地址改成CIP,从而将数据包发送给客户端。
页面更新:2024-05-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号