使用firewalld与WireGuard限制点到站点私有网络连接的配置问题排查
看起来你遇到的核心问题是firewalld的wireguard zone默认拒绝转发流量,而你的rich规则只配置了地址伪装(masquerade),没有明确允许流量通过转发链,导致即使匹配了规则,流量还是被默认策略拦截了。我来一步步帮你梳理问题和解决办法:
问题根源分析
你的wireguard zone的target设置为default,firewalld中default target对于转发(forward)流量的默认行为是REJECT——这就是内核日志里出现filter_FWD_wireguard_REJECT的原因。你之前添加的rich规则只包含masquerade动作,但firewalld的规则执行逻辑是先检查流量是否被允许通过,再执行地址伪装这类NAT操作。没有accept动作的话,流量在到达masquerade步骤之前就被拒绝了,自然看不到你设置的日志前缀。
另外,你能ping通WireGuard服务器自身的IP(10.10.10.107和10.42.42.1),是因为这些流量属于输入(input)链,而非转发链,不受zone的forward默认规则限制。
解决方案步骤
我们需要修改wireguard zone的rich规则,给每个允许的流量路径添加accept动作,同时保留masquerade来做源地址转换(让私有网络的服务器能正确回包到WireGuard客户端)。
1. 为普通客户端添加允许+伪装规则
针对Client2(10.42.42.2),允许它访问指定服务器和DNS:
firewall-cmd --zone=wireguard --add-rich-rule='rule family="ipv4" source address="10.42.42.2" destination address="10.10.10.209" accept masquerade' firewall-cmd --zone=wireguard --add-rich-rule='rule family="ipv4" source address="10.42.42.2" destination address="10.10.10.203" accept masquerade'
针对Client3(10.42.42.3),同理:
firewall-cmd --zone=wireguard --add-rich-rule='rule family="ipv4" source address="10.42.42.3" destination address="10.10.10.133" accept masquerade' firewall-cmd --zone=wireguard --add-rich-rule='rule family="ipv4" source address="10.42.42.3" destination address="10.10.10.203" accept masquerade'
2. 为管理员添加无限制转发+伪装规则
管理员网段需要无限制访问私有网络,所以允许所有转发流量并添加伪装和日志:
firewall-cmd --zone=wireguard --add-rich-rule='rule family="ipv4" source address="10.42.43.0/24" accept masquerade log prefix="wg_admin_masq" level="warning"'
3. 保存规则并验证
执行以下命令将临时规则保存到永久配置:
firewall-cmd --runtime-to-permanent
查看wireguard zone的规则是否正确加载:
firewall-cmd --zone=wireguard --list-rich-rules
4. 额外验证(可选)
如果还是有问题,可以查看iptables的转发链规则,确认firewalld的配置是否正确生成:
iptables -L FORWARD -n -v
你应该能看到对应wireguard zone的允许规则排在拒绝规则之前,确保流量会被优先匹配允许规则。
测试验证
现在让Client2尝试ping DNS服务器(10.10.10.203)和自己的服务器(10.10.10.209),管理员尝试访问任意私有网络内的机器,应该都能正常连通了。
备注:内容来源于stack exchange,提问作者prototyp

