背景
我自己在学习 iptables 的时候,有 2 个问题困扰着我
1、snat 为什么要在 postrouting 链上进行转换?只要有 nat 表的链都可以啊,为什么呢?
2、dnat 为什么要在 prerouting 链上进行转换?只要有 nat 表的链都可以啊,为什么呢?
本篇主要用于思考这 2 个问题。
SNAT和DNAT说明
snat: 源地址转换,在 postrouting 链上操作
dnat: 目的地址转换,在 prerouting 链上操作
为什么要在 postrouting 和 prerouting 链上操作??
我们以该系列第一篇文章的 终极流量流向图 为背景来展开说明

1、我们的目的是 snat 和 dnat ,所以流量走最下面那条链路效率是最高的(prerouting --> forward --> postrouting),没必要还去 input 或者 output 链绕一圈。
2、要进行地址转换,必须需要 nat 表。
结合上面2个条件,我们可以把链确认在 prerouting 和 postrouting 之间。接着再往下看。
为什么 snat 要在 postrouting 链上??
为什么 dnat 要在 prerouting 链上??
我们先来回顾一下 routing 作用:判断数据包的目的地址是否是本机地址?如果是,则进入 input 链,再到应用程序;如果不是,则进入 forward 链,再到 postrouting。
snat 的目的是源地址转换,将数据包的 源地址 转换为 本机出口地址。如果在 prerouting 进行 snat,那针对源地址的限速、限流、禁止访问等等规则就不生效了,因为此时数据包的源地址正是本机地址。所以源地址转换最好在出口进行操纵,也就是 postrouting 链。
dnat 的目的是目的地址转换,将数据包的 目的地址 转换为 其它服务器地址 。
dnat 场景下有个背景是需要我们了解的,客户端其实是不知道 iptables 服务器后面还有其它服务,客户端以为它要请求的服务地址就是 iptales 服务器地址,所以在客户端发来的数据包中,目的地址为 iptables 服务器地址。(其实和反向代理差不多,客户端不知道他请求的其实是一个网关服务)
如果此时不在 prerouting 链中进行 目的地址转换 ,那这个数据包经过 route 判断时就会顺势进入 input 链,再到用户层,而用户层根本就没有程序来处理这个数据包。所以 dnat 是在 prerouting 链上进行操作。
小结
snat: 考虑规则生效,所以在 postrouting 链
dnat:考虑 route 判断,所以在 prerouting 链
本篇文章纯属于个人思考,如果有其它想法,欢迎指出或者留言,谢谢!
1223

被折叠的 条评论
为什么被折叠?



