双网络连接


9

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

两者都独立工作。

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

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

Answers:


11

有多种可能性,具体取决于您要如何决定将哪些数据包传送到何处。他们中的大多数将需要对Linux中TCP / IP网络的工作方式有一些了解。做复杂的事情,您需要了解的主要工具是iptables(Ubuntu:iptables 安装iptables)和iproute2(ip命令)(Ubuntu:iproute 安装iprouteiproute-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

对于更复杂的要求,您需要开始使用iptablesip route。例如,以下命令设置特殊的路由表,以使所有标记为1的数据包都通过eth0,所有标记为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

现在,您可以使用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

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


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

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


@贾斯汀:这不是我有很多经验的东西,所以请提供有用的反馈,哪些无效,您不了解的内容,等等
。– Gilles'所以

1
我要添加两个内容:首先,它在pp0上以eth0的源地址发送流量。您可以使用:更改它iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip,其中ppp_ip该适配器的IP地址。其次,您需要关闭的严格rp_filter设置/proc/sys/net/ipv4/config/ppp0/rp_filter。它确实当设置为放松模式,这是2工作
Karalga
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.