我们有OpenSUSE服务器上运行的服务。 我们在networking上有两个网关。 其中一个网关被设置为服务器的默认网关。 在这种情况下,服务器可以只接受通过这个网关的连接。 但是它不能提供来自另一个网关的连接(据我所知,它将响应发送回默认网关,但不是这些请求来自的网关)。
我们可以设置服务器以便能够从两个网关提供连接吗? (我听说过“源代码路由”,但我不确定是否是这种情况)。
这是可能的,而且很容易设置。 我们将为此使用iproute2和iptables MARK和CONNMARK。
我们的想法是标记从第二个网关(不是服务器使用的默认网关)传入的数据包,并且在回复时我们将把这些数据包路由出相同的接口。
假设第二个网关的IP地址是2.2.2.2,连接到网关的服务器的接口是eth2。
首先让我们为第二个网关build立一个路由表(我们使用表20):
# ip route add default via 2.2.2.2 table 20
并设置一个规则,说200包标记将使用表20路由:
# ip rule add fwmark 200 table 20
您可以使用以下validation:
# ip route list table 20 # ip rule list
现在使用iptables,我们标记来自第二个网关(在接口eth2中)的数据包,标记为200:
1 # iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark 2 # iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT 3 # iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-mark 200 4 # iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
有关这些MARK和CONNMARK如何工作的更多解释,请参阅此处
如果你的两个网关在同一个networking上,而你的服务器只使用一个接口连接到它们,那么上面的iptables命令3就不能工作。 您可以使用另一个,基于这样的MAC地址:
# iptables -t mangle -A PREROUTING -m mac --mac-source AA:BB:CC:DD:EE:FF -j MARK --set-mark 200
当然,AA:BB:CC:DD:EE:FF是第二个网关的MAC地址。
如果你的路由表是好的,那么服务器必须把响应发送到正确的GW
正如您正确指出的那样,您应该configuration基于源代码的路由, 这个链接应该是一个很好的起点,可以为这个主题build立一个知识库。