![Firewalld 虚拟桥接传出流量至 VPN 隧道](https://linux22.com/image/716581/Firewalld%20%E8%99%9A%E6%8B%9F%E6%A1%A5%E6%8E%A5%E4%BC%A0%E5%87%BA%E6%B5%81%E9%87%8F%E8%87%B3%20VPN%20%E9%9A%A7%E9%81%93.png)
我最终决定坐下来做一些早已列入我待办事项清单的事情:让我的虚拟网络真正发挥作用。
简单来说:我有一个纯虚拟桥接设备(由 ifcfg-script 在启动时创建),libvirtd 在生成客户操作系统时会将其附加到该设备。桥上还有一个 dnsmasq-dhcp 正在运行。由于桥是虚拟的,因此没有互联网接入,并且无法将 openvpn tun0 设备直接添加到桥中。现在我的目标是将所有出站流量重定向到 tun0 接口。使用 Firewalld 的直接规则似乎很容易,但我为此浪费了一天时间。
网桥上的内部流量(包括 dhcp)运行良好,但根本无法使传出流量正常工作。问题不在于路由表(使用 iproute2 作为 tun0 的第二个路由表,使用 curl --interface ... 检查以获取 tun0 的外部 ip),也不在于 openvpn 连接本身。
不用多说,以下是我的配置文件:
ifcfg-tun0:
DEVICE=tun0
BOOTPROTO=none
ONBOOT=no
TUNNEL=’tun’
如果 virtbr10 出现错误:
DEVICE=virbr10
NAME=virbr10
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Bridge
DELAY=2
STP=on
IPADDR=10.8.3.1
NETMASK=255.255.255.0
IPV6INIT=no
ZONE=virbr10
/etc/firewalld/direct.xml:
<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="nat" ipv="ipv4" chain="POSTROUTING">-o tun0 -j MASQUERADE</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-o tun0 -i virbr10 -m state --state RELATED,ESTABLISHED -j ACCEPT</rule>
<rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-o virbr10 -i tun0</rule>
</direct>
和一些命令:
防火墙cmd——获取活动区域:
home
interfaces: enp2s0 br0
virbr10
interfaces: virbr10
purevpn
interfaces: tun0
防火墙cmd --zone=purevpn --query-masquerade:
yes
所有服务均已启动并运行,没有任何错误,而且我已经检查了这些文件几个小时,没有发现任何明显的错误。任何帮助都将不胜感激。有一件事我不确定该怎么做,那就是命令“firewall-cmd --permanent --direct --get-all-rules”没有返回任何内容。虽然我不确定它是否应该返回。
哦,系统是 CentOS 7,vpn 是 openvpn,带有一些自定义脚本来填充第二个路由表。
编辑:忘记提及在 /etc/sysctl.conf 中启用了路由。
编辑2:有人指出我实际上并没有提出任何问题......所以有谁注意到我所犯的任何(不太)明显的错误,或者知道如何让这个网络按预期工作。
答案1
过了一段时间,我设法自己修复了这个问题。我的配置本身并没有错(尽管我确实重写了直接规则),但并不完整。我意识到,即使我的虚拟网桥可以将数据包转发到 tun0 接口,它也不会这样做,因为缺少默认路由。也就是说,它不知道它可以将数据包发送到 tun0。只需为 virbr10 接口添加第三个路由表,并修改 openvpn route-up -script 以在连接建立后将默认路由推送到此表即可解决。这与修订后的防火墙转发规则相结合似乎可以解决问题。