环境大部分是 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.3
LAN 端的请求(但这并不重要)。当它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 流量的目的地。