我遵循本教程以确保响应沿着发起连接的相同接口发送回来。
https://osric.com/chris/accidental-developer/2019/03/linux-policy-based-routing/
它是使用这些 iptables 规则完成的:
sudo iptables -A PREROUTING -t mangle -i eth1 -j MARK --set-mark 1
sudo iptables -A PREROUTING -t mangle -i eth1 -j CONNMARK --save-mark
sudo iptables -A OUTPUT -t mangle -j CONNMARK --restore-mark
如果在 INPUT 链上设置了标记,为什么这不起作用?
另外,有没有办法只使用 CONNMARK,或者必须先制作第一个 MARK,然后将其从数据包复制到连接?
我正在使用第二个连接 eth1 通过静态 IP 提供对 SSH 守护程序的访问。在我遇到上述链接之前,默认路由设置为 eth0 上的网关。我尝试通过tcpdump
对两个接口分别调用 来调试 ssh 连接尝试,我可以看到 eth1 上的传入 SSH 连接尝试,但我看不到 eth0 上的任何返回数据包。我没有打开防火墙,也没有 iptables 条目。如果表被丢弃在某个地方,知道为什么会这样吗?我该如何调试这种情况?谢谢。
经过大量谷歌搜索后,似乎“rp_filter”最有可能是罪魁祸首,如果是这样,我可以使用“log_martians”来调试它: https://www.theurbanpenguin.com/rp_filter-and-lpic-3-linux-security/
这可能还请解释为什么 iptables 规则需要在 PREROUTING 中而不是 INPUT 中。也许由于 rp_filter 而导致的数据包丢弃是在 PREROUTING 之后发生的?