如何强制Linux使用一个网络连接而不是另一个?

如何强制Linux使用一个网络连接而不是另一个?

我已通过 USB 将启用了热点的 iPhone 连接到我的 ubuntu 机器。

根据网络活动的类型(例如浏览与 ssh),我想在网络连接之间切换(USB 有线与 LAN)。

是否有一个命令可以让我即时切换?

编辑:我正在寻找一个更简单的解决方案,只需一个无需拔出电缆即可替换的解决方案。

我的会话是分开的。这实际上是——嘿,我必须查看我的个人电子邮件,但我不想在我的公司服务器上这样做。所以,我正在寻找这样的解决方案

答案1

通常当我遇到这种情况时,我会使用静态路由来划分流量。这取决于您是否知道要连接的站点。但可以很容易地将其制作成可在需要时执行的脚本,并且更改不会改变。

这里的技巧是确定哪个接口应该是默认路由,然后为要采用另一条路径的目的地添加静态路由。我使用知识产权这个命令非常简单。

ip route 通过 192.168.10.1 添加 1.3.3.7/32

ip route 通过 192.168.10.1 添加 1.4.4.0/24

一个更先进、更持久的解决方案是iptables,这也允许您使用更细粒度的规则。请查看指南,我不会做你要求的事情,但它包含了如何使用 iptables 进行多网关平衡的基础知识。

答案2

用户空间不应能够选择其使用的路由。如果您只想使用一个路由进行 SSH 流量,另一个路由进行 HTTP 流量,请执行以下操作。请注意,使用以下方法是因为我们正在基于第 4 层目标地址进行路由。如果仅基于 IP,您只需添加额外的路由即可。

不要忘记根据需要替换 IP 地址、端口号和接口名称。我有 udev 规则,可以根据 MA​​C 地址重命名到 iPhone 的链接。您可能不会这样做,它可能会显示为另一个 eth* 设备。只要表和标记号与现在一样一致,就可以更改它们。

  1. 创建路由表每个链接都有一个默认网关。

    ip route add 172.20.10.0/24 dev iphone0 table 1234
    ip route add default via 172.20.10.1 dev iphone0 table 1234
    
    ip route add 192.0.2.0/24 dev eth0 table 4321
    ip route add default via 192.0.2.1 dev eth0 table 4321
    
  2. 由于 IP 路由规则仅,IP 层,使用 iptables 标记要发往哪个链接的流量。注意它是如何预路由

    iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2
    
  3. 创建路由规则以处理多个默认网关的情况。这些必须放在首位,因为它们会强制流量从其来源的同一接口返回,而不是从另一个接口返回(例如,如果您更改了 SSH 流量应使用的接口)。

    ip rule add from 172.20.10.2 table 1234 priority 1000
    ip rule add from 192.0.2.2 table 4321 priority 1001
    
  4. (可选,除非一个子网上的流量无法由另一个子网上的网关路由 - 例如,或许RFC 1918 流量)创建路由规则以强制到您直接连接的子网的流量通过适当的接口,而不管您指定用于特定流量类型的链接是什么。

    ip rule add to 172.20.10.0/24 table 1234 pref 1002
    ip rule add to 192.0.2.0/24 table 4321 pref 1003
    
  5. 创建路由规则

    ip rule add fwmark 1 table 1234 pref 1004
    ip rule add fwmark 2 table 4321 pref 1005
    
  6. 为所有其他流量设置默认网关。

    ip route add default via 192.0.2.1 dev eth0 # implicit "table main" here
    

至于动态更改使用的连接,官方存储库中不应该有命令(如果有的话)。您必须编写一个脚本,该脚本只会从 RPDB 读取现有规则,计算“相反”表,删除旧规则,并为标记流量制定使用另一个表的规则。例如:

#! /bin/sh

case $1 in
  ssh)  PREF=1004
  http) PREF=1005
  *)    echo "Unknown." 1>&2; exit 1
esac

TABLE=`ip rule list | grep ^$PREF: | awk '{print $NF}' | rev`
ip rule del pref $PREF
ip rule add fwmark 1 table $TABLE pref $PREF

这里,上面的桌号选择很重要,因为我使用了一个廉价的技巧来“切换”桌号。

由于我手边没有所需的东西,因此没有进行测试。

上述内容可以推广到具有两个链接和不同寻址方案的其他情况。

此外,如果您使用的是 OpenSSH,它有一个标志来指定要绑定到的地址。-b由于上面的设置规则是根据源地址进行路由的,因此您只需执行或其他地址来选择要采用的路由。我不知道任何主流浏览器都允许用户设置绑定地址。ssh -b insert_iphone_address_here [email protected]

相关内容