我的家庭路由器是一个运行 OPNsense 的虚拟机。我有一个专用服务器,有一个 IPv4 子网路由到它,我已经设置了一个从我的专用服务器到我的家庭路由器的 GRE 隧道,这样我就可以在家里使用 IP 地址。
在专用服务器上,我已经设置了通过 GRE 隧道路由的子网。
在 OPNsense 中,我设置了 GRE 隧道,并添加了虚拟 IP。
问题是,当我设置 1:1 NAT 时,只有一些数据包的源地址被转换。在1:1 NAT 设置的客户端上,内部IP 是192.168.254.106
,外部IP 是(例如),176.9.x.x
每当我ping 8.8.8.8
在客户端上运行时,只有第一个 ping 返回。
ubuntu@ubuntu:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=32.8 ms
^C
--- 8.8.8.8 ping statistics ---
6 packets transmitted, 1 received, 83% packet loss, time 5081ms
rtt min/avg/max/mdev = 32.875/32.875/32.875/0.000 ms
这是我tcpdump -i gre0 icmp
在 OPNsense 路由器上运行时看到的。(gre0
作为 GRE 隧道)
root@core1:~ # tcpdump -i gre0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on gre0, link-type NULL (BSD loopback), capture size 262144 bytes
12:26:35.361531 IP 176.9.x.x > google-public-dns-a.google.com: ICMP echo request, id 1784, seq 1, length 64
12:26:35.393693 IP google-public-dns-a.google.com > 176.9.x.x: ICMP echo reply, id 1784, seq 1, length 64
12:26:36.362530 IP 192.168.254.106 > google-public-dns-a.google.com: ICMP echo request, id 1784, seq 2, length 64
12:26:37.371299 IP 192.168.254.106 > google-public-dns-a.google.com: ICMP echo request, id 1784, seq 3, length 64
12:26:38.395302 IP 192.168.254.106 > google-public-dns-a.google.com: ICMP echo request, id 1784, seq 4, length 64
12:26:39.419105 IP 192.168.254.106 > google-public-dns-a.google.com: ICMP echo request, id 1784, seq 5, length 64
12:26:40.443423 IP 192.168.254.106 > google-public-dns-a.google.com: ICMP echo request, id 1784, seq 6, length 64
有错误,还是我做错了什么?它应该转换所有数据包的源 IP,但它只是为某些人做的。(如果让 ping 运行一段时间,将再次转换一个数据包,然后它将停止转换之后的数据包。)
不幸的是,我只能成功使用一种解决方法。
在提出这个问题时——直到今天——我的 ISP 的调制解调器中存在一个错误,导致它们在处理 GRE 或 IPIP 时出现故障。解决方案是 Foo over UDP,其中包含 GRE,效果很好。但是,据我所知,OPNsense 无法使用它,因此我切换到专用的 Ubuntu VM。现在一切正常。