我正在尝试在我的 ubuntu 机器上配置基于源的路由。作为最简单的例子,我正在尝试配置我机器上唯一的一个接口。所有配置都取自此处:https://www.thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System
路由
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
ip 路由显示表 rtgate
default via 10.0.2.2 dev enp0s3
10.0.2.0/24 dev enp0s3 scope link src 10.0.2.15
ip 规则
0: from all lookup local
32764: from all to 10.0.2.15 lookup rtgate
32765: from 10.0.2.15 lookup rtgate
32766: from all lookup main
32767: from all lookup default
但是当我尝试使用 8.8.8.8 时,我总是收到“网络不可达”消息:ping 8.8.8.8
connect: Network is unreachable
ping -I enp0s3 8.8.8.8
ping: sendmsg: Network is unreachable
ping: sendmsg: Network is unreachable
我还尝试将虚假/不存在的(10.0.2.16)网关添加到全局网关中,但收到“目标主机无法访问”消息。似乎来自 10.0.2.15 的数据包未转发到 10.0.2.2,数据包只是转发到默认网关。
ip route flush cache
没有帮助。有人知道吗?
重大更新
Ubuntu
今天早上我继续我的小调查。一开始我重新配置了我的 ubuntu 机器:添加了另一个带有默认网关的接口。
root@metalmachine:~# ip route
default via 10.0.4.2 dev enp0s9
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
10.0.4.0/24 dev enp0s9 proto kernel scope link src 10.0.4.15
目标仍然相同:为 enp0s3 配置基于源的路由。
root@metalmachine:~# ip route show table rtgate
default via 10.0.2.2 dev enp0s3
root@metalmachine:~# ip rule
0: from all lookup local
32765: from 10.0.2.15 lookup rtgate
32766: from all lookup main
32767: from all lookup default
是的。发生了同样的问题。当我运行 时ping -I enp0s3 8.8.8.8
,ICMP 响应成功来自 8.8.8.8但它们通过 enp0s9 传来。tcpdump -i enp0s3 -n
仍然安静,当我关闭 enp0s9 时,响应就停止了。
Debian
好的,我尝试在 Debian 8.7 上配置相同的功能。
root@metalmachine:~# ip route
default via 10.0.3.2 dev eth1
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.0.3.0/24 dev eth1 proto kernel scope link src 10.0.3.15
root@metalmachine:~# ip route show table backup
default via 10.0.2.2 dev eth0
root@metalmachine:~# ip rule
0: from all lookup local
32765: from 10.0.2.15 lookup backup
32766: from all lookup main
32767: from all lookup default
这就是我跑步得到的tcpdump -i eth0 -n &
:
root@metalmachine:~# ping -I eth0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.0.2.15 eth0: 56(84) bytes of data.
11:36:34.432372 ARP, Request who-has 8.8.8.8 tell 10.0.2.15, length 28
11:36:35.430668 ARP, Request who-has 8.8.8.8 tell 10.0.2.15, length 28
^C
root@metalmachine:~# arp -an
? (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0
? (8.8.8.8) at <incomplete> on eth0
? (10.0.3.2) at 52:54:00:12:35:02 [ether] on eth1
好吧,看起来系统尝试解析 8.8.8.8 的 ARP,无论 8.8.8.8 位于不同的网络。无论所有接口上是否禁用代理 ARP:
root@metalmachine:~# cat /proc/sys/net/ipv4/conf/*/proxy_arp
0
0
0
0
0
但当我尝试时ping -I 10.0.2.15 8.8.8.8
:
PING 8.8.8.8 (8.8.8.8) from 10.0.2.15 : 56(84) bytes of data.
11:54:58.434966 IP 10.0.2.15 > 8.8.8.8: ICMP echo request, id 1430, seq 1, length 64
10:54:58.446248 IP 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 1430, seq 1, length 64
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=11.4 ms
在观察了 eth0 的计数器后,我确信数据包通过 eth0 移动。有用!但有一些结论:
- 带有 iputils-s20150815 的 Ubuntu 16.10 不会将数据包转发到
ip rule
s 指定的路由表,或者我做错了。ping -I enp0s3 8.8.8.8
通过默认路由发送数据包。 ping
Ubuntu 16.10 上的 iputils-s20150815 实用程序的参数存在一些问题-I
,或者我做错了。例如:ping -I 10.0.2.15 8.8.8.8
返回ping: unknown iface 10.0.2.15
- Debian 8.7 上的 iputils-s20121221 中的 ping 实用程序尝试解析来自不同网络或我做错了。
请问有人能告诉我我错在哪里吗?