Firewalld 虚拟桥接传出流量至 VPN 隧道

Firewalld 虚拟桥接传出流量至 VPN 隧道

我最终决定坐下来做一些早已列入我待办事项清单的事情:让我的虚拟网络真正发挥作用。

简单来说:我有一个纯虚拟桥接设备(由 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 以在连接建立后将默认路由推送到此表即可解决。这与修订后的防火墙转发规则相结合似乎可以解决问题。

相关内容