TLDR;

TLDR;

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.1A成功运行。


为了消除不必要的来回沟通,我在下面提供了更具体的细节。

详细资料

提前为这篇长文道歉,我很难撰写,更不用说阅读和分析它了。我希望 StackOverflow 能像 GitHub 一样支持手风琴<details>-<summary>标签,以便更好地组织内容。

答案1

我认为当源和目的地位于不同的网络时,您需要 MASQUERADE。

在 B 上:iptables -t nat -I POSTROUTING -s 10.0.0.248 -d 10.0.1.1 -j MASQUERADE

相关内容