我将尽力使这个解释尽可能简单,这让我陷入困境,因为我已经排除了我能想到的所有选项。
有两位主持人,我们称他们为 Alice 和 Bob。
- 在 Alice 上,10.242.0.1/32 被分配给 lo,在 Bob 上,10.242.0.2/32 被分配给 lo。
- Alice 和 Bob 之间有一条 gre 隧道,提供 10.242.0.101/32 到 10.242.0.102/32 的点对点,我们将
a_b_gre
在两侧调用此接口。 - 此外,Alice 将 IP 地址 10.242.1.1/24 分配给网桥。
以 Bob 为例,它知道 10.242.0.1/32 和 10.242.1.0/24 都可以通过 10.242.0.101/32 到达。没有适当的防火墙规则,策略设置为“接受”。
所以这是我的问题:当 Alice 使用 10.242.1.1 的 src ip ping 10.242.0.2 时,数据包被接收但没有路由或回复。现在,对于我在调试过程中尝试过的许多事情中的一些:
- 从 10.242.0.101 ping 到 10.242.0.102:工作正常
- 从 10.242.0.1 ping 到 10.242.0.2:工作正常
- 从 10.242.1.1 ping 到 10.242.0.102:也不起作用
tshark -pi any icmp
:看到数据包到达,没有响应数据包tshark -i lo icmp
: 没有看到数据包Sysctl 检查:
net.ipv4.conf.all.forwarding = 1 net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_local = 1 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.all.route_localnet = 1 net.ipv4.conf.all.log_martians = 1
iptables TRACE 规则:
TRACE: filter:INPUT:policy:1 IN=a_b_gre OUT= MAC= SRC=10.242.1.1 DST=10.242.0.2 ...
这表明它很好地通过了输入链。- conntrack -L:
icmp 1 29 src=10.242.1.1 dst=10.242.0.2 type=8 code=0 id=29499 [UNREPLIED] src=10.242.0.2 dst=10.242.1.1 type=0 code=0 id=29499 mark=0 use=1
...所以肯定会到达那里...清除 conntrack 条目没有帮助。 路线查找检查:我们的调查表明......
Bob # ip route get 10.242.0.2 from 10.242.0.1 iif a_b_gre local 10.242.0.2 from 10.242.0.1 dev lo table local cache <local> iif a_b_gre Bob # ip route get 10.242.1.1 from 10.242.0.2 iif lo 10.242.1.1 from 10.242.0.2 via 10.242.0.101 dev a_b_gre cache iif lo
现在我没有主意了。 Bob 清楚地收到了数据包,并且似乎知道应该如何处理它,但似乎有什么东西让它丢弃数据包,而不是回复数据包或将其路由到环回。考虑到当我尝试沿着 的线路进行 ping 时看到相同的行为ping -I 10.242.0.1 10.242.0.2 10.242.0.3
,其中 .3 属于与前两个类似的第三个主机设置,并再次ip route get
给出正确的答案,我绝对对转发阶段表示怀疑。
哦,我还应该注意,我特别不想对地址进行 NAT。虽然这可以解决眼前的问题,但它也违背了让数据包正确路由的目标。
那么,有什么想法可以从这里开始吗?