我在 Linux 客户端上针对具有 DNAT 和多个网关的场景设置 iptables 规则和路由时遇到问题:
我们有两个通往互联网的网关。第一个网关有固定 IP,第二个网关提供更好的带宽。两个网关都对来自我们私有网络的传出流量进行 SNAT。
在具有固定 IP 的第一个网关上,我为端口 22 设置了端口转发,以便所有 SSH 流量都转发到我的 Linux 客户端。
效果很好。
但只有当我使用第一个网关作为 Linux 客户端上的默认路由时才可以。
当我将 Linux 客户端切换到第二个网关作为默认路由时,传入的 SSH 连接不再起作用。
如何设置 Linux 客户端以将与传入 SSH 连接相关的回复数据包发送到第一个网关,但将所有其他流量发送到第二个网关?
答案1
我找到了解决方案接受的答案针对这个问题“根据服务将返回流量路由到正确的网关”。
我已经在我的Linux客户端上实现了这些规则:
# Default route is second gateway:
ip route add default via 10.0.0.2
# Create a routing table "FIXED" using our fixed IP gateway
echo "200 FIXED" >>/etc/iproute2/rt_tables
ip route add default table FIXED via 10.0.0.1
# Create a rule to route any packets marked "42" through FIXED:
ip rule add fwmark 42 table FIXED
# Finally, the iptables rule:
# Any outgoing traffic from source port 22 of my Linux client
# that has a destination inside our private network (10.0.0.0/24)
# is marked "42" (and therefore goes to FIXED):
iptables -t mangle -A OUTPUT ! -d 10.0.0.0/24 \
-p tcp -m tcp --sport 22 \
-j MARK --set-mark 42