首先,我知道这不是IP的意图。 但像往常一样,这是我需要它的工作。
我为一家安全公司工作。 至less有2个networking接口。 两个接口都应该有一个默认网关。 一个接口是一个默认的以太网接口,第二个接口是一个3g接口。 都连接到互联网。 不同的configuration是可能的,因为在一个接口中是主要的,另一个是备份。 或者以太网接口是本地LAN(具有不同的子网,网关),并且3G调制解调器是互联网连接。
我的主要问题是,如何让Linux TCP / IP堆栈在请求来自同一个接口时回答。
第二个问题,我怎么能通过我select的接口来启动一个连接,而不用在不同的接口上使用不同的子网。
您可以根据源IP地址在Linux中设置路由。 尽pipe在Linux中绑定到一个特定的接口是可能的,但是却很less见。 基于源IP的路由将允许您为每个输出接口创build一个默认网关。 由于用于服务器请求的服务器套接字可以绑定到一个IP,所以这将确保响应是从它们所在的接口发出的。 (如果服务器正在监听通配符地址( 0.0.0.0 ),并且没有绑定到特定的接口,那么将不能使用这个方法。仍然应该可以使用conntrack模块和iptables标记,但是我不会在这里进入)。
您可以通过使用ip命令创build另一个路由表来完成此操作。 这里的'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,则可以在子网上创build规则
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
我不确定这是否可能在你想要的一般意义上。 您当然可以通过将您的计算机上运行的程序绑定到特定地址来控制哪个networking接口。
但是,一般来说,我不认为有办法将传入的networking数据包连接到传出数据包。 你所能做的最好的是按照'如果你试图连接到这个networking,总是使用这个接口'来向系统提供指令。 这可以通过系统路由表( iproute )或iptables防火墙规则以各种方式完成。
如果这是出于安全目的,是否考虑过使用物理服务器上运行的虚拟机? 您可以configuration一个虚拟机只能访问一个接口,而其他虚拟机只能访问另一个虚拟机。 由于VM根本无法看到其他接口,因此无法响应来自错误networking的数据包。
你也应该看看这个serverfault问题 ,它涵盖了如何控制arp请求发出的接口。 你也应该看看rp_filter的sysctl,它可以被设置为忽略出现在不正确的接口上的数据包。