![openvpn (tun0 + bridge) :通信桥接 --> tun0 工作正常,但反向工作不正常](https://linux22.com/image/611063/openvpn%20(tun0%20%2B%20bridge)%20%EF%BC%9A%E9%80%9A%E4%BF%A1%E6%A1%A5%E6%8E%A5%20--%3E%20tun0%20%E5%B7%A5%E4%BD%9C%E6%AD%A3%E5%B8%B8%EF%BC%8C%E4%BD%86%E5%8F%8D%E5%90%91%E5%B7%A5%E4%BD%9C%E4%B8%8D%E6%AD%A3%E5%B8%B8.png)
我的网络组成如下:
主机 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
这可以是
- B 上的防火墙问题(违反直觉,Netfilter 也会阻止网桥上的数据包)
- C 上的防火墙问题(可能性不大)
- C 上的路由问题
因此,检查iptables -L -nv
B 上的转发情况,并检查ip route
C 上的转发情况。
编辑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