双网络连接

Jus*_*der 9 linux networking routing iptables

我的 Ubuntu 10.10 机器上有一个 USB 蜂窝调制解调器和一个家庭 LAN 连接。

两者都独立工作。

我想知道如何同时连接两者,并能够指定哪个应用程序使用哪个设备连接到互联网。

有谁知道如何做到这一点?

Gil*_*il' 11

有几种可能性,这取决于您希望如何决定哪些数据包去哪里。他们中的大多数需要了解 TCP/IP 网络在 Linux 中的工作原理。做复杂事情你必须知道的主要工具是iptables(Ubuntu: iptables 安装iptables) 和iproute2 (ip命令) (Ubuntu: iproute 安装iproute, iproute-doc 安装 iproute-doc)。

如果您可以通过目标 IP 地址完全区分,这很简单:根据您的意愿路由 IP 地址。例如,下面的命令将导致 1.2.3 的所有数据包。x和 1.2.4.2 要通过ppp0,其他数据包要通过eth0

route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Run Code Online (Sandbox Code Playgroud)

对于更复杂的需求,您需要开始使用iptablesip route。例如,下面的命令设置特殊的路由表,以便所有标记为 1 的数据包通过 viaeth0和所有标记为 2 的数据包通过ppp0(除了用于localhost坚持环回接口的数据包)。

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Run Code Online (Sandbox Code Playgroud)

现在您可以使用iptables“破坏”传出数据包,添加一个标记来决定它们采用的路由。例如,以下是如何通过 发送所有传出 SMTP 流量(端口 25)eth0,以及proxy通过ppp0.

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Run Code Online (Sandbox Code Playgroud)

另请参阅连接到 Internet 的 2 个网络接口。根据域名选择一个使用将软件绑定到不同的网络接口


当两个接口都连接时,您需要安排这些命令运行。我建议您编写一个名为的脚本/etc/network/if-up.d/0justin-routes来运行您想要的命令。每当启动网络接口时,都会执行此脚本;因为它的名字以 a 开头,0它将在该过程的早期运行,在特定于应用程序的设置之前运行,该设置可能期望路由就位。/etc/network/if-down.d/如果您还想在其中一个接口出现故障时执行某些操作,则存在对称性。(所有关联的路由都将自动删除,当您希望它们回退到另一个接口时,这可能会使一些数据包搁浅。)

ifup 脚本记录在interfaces(5) man page. 要知道的主要事情是正在启动或关闭的接口的名称在环境变量中IFACE。您可以查看其他界面是否已启动if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …