我经常使用一些公共网络的 Wi-Fi,这些网络不允许使用某些协议(例如 torrent 或 IRC - 下文我将只讨论 IRC)。如果我想使用其中一种协议,我必须使用手机的 3G 连接(通过界面usb0
)。
我希望保持与 Wi-Fi 的连接以进行网络导航(因此使用经典界面),但对于某些软件(通常仅适用于 weechat,一个 CLI IRC 客户端),wlan0
使用另一个界面(此处)。usb0
因此我有两个(相关的)问题:
- 如何同时连接两个接口而不造成混乱?
- 如何配置一个软件使用一个接口,另一个软件使用另一个接口?由于 weechat 是一个 CLI 软件,也许我只需要声明一个特定的环境变量;但如何确保 Firefox 不会使用
usb0
而不是wlan0
?
答案1
最简单的解决方案是拥有两个单独的路由表;其中一个(wlan0
在您的情况下)将是默认表,而我们可以使用一个巧妙的技巧来强制特定的应用程序使用非默认表。
首先,创建两个表(用您能理解的名称替换 NAME1,IP1、DEV1 等也一样):
echo 201 NAME2 >> /etc/iproute2/rt_tables
向每个路由表添加一个网关(如果需要):
ip route add NET1 dev DEV1 src SRC1 table main
ip route add NET2 dev DEV2 src SRC2 table NAME2
然后是默认路由:
ip route add default via IP1 table main
ip route add default via IP2 table NAME2
然后根据源地址选择路由表的规则:
ip rule add from IP1 table main
ip rule add from IP2 table NAME2
现在我们需要强制weechat
使用 IP2。我们通过构建新的绑定模块。这样做很简单,参考资料中有简单的说明。编译模块并放入后/usr/lib
,发出命令:
BIND_ADDR=IP2 LD_PRELOAD=/usr/lib/bind.so weechat
这样就大功告成了。这样做的好处是可以轻松编写脚本,并且可以根据需要在任意数量的应用程序中重复执行。
答案2
如果您定义了两个子网,例如:
- 192.168.1.x / 255.255.255.0 -
wlan0
- 192.168.2.x / 255.255.255.0 -
usb0
如果您仅为 定义网关wlan0
,则除直接寻址到 192.168.2.x 之外的所有网络流量都会通过wlan0
。
您可以通过接口将网络流量路由到特定 IP 地址usb0
。您还可以在 Linux 中通过特定接口为某个进程路由流量。