无法弄清楚如何通过多宿主网卡路由数据包

无法弄清楚如何通过多宿主网卡路由数据包

环境大部分是 FreeBSD,如下所示:

HOST_A <-> ROUTER <-> LOKI <-> HOST_B

至少,我希望能够从 HOST_B ping ROUTER。

  • ROUTER 被分配 IP 10.0.0.1
  • LOKI 是一台多宿主计算机,分配的 IP 为 10.0.0.2 和 192.168.200.1
  • HOST_B 被分配 IP 192.168.200.3
  • HOST_A 被分配 IP 10.0.0.3

我已经按照上面的方式设置了网络,并将 gateway_enable="YES" 添加到了 loki 的 rc.conf 中

LOKI 上的 netstat -r 会生成:

Routing tables
Internet:
Destination        Gateway            Flags      Netif Expire
default            10.0.0.1           UGS         em0
10.0.0.0           link#1             U           em0
10.0.0.2           link#1             UHS         lo0
loki               link#2             UH          lo0
192.168.200.0      link#3             U           ue0
192.168.200.1      link#3             UHS         lo0

它看起来像一个很好的路由表,并且似乎可以在所有方向上工作。

HOST_B 上的 netstat -r 生成:

Routing tables
Internet:
Destination        Gateway            Flags      Netif Expire
default            192.168.200.1      UGS         em0
hostb              link#2             UH          lo0
192.168.200.0      link#1             U           em0
192.168.200.3      link#1             UHS         lo0

它看起来像另一个精细的路由表,但只能看到 LOKI。

总之:

  • LOKI 能够 ping HOST_A、HOST_B 和 ROUTER
  • HOST_B 能够 ping LOKI,但不能 ping ROUTER 或 HOST_A

一些附加说明:来自 HOST_B

ping 10.0.0.1 100% packet loss

在 LOKI 上的wireshark 中,从 HOST_B ping 10.0.0.1 时:

120 40.549564000    192.168.200.3   10.0.0.1    ICMP    98  Echo (ping) request  id=0x5a0e, seq=92/23552, ttl=63 (no response found!)

在我看来,没有任何内容从 LOKI 路由到 ROUTER。我缺少什么?

我通过在 /etc/rc.conf 中注释掉 gateway_enable="YES" 并重新启动来确认 IP 转发正在发生。

然后,我在 loki 上运行以下命令:

sudo tcpdump -i em0 -nS
sudo tcpdump -i ue0 -nS

监视两个网卡上的活动。

从hostb,我跑了:

ping 10.0.0.1

192.168.200.1 上的 ue0 接口报告:

14:44:21.870865 IP 192.168.200.3 > 10.0.0.1: ICMP echo request, id 21509, seq 0, length 64

10.0.0.2 上的 em0 接口上没有报告任何内容。

然后我跑了:

sudo sysctl -w net.inet.ip.forwarding=1

果然,em0 报告说:

14:58:14.745369 IP 192.168.200.3 > 10.0.0.1: ICMP echo request, id 25861, seq 0, length 64

但不,请回复诸如我从 hostb 执行 ping loki 得到的结果:

14:44:15.724200 IP 192.168.200.3 > 192.168.200.1: ICMP echo request, id 21253, seq 4, length 64
14:44:15.724207 IP 192.168.200.1 > 192.168.200.3: ICMP echo reply, id 21253, seq 4, length 64

如果我从 loki ping 路由器,一切都很好:

15:04:55.637839 IP 10.0.0.2 > 10.0.0.1: ICMP echo request, id 46852, seq 3, length 64
15:04:55.638324 IP 10.0.0.1 > 10.0.0.2: ICMP echo reply, id 46852, seq 3, length 64

有什么想法如何找到回复吗?

答案1

LOKI和HOST_A在同一子网时,为什么要通过路由器连接?它真的是一个路由器,还是只是一个交换机? (从您后来的评论来看,虽然该设备是路由器,但它只是充当 LOKI 和 HOST_A 之间的交换机)。

HOST_A 和 ROUTER 上的路由表是什么?如果它要尝试到达 192.168.200.1,为什么要使用 LOKI 作为目的地?

除非这些设备上的路由表知道对 192 子网使用 LOKI,否则它们只会转发到默认网关。

作为替代方案,您可能想研究在 LOKI 上安装 NAT。对于许多服务,它可以将来自 HOST_B 的流量封装为来自 LOKI 的流量。由于其他机器可以到达那里,因此它可以接收流量并将其转发回 HOST_B。

答案2

在我看来,洛基所做的正是你所期望的。它ping在 上收到请求数据包ue0并将其转发到em0。如果收到ping回复em0,则会将其转发至ue0

问题出在路由器上。它接收ping来自192.168.200.3LAN 端的请求(但这并不重要)。当它ping向 发送回复时192.168.200.3,它会查看其路由表。 LAN 端是10.0.0.0/24(或类似),因此回复数据包被发送到路由器的默认网关,即公共互联网上的 WAN 端。

路由器使用网络地址转换 (NAT)10.0.0.0/24在您的一个真实公共 IP 地址(由您的 ISP 分配给路由器的 WAN 端)后面伪造一个网络。 RFC1918 地址是私有的,不能暴露于公共 Internet,并且将始终位于 NAT 后面。

您可以将静态路由放置到 ROUTER 中以使您的ping实验成功,但这仍然与公共 Internet 隔离。您可以在 LOKI 上启用 NAT,在这种情况下,您可以使用双 NAT 连接到 Internet(效果很好,但毫无意义)。如果您只需要第二级防火墙,您可以考虑将 LOKI 设为桥接防火墙并10.0.0.0/24在两个 NIC 上运行。如果您想要托管面向互联网的服务,并且您只有一个公共 IP 地址,则您必须在 ROUTER 上使用端口转发规则。

答案3

必须进行一些设置才能将数据包从网络 A 转发到网络 B。Loki 是双宿主的,可以做到这一点,但它不是自动的。这样做时,您会将 Loki 设置为路由器,并应使用 Loki 作为主机 B 的默认网关。另一个选项是在主机 B 的路由表中设置永久路由,指定 Loki 作为 10.xxx 流量的目的地。

相关内容