TLDR;
我有三台服务器,服务器 A、B 和 C。服务器 A 和 B 是同一子网上的物理服务器。服务器 C 是一台虚拟服务器,是在服务器 B 上运行的基本 WireGuard Docker Compose 容器,通过桥接网络驱动程序与服务器 B 连接。
10.0.1.0/24
--^--
10.10.10.0/16
--------^--------
10.0.0.0/24
--------^--------
[ A ] ..... [ B ] ..... [ C ]
¦ ¦ ¦
¦ ¦
¦ ¦ wg0: 10.0.1.1 ❮┅┅┅┅┅┅┅┅┒
¦ ¦ eth0: 10.10.10.2 ┇
¦ ¦ ┇
¦ ¦ ┇
¦ ┇ ping
¦ eth1: 10.0.0.1 ┇
¦ br-XXX: 10.10.10.1 ┇
¦ ┇
¦ ┇
┇
eth1: 10.0.0.2 ❮┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┚
目标
10.0.0.0/24
我正在尝试使用服务器 B 作为路由器在服务器 A和 C之间建立连接,10.0.1.0/24
并设置路由表和 IP 转发无 NAT。因此本质上我必须能够双向成功 ping:
serverA:~$ ping -I 10.0.0.2 10.0.1.1
serverC:~$ ping -I 10.0.1.1 10.0.0.2
解释
我能够从 B ping 通这两个设备。C 也可以 ping 通 B,但不能 ping 通 A。A 也无法 ping 通 C。我一直保持tcpdump
打开状态,但它没有捕获任何 ICMP 数据包。
10.0.0.0/24
防火墙允许所有设备的所有端口上的所有传出流量和所有传入 icmp/tcp/udp 10.0.1.0/24
。我的 A 路由已在所有服务器上10.0.1.0/24 via 10.0.0.1 dev eth1
设置为 IPv4 转发。1
我遗漏了什么?如何建立连接并确保 A 和 C 之间的正确路由?本质上,我希望能够ping -I 10.0.1.1 10.0.0.2
从 C 或ping 10.0.1.1
A成功运行。
为了消除不必要的来回沟通,我在下面提供了更具体的细节。
详细资料
提前为这篇长文道歉,我很难撰写,更不用说阅读和分析它了。我希望 StackOverflow 能像 GitHub 一样支持手风琴
<details>
-<summary>
标签,以便更好地组织内容。
答案1
我认为当源和目的地位于不同的网络时,您需要 MASQUERADE。
在 B 上:iptables -t nat -I POSTROUTING -s 10.0.0.248 -d 10.0.1.1 -j MASQUERADE