我有两个网络接口 eth0 和 usb0。当 eth0 断开连接且仅 usb0 连接时,一切正常。
当两者连接时,指定 usb0 接口的地址时 ping -I 或 ssh -b 不起作用。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.22.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 1 0 0 usb0
0.0.0.0 172.22.2.1 0.0.0.0 UG 0 0 0 eth0
我错过了什么?
ping -I 192.168.2.10 216.58.217.142
PING 216.58.217.142 (216.58.217.142) from 192.168.2.10 : 56(84) bytes of data.
^C
--- 216.58.217.142 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5404ms
另外,我没有 root 权限。
回答完下面的几个问题后,我意识到当只有 usb0 开启时,默认网关是 usb0 上的 ip。当两个都开启时,默认网关是 eth0 上的 ip。有没有办法在不使用 root 的情况下更改此行为?
答案1
您需要添加一个 IP 规则(基于源 IP 地址的路由)和一个单独的路由表。以下命令可以实现此目的:
$ sudo ip rule from 192.168.2.10 table 100
$ sudo ip route add default via 192.168.2.129 dev usb0 table 100
此后,您的ping -I
命令应该可以正常工作。请注意,table 100
可以为 分配任何未使用的数字。这只是一个任意数字,在上面显示的两个命令中应该相同。这两个命令告诉内核使用 IP192.168.2.129
作为所有源 IP 为 的数据包的默认网关192.168.2.10
。
其它数据包将使用主表的默认网关172.22.2.1
。
您可能需要了解 Linux 高级路由文档。
请注意,这些命令需要 root 权限!