我的 Ubuntu 10.10 盒子上有一个 USB 蜂窝调制解调器和一个家庭 LAN 连接。
两者独立工作。
我想知道如何同时连接两者,并能够指定哪个应用程序使用哪个设备连接到互联网。
有谁知道如何做到这一点?
答案1
有多种可能性,具体取决于您想要如何决定哪些数据包发送到何处。其中大多数需要了解 TCP/IP 网络在 Linux 中的工作原理。完成复杂事情时您必须了解的主要工具是iptables
(乌班图:iptables ) 和iproute2(ip
命令)(乌班图:ip路由 ,iproute 文档 )。
如果您可以完全区分目标 IP 地址,那就很简单:根据您的意愿路由 IP 地址。例如,以下命令将导致所有数据包均为 1.2.3。X和 1.2.4.2 通过 via ppp0
,其他数据包通过 via 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
对于更复杂的需求,您需要开始使用iptables
和ip route
。例如,以下命令设置特殊的路由表,以便所有标记为 1 的数据包从 via 发出eth0
,所有标记为 2 的数据包从 via 发出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 个连接互联网的网络接口。根据域名选择使用的和将软件绑定到不同的网络接口。
您需要安排在两个接口都连接时运行这些命令。我建议您编写一个名为 的脚本/etc/network/if-up.d/0justin-routes
来运行您想要的命令。每当网络接口启动时都会执行此脚本;由于其名称以 a 开头,0
它将在该过程的早期运行,在特定于应用程序的设置之前运行,该设置可能期望路由就位。/etc/network/if-down.d/
如果您还想在其中一个接口出现故障时执行某些操作,则存在对称性。 (所有关联的路由将自动被删除,当您希望某些数据包回退到另一个接口时,这可能会使它们滞留。)
ifup 脚本记录在interfaces(5) man page
。主要要知道的是,所启动或关闭的接口的名称位于环境变量中IFACE
。可以查看其他接口是否已经up if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
。