在请求发出的同一接口上应答

在请求发出的同一接口上应答

首先,我知道这不是 IP 的本意。但和往常一样,这就是我需要它工作的方式。

我在一家安全公司工作。至少有 2 个网络接口。两个接口都应该有一个默认网关。一个接口是默认以太网接口,第二个是 3G 接口。两个接口都连接到互联网。可以采用不同的配置,因为一个接口是主接口,另一个是备用接口。或者以太网接口是本地 LAN(具有不同的子网、网关),3G 调制解调器是互联网连接。

我的主要问题是,如何让 Linux TCP/IP 堆栈在发出请求的同一接口上作出答复。

第二个问题是,我如何通过我选择的接口启动连接,而无需在不同的接口上使用不同的子网。

答案1

您可以根据源 IP 地址在 Linux 中设置路由。虽然在 Linux 中可以绑定到特定接口,但这种情况并不常见。基于源 IP 的路由将允许您为每个传出接口创建一个默认网关。由于处理请求的服务器套接字可以绑定到 IP,这将确保响应从它们进入的同一接口发出。(如果服务器正在监听通配符地址 ( 0.0.0.0),并且未绑定到特定接口,则您将无法使用此方法。使用 conntrack 模块和 iptables 标记仍然应该可以实现,但我不会在这里讨论这些)。

您可以通过创建另一个来实现路由表使用ip命令。这里的“10”是任意的。

# 10.0.0.1 = gateway for the secondary interface
# 10.0.0.10 = ip address for the secondary interface eth1

ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.10 table 10

如果你要绑定多个地址,或者有 dhcp,则可以在子网上创建规则库

ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.0/8 table 10

如果您确定服务器正在绑定到设备,则另一个具有更高度量的默认网关就足够了。

ip route add default via 10.0.0.1 dev eth1 metric 2

答案2

我不确定这是否符合您的一般期望。您当然可以通过将程序绑定到特定地址来控制计算机上运行的程序使用哪个网络接口。

但是,总的来说,我认为没有办法将传入的网络数据包与传出的数据包联系起来。你能做的最好的事情就是向系统提供类似“如果你尝试连接到此网络,请始终使用此接口”的指令。这可以通过系统路由表 ( iproute) 或iptables防火墙规则以各种方式完成。

如果这是出于安全目的,您是否考虑过使用在物理服务器上运行的虚拟机?您可以将一个虚拟机配置为只能访问一个接口,而将另一个虚拟机配置为只能访问另一个接口。由于虚拟机根本看不到另一个接口,因此它不可能响应来自错误网络的数据包。

你可能还应该看看这个 serverfault 问题介绍了如何控制从哪个接口发出 arp 请求。您还应该查看 rp_filter sysctl,可以将其设置为忽略出现在错误接口上的数据包。

相关内容