我的configuration:
# ip route sh zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1 yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146 xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47 169.254.0.0/16 dev eth3 scope link metric 1002 169.254.0.0/16 dev eth4 scope link metric 1003 169.254.0.0/16 dev eth1 scope link metric 1004 default via xxx.xxx.xxx.1 dev eth4
# ip rule sh 0: from all lookup local 217: from xxx.xxx.xx9.47 lookup table1 219: from yyy.yyy.yyy.146 lookup table2 32766: from all lookup main 32767: from all lookup default
# ip ro sh table table2 zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1 yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146 default via yyy.yyy.yyy.1 dev eth1
# ip ro sh table table1 zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1 xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47 default via xxx.xxx.xx8.1 dev eth4
iptables -t nat -L POSTROUTING MASQUERADE all -- * eth4 0.0.0.0/0 0.0.0.0/0 MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
rp_filter设置为0(用2尝试,同样的事情)
当我尝试从互联网上达到xxx.xxx.xx9.47或yyy.yyy.yyy.146时,他们使用这个configuration完美工作。 从lan(zzz.zzz.zzz.0 / 24)networking工作完美,stream量通过默认路由出去。
我在zzz.zzz.zzz.0 / 24 lan中把一个端口转发给了一台电脑
# iptables -t nat -L PREROUTING -nv DNAT tcp -- eth4 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb DNAT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb
从互联网我只能通过使用xxx.xxx.xx9.47,从默认路由的IP到端口aa zzz.zzz.zzz.3。 我从yyy.yyy.yyy.146获得连接失败,这不是默认路由。 tcpdump的eth1只显示传入的stream量,如果我tcpdump的默认路由接口(这种情况下,eth4)我看到数据包试图离开接口与源ip yyy.yyy.yyy.146女巫当然不起作用
如果我将默认路由更改为eth1,则会发生完全相反的情况。 我在端口aa上得到了yyy.yyy.yyy.146的响应,并且从xxx.xxx.xx9.47连接失败了。tcpdump eth1当我试图访问xxx时,我看到数据包试图在eth1上留下xxx.xxx.xx9.47 .xxx.xx9.47在一个端口上
用snat改变伪装#iptables # iptables -t nat -L POSTROUTING SNAT all -- * eth1 0.0.0.0/0 0.0.0.0/0 to:yyy.yyy.yyy.146 SNAT all -- * eth4 0.0.0.0/0 0.0.0.0/0 to:xxx.xxx.xx9.47
仍然tcpdump默认路由显示响应包源yyy.yyy.yyy.146离开eth4所以.. snat或伪装工作,contrack工程。 我真的不明白,为什么它只试图只对默认接口做出响应,即使源IP是来自另一个接口…以及如何在一个接口上与另一个接口上的IP进行通信。 操作系统是centos 6.8。
当数据包通过接口X进入,并由同一台机器立即响应时,基于源的路由规则可以捕获响应,因为其源IP地址必须与规则匹配。
当这些数据包随后通过接口Y转发到另一个IP时,通信的第一部分将工作。 但是,一旦第一个响应数据包从这个其他IP到达,它就会进入具有自己的源IP地址的路由规则parsing器,而不是这个路由器的。 然后,它将丢失基于源的路由规则,而是匹配默认的查找,像往常一样,这将是基于目的地的。
你需要做的是将数据包标记到接口X上,这个标记在转发过程中保持不变,然后在路由规则中匹配这个标记,这样就使用了一个不同的输出路由表。
谢谢你的解释。 我认为它需要做标记数据包。
我想通过使用mangle # iptables -t mangle -L PREROUTING -nv CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK restore MARK all -- eth4 * 0.0.0.0/0 0.0.0.0/0 MARK set 0xc8 MARK all -- eth1 * 0.0.0.0/0 0.0.0.0/0 MARK set 0xd3 CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK save基本上我标记每个接口上的传入连接和在追踪的连接上恢复标记。 所以标记为eth1的连接总是通过规则fwmark 200(0xc8)进入规则fwmark 211(0xd3)和eth4,
再次感谢 :)