背景
我自己在学习 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
链
本篇文章纯属于个人思考,如果有其它想法,欢迎指出或者留言,谢谢!