在 Ubuntu 14.04 x86-64 上,我有一个无线宽带连接和一个 USB 网络共享连接(它是 4G,不是同一个无线连接):
路线-n 内核 IP 路由表 目标网关 Genmask 标志 指标参考使用 Iface 0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 usb0 192.168.0.0 0.0.0.0 255.255.255.0 U 9 0 0 WLAN1 192.168.42.0 0.0.0.0 255.255.255.0 U 1 0 0 usb0
我还有以下内容:
是否配置 ... usb0 链路封装:以太网 HWaddr 02:36:2c:04:05:7c inet 地址:192.168.42.248 广播:192.168.42.255 掩码:255.255.255.0 inet6 地址:fe80::36:2cff:fe04:57c/64 范围:链接 上行广播运行多播 MTU:1500 度量:1 RX 数据包:3367 错误:1 丢弃:0 超限:0 帧:1 TX 数据包:3669 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:1000 RX 字节:2434689 (2.4 MB) TX 字节:637911 (637.9 KB) wlan1 链路封装:以太网 HWaddr 14:cc:20:75:e1:8d inet 地址:192.168.0.4 Bcast:192.168.0.255 掩码:255.255.255.0 inet6 地址:fe80::16cc:20ff:fe75:e18d/64 范围:链接 上行广播运行多播 MTU:1500 度量:1 RX 数据包:3806 错误:0 丢弃:0 超限:0 帧:0 TX 数据包:4110 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:1000 RX 字节:2283536 (2.2 MB) TX 字节:583794 (583.7 KB)
一切看起来都按预期工作(即两个网络连接都已启动,我的机器有 2 个 IP,...)。
然后我想使用绑定 垫片强制一个连接(或另一个连接)上的进程,并且只有当我指定默认连接/网关。
以下工作(请注意,这是在绑定的 USB - 4G 上):
BIND_ADDR="192.168.42.248" LD_PRELOAD=./bind.so chromium-浏览器
而这不行(我的宽带):
BIND_ADDR="192.168.0.4" LD_PRELOAD=./bind.so chromium-浏览器
当然,当我拔下 USB 电话时,wlan0神奇地又开始工作了......
我做错了什么?有什么想法吗?
答案1
绑定不起作用的原因与绑定无关,这也是我使用的技巧,并且与您在 NIC 上只有一个默认网关有关,usb0
而您应该在任一 NIC 上都有一个默认网关,否则到 WAN 站点的连接wlan0
将不会被路由。
Linux 允许在 的规则下存在多个网关(每个接口一个,无论是否是虚拟的)policy-based routing
。您需要做的是拥有两个单独的路由表,一个用于usb0
,一个用于wlan0
,以及一条规则告诉内核使用哪一个;然后,binding
任一接口的应用程序都将允许您访问 WAN 站点。
您可以按如下方式处理两个路由表:首先,创建两个表(用合理的名称替换和,例如 IP1、DEV1 等):
echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables
向每个路由表添加一个网关(如果需要):
ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>
然后是默认路由:
ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>
然后根据源地址选择路由表的规则:
ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>
现在您可以将应用程序绑定到任一接口。