iptables学习笔记7-问题思考

背景

我自己在学习 iptables 的时候,有 2 个问题困扰着我
1、snat 为什么要在 postrouting 链上进行转换?只要有 nat 表的链都可以啊,为什么呢?
2、dnat 为什么要在 prerouting 链上进行转换?只要有 nat 表的链都可以啊,为什么呢?

本篇主要用于思考这 2 个问题。

SNAT和DNAT说明

snat 源地址转换,在 postrouting 链上操作
dnat 目的地址转换,在 prerouting 链上操作

为什么要在 postroutingprerouting 链上操作??
我们以该系列第一篇文章终极流量流向图 为背景来展开说明
在这里插入图片描述
1、我们的目的是 snatdnat ,所以流量走最下面那条链路效率是最高的(prerouting --> forward --> postrouting),没必要还去 input 或者 output 链绕一圈。
2、要进行地址转换,必须需要 nat 表。

结合上面2个条件,我们可以把链确认在 preroutingpostrouting 之间。接着再往下看。

为什么 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

本篇文章纯属于个人思考,如果有其它想法,欢迎指出或者留言,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值