一台 Linux 服务器、一个网络、两个网关 - 服务器可以处理来自两个网关的连接吗?

一台 Linux 服务器、一个网络、两个网关 - 服务器可以处理来自两个网关的连接吗?

我们有一台 OpenSUSE 服务器,上面运行着一项服务。网络上有两个网关。其中一个网关被设置为服务器的默认网关。在这种情况下,服务器只能接受通过此网关的连接。但它无法为来自另一个网关的连接提供服务(据我所知,它会将响应发送回默认网关,而不是发送这些请求的网关)。

我们是否可以设置服务器以便能够为来自两个网关的连接提供服务?(我听说过“基于源的路由”这个词,但我不确定是否是这样)。

答案1

这是可能的,而且设置起来相当容易。我们将使用iproute2iptablesMARK 和 CONNMARK 就是这样的。

我们的想法是,我们将标记从第二个网关(而不是服务器正在使用的默认网关)进入的数据包,并且在回复时我们将这些数据包从同一个接口路由出去。

假设第二个网关的IP地址为2.2.2.2,连接网关的服务器上的接口为eth2。

首先让我们为第二个网关设置一个路由表(我们使用表 20):

# ip route add default via 2.2.2.2 table 20

并设置一条规则,标有 200 的数据包将使用表 20 进行路由:

# ip rule add fwmark 200 table 20

您可以使用以下方式进行验证:

# ip route list table 20
# ip rule list

现在使用iptables我们用标记 200 来标记从第二个网关(在接口 eth2 中)传入的数据包:

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 如何工作的更多解释,请参阅这里

如果您的 2 个网关位于同一网络上,并且您的服务器仅使用一个接口连接它们两个,那么上面的 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地址。

答案2

如果你的路由表没有问题将响应发送到正确的网关

正如您正确指出的那样,您应该配置基于源的路由,此链接应该是建立该主题知识库的一个良好起点。

相关内容