配置路由以对出站流量使用与入站流量相同的接口

配置路由以对出站流量使用与入站流量相同的接口

我有一个 Linux 机器,有两个接口:一个用于数据,另一个用于管理。如果两个接口都在同一个网络上,我会为两个接口添加路由。

想象一下路由表是:

192.168.132.0 255.255.255.0 eth0
192.168.132.0 255.255.255.0 eth1 ( management interface)

问题是,即使与管理 IP(eth1)发起连接,返回流量仍会在 eth0 上。

如何确保连接上的返回流量使用与转发流量相同的接口?

答案1

您可以使用 iptables/netfilter 与 conntrack 和 (conn-)mark 模块以及策略路由的组合来实现此目的。

在 iptables MANGLE 表中:

-A PREROUTING -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
-A 输出 -m 状态 --状态 ESTABLISHED,RELATED -j CONNMARK --restore-mark
-A PREROUTING -i eth0 -m state --state NEW -j CONNMARK --set-mark 1
-A PREROUTING -i eth1 -m state --state NEW -j CONNMARK --set-mark 2
-A PREROUTING -m connmark --mark 1 -j MARK --set-mark 1
-A PREROUTING -m connmark --mark 2 -j MARK --set-mark 2
-A PREROUTING -m state --state NEW -m connmark !--mark 0 -j CONNMARK --save-mark

我假设您在 eth0 上有一个默认路由,因此我们只需要为通过 eth1 进入的那些数据包设置一条“魔术”路由。

使用 iproute2 包:

ip 规则添加 fwmark 2 表 eth1
ip route 通过 192.168.132.1 表 eth1 添加默认

这样做的目的是:iptables 将用“2”标记通过 eth1 进入的每个连接,因此该连接中的每个数据包都有一个标记,可以在 iptables 代码之外读取。然后添加一个策略路由,该策略路由通过路由表“eth1”路由每个标记为“2”的数据包,该路由表具有到路由器的默认路由,但通过 eth1 发送数据包。

瞧。

上述设置假设两个接口上的 IP 相同。如果两个接口上的 IP 不同,则可以通过仅在源 IP 上使用策略路由来简化设置(我假设 eth1 上的 IP 为 192.168.132.3):

从 192.168.132.3 表 eth1 添加 ip 规则
ip route 通过 192.168.132.3 表 eth1 添加默认

那么就不需要通过 iptables 进行连接标记了。

答案2

如果您试图将管理流量与其他流量分开,那么仅让管理流量离开服务器上的不同端口是无法实现这一点的。您还需要在流量离开服务器后将其分开 - 而让流量在同一子网上传输是无法实现这一点的。

因此,要分离流量,您确实需要使用单独的交换或 VLAN 将网络分成多个子网,并使用路由在不同的子网之间路由流量。然后,在您的服务器上,您将拥有一个单独的管理接口,该接口仅连接到管理子网。理想情况下,您也可以从仅连接到此子网的主机执行管理任务。

这将使您真正得到您想要的东西,并且配置和理解起来会更简单 - 尽管设置起来并不一定更便宜。我假设您有一个明确的业务案例来分离您的管理流量。

如果您想要做的只是将服务器上的管理任务限制到网络上的特定主机,那么您可以通过设置 iptables 来仅允许来自那些特定主机 IP 地址的管理类型流量(例如,通过 ssh 等端口标识)来更简单地实现此目的。

相关内容