大家好,欢迎来到IT知识分享网。
之前的文章:将Linux做成一个网关 文章中我们通过iptables的SNAT将IP的源地址修改成网关地址。下图展示了iptables 5钩子函数和两个常用的表nat和filter。其中
INPUT :过滤所有目标地址是本机的数据包
FORWARD :过滤所有路过本机的数据包
OUTPUT :过滤所有由本机产生的数据包
PREROUTING :可以在数据包到达时改变目标地址
POSTROUTING :在数据包离开时改变数据包的源地址。
![有个问题你可能忽略了:SNAT 怎么处理回来的包?插图1 有个问题你可能忽略了:SNAT 怎么处理回来的包?](https://yundeesoft.com/wp-content/uploads/2022/11/2022112316405970.jpg)
我们通过SNAT规则将客户端源地址CIP替换成网关地址GIP,但大家有没有意识到一个问题,网络回包的目的地址是啥?由于出去的数据包源地址是网关地址,回来的数据包的目的地址当然也是网关地址GIP。但问题是:我们并没有设置DNAT规则,那么是如何将回来数据包的目的地址重新修改成CIP呢 ?
![有个问题你可能忽略了:SNAT 怎么处理回来的包?插图3 有个问题你可能忽略了:SNAT 怎么处理回来的包?](https://yundeesoft.com/wp-content/uploads/2022/11/2022112316405970.jpg)
绿色:源地址,红色:目标地址
其实,无论是SNAT还是DNAT,他们都附带了一个反向操作。iptables会通过conntrack维护连接状态,这个连接状态非常简单就是维护一个Map映射,将一个连接转到另外一个连接并记录连接状态,下面是一个Demo。
tcp 6 6 CLOSE src=172.18.0.4 dst=110.242.68.3 sport=51230 dport=80 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,从而将数据包发送给客户端。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/164572.html