openvpn (tun0 + bridge) :通信桥接 --> tun0 工作正常,但反向工作不正常

openvpn (tun0 + bridge) :通信桥接 --> tun0 工作正常,但反向工作不正常

我的网络组成如下:

  • 主机 A 的 IP 为 9.xxx,VPN IP 为 192.15.206.x(openvpn 客户端)

  • 主机 B 的 IP 为 9.xxx,VPN IP 为 192.15.206.1(openvpn 服务器),该主机有一个网桥 br0,IP 为 192.168.206.1

  • 主机 C 的 IP 为 192.168.206.2/192.168.206.255,位于主机 B 的 vnet0 中。vnet0 与 br0 桥接

我想从 A 到达 C。以下是发生的情况:

  • 从主机 BI 可以 ping 通 A(使用 9.xxx 或 192.15.206.x)和 C
  • 从主机 CI 可以 ping 通 B 和 A(使用 192.15.206.x)
  • 从主机 AI 可以 ping 通 IP 为 192.15.206.1 或 192.168.206.1 的 B,但不能 ping 通 IP 为 192.168.206.2 的 C

那么问题是为什么?路由表如下:

192.15.206.2    0.0.0.0         255.255.255.255 UH    0      0        0 tun0
9.168.58.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.15.206.0    192.15.206.2    255.255.255.0   UG    0      0        0 tun0
192.168.206.0   0.0.0.0         255.255.255.0   U     0      0        0 br0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1004   0        0 br0
0.0.0.0         9.168.58.254    0.0.0.0         UG    0      0        0 eth0

桥梁配置为:

bridge name     bridge id               STP enabled     interfaces
br0             8000.005056a67d62       no              eth1
                                                        vnet0

命令:

cat /proc/sys/net/ipv4/ip_forward

返回 1

如果我在主机 A 上运行 tcpdump -i tun0 ping 192.168.206.1:

14:33:23.927126 IP 192.15.206.6 > 192.168.206.1: ICMP echo request, id 768, seq 513, length 40
14:33:23.927191 IP 192.168.206.1 > 192.15.206.6: ICMP echo reply, id 768, seq 513, length 40

重放被发回。但如果我在主机 A 上运行 ping 192.168.206.2,则不会发回重放。

14:36:33.262959 IP 192.15.206.6 > 192.168.206.2: ICMP echo request, id 768, seq 1281, length 40
14:36:38.749631 IP 192.15.206.6 > 192.168.206.2: ICMP echo request, id 768, seq 1537, length 40

似乎数据包通过 tun0 设备从 A 到达 B,但这些数据包并没有转发到 br0,而 br0 应该将数据包发送到连接 C 主机的 vnet0。

该问题与 iptables 有关,事实上,通过停止 iptables 服务,我可以从 A ping 通 C。我尝试了以下规则,但没有成功:

-A FORWARD -i br0 -j ACCEPT
-A FORWARD -o br0 -j ACCEPT
-A FORWARD -i br0 -j ACCEPT
-A FORWARD -o br0 -j ACCEPT
-A FORWARD -i vnet0 -j ACCEPT
-A FORWARD -o vnet0 -j ACCEPT
-A FORWARD -i vnet0 -j ACCEPT
-A FORWARD -o vnet0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -o tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -o tun0 -j ACCEPT

有任何想法吗 ?

答案1

这可以是

  1. B 上的防火墙问题(违反直觉,Netfilter 也会阻止网桥上的数据包)
  2. C 上的防火墙问题(可能性不大)
  3. C 上的路由问题

因此,检查iptables -L -nvB 上的转发情况,并检查ip routeC 上的转发情况。

编辑1

可以配置 B 上的防火墙让这些数据包通过,例如

iptables -I FORWARD 2 -m physdev --physdev-in vnet0 -j ACCEPT
iptables -I FORWARD 2 -m physdev --physdev-out vnet0 -j ACCEPT

当然,您也可以使用源地址和目标地址来代替(或另外使用)。

编辑2

喜欢:

iptables -I FORWARD 2 -s 192.15.206.2 -d 192.168.206.2 -j ACCEPT
iptables -I FORWARD 2 -d 192.15.206.2 -s 192.168.206.2 -j ACCEPT

答案2

这个问题可能与您不再相关,但由于我遇到了同样的问题,我仍然想将其留在这里。

发出以下命令:

#brctl showstp br0
.... other interfaces ....
tun0 (8)
 port id                8008                    state                disabled
 designated root        8000.0cc47a95b66f       path cost                100
 designated bridge      8000.0cc47a95b66f       message age timer          0.00
 designated port        8008                    forward delay timer        0.00
 designated cost           0                    hold timer                 0.00
 flags

请注意,您的 tun0 的状态可能是禁用的。这意味着机器认为链接已关闭,因此忽略所有数据包。您只需发出以下命令,接口就会进入学习状态,停留在该状态约 10 秒,然后进入转发阶段,在此阶段一切都将顺利进行。

ip link set dev tun0 up

相关内容