重大更新

重大更新

我正在尝试在我的 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 移动。有用!但有一些结论:

  1. 带有 iputils-s20150815 的 Ubuntu 16.10 不会将数据包转发到ip rules 指定的路由表,或者我做错了。ping -I enp0s3 8.8.8.8通过默认路由发送数据包。
  2. pingUbuntu 16.10 上的 iputils-s20150815 实用程序的参数存在一些问题-I,或者我做错了。例如:ping -I 10.0.2.15 8.8.8.8返回ping: unknown iface 10.0.2.15
  3. Debian 8.7 上的 iputils-s20121221 中的 ping 实用程序尝试解析来自不同网络或我做错了

请问有人能告诉我我错在哪里吗?

相关内容