stream量离开不同的界面时,处理DNAT的正确方法是什么? 当发生这种情况时,似乎答复没有自动replace源地址,因为如果它出去的是同一个接口的话。
编辑 – SNAT不为我工作:
Chain PREROUTING (policy ACCEPT 386 packets, 23372 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT all -- * * 0.0.0.0/0 12.12.12.5 to:10.7.0.5 Chain POSTROUTING (policy ACCEPT 288 packets, 18672 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- * eth0 10.7.0.5 0.0.0.0/0 to:12.12.12.5 0 0 SNAT all -- * eth3 10.7.0.5 0.0.0.0/0 to:12.12.12.5 8 550 MASQUERADE all -- * eth0 172.16.14.0/30 0.0.0.0/0 0 0 MASQUERADE all -- * eth0 10.7.0.0/24 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 23 packets, 1572 bytes) pkts bytes target prot opt in out source destination
所以在上面的两台路由器都有相同的表格和相同的接口布局。 两台路由器上的eth0都是Internet连接,每台路由器上的eth1连接到同一个LAN(10.7.0 / 24)。 eth3将两台路由器相互连接。
发生了什么事是从互联网上的一个位置ping 12.12.12.5地址。 答复在路由器B通过eth0和出eth1与目的地nat正常工作。 答复是在Router A上inputeth1,然后通过路由器A上的eth0退出Internet。但是,源地址没有被覆盖,并且答复会将其发送回发送ping的设备,地址为10.7.0.5 *。
*是的,他们实际上是通过一个私人的IP来跨越20跳,并且不会在任何地方被压扁 – 真是太棒了)。
更多编辑:
好吧,显然,SNAT(至less从iptables手册中看来)只有在有状态的情况下才匹配。 所以我需要无状态的NAT。 这可以使用iproute2来完成,但是根据http://linux-ip.net/html/nat-dnat.html#ex-nat-dnat-full ,也可以通过使用带有SNAT的–to-destination进行模拟iptables的。 但是,我的Ubuntu 10.04只是说未知选项--to-destination …
就我所知,只要出站响应数据包由路由/ DNAT传入请求的相同路由器路由,就会发生地址重写行为。 如果高可用性路由器池中的其他N + 1路由器正在处理出站响应数据包,则不会在Netfilter状态数据库中“查看”该连接。
这听起来像你想要一个高度可用的Netfilter路由器共享NAT状态机信息 。 这篇文章中提到的ct_sync工具已经大部分被放弃了,但conntrack工具的conntrackd工具已经被开发来做一些和ct_sync一样的工作。
如果你打算进行有状态数据包过滤(或者NAT,它实际上只是状态数据包过滤的超集),那么你将需要一种方法来分配状态数据库(或者,也可以使用无状态过滤networking,并在每个主机上进行状态过滤)。
随着networkingstream量,这变得越来越普遍。 有没有你关心的特殊情况? 我没有SNAT反映我所有的DNAT。
我关心的场景
据我所知,经验法则是在合理可能的情况下避免这种情况。 但是,随着现代实现和dynamic路由,我相信这个观点正在变得更加陈旧。