Firewalld 从 Wireguard 接口转发同区域流量,但不允许访问主机端口

Firewalld 从 Wireguard 接口转发同区域流量,但不允许访问主机端口

我在 VPS 上运行基于 RHEL 的 Linux 发行版,该 VPS 应该是 VPN 网关服务器。我使用 Wireguard 通过此网关将客户端相互连接。服务器已启用 ipv4 转发,所有客户端都连接到服务器上的同一 Wireguard 接口,并且位于同一子网(10.0.100.0/24如果这很重要)。最简单的设置可能如下所示

            Wireguard            Wireguard
 [ClientA] <---------> [Server] <---------> [ClientB]
10.0.100.10           10.0.100.1           10.0.100.20

我创建了一个名为的 Firewalld-zone vpn,在其中添加了 Wireguard-NIC 作为接口,并将其10.0.100.0/24作为源添加到此区域。服务器本身除了 VPN 网关之外还运行其他服务(例如 Cockpit)。

我希望 ClientA 可以访问同一子网上所有其他客户端的所有端口(例如 ClientB),但限制所有客户端访问服务器上公开的任何服务(例如 Cockpit)。

target如果我将区域的设置为ACCEPT,则客户端 A 可以访问客户端 B 的每个端口(这很棒),但不幸的是,服务器上运行的所有内容也会暴露给客户端(这是不行的,因为设备并不总是值得信赖的)。此时,我该如何告诉防火墙不要暴露服务器本身的任何端口?

如果我保留target区域,default客户端可以互相 ping,但无法访问彼此的端口(并且服务器不会暴露任何内容,这正是我所期望的)。如果采用这种方法,如何允许将流量转发到客户端?(就像--add-port/--add-service只是转发流量一样?)

有没有办法配置 Firewalld,以便它在区域内的客户端之间转发流量,同时限制对服务器上公开的服务的访问?

答案1

我找到了一些解决方案,感谢 #firewalld IRC 上的一位非常好的人(如果您正在阅读这篇文章,请向 @erig 致敬)。

在 Firewalld 0.9.x 版本中,开发人员引入了“前向过滤”功能,这正是我所寻找的。然而,截至 2020-02-03,遗憾的是它没有在任何地方得到很好的记录,而且许多发行版仍在提供 Firewalld 0.8.x)。因此,如果您正在阅读这篇文章,因为您遇到了类似的问题并且已经使用了 Firewalld > v0.9.x,我建议您深入了解前向过滤。

如果您(像我一样)暂时无法使用 0.8.x(或者只是不太热衷于尝试正向过滤),另一个解决方案是使用 Rich Rule,拒绝发往服务器地址的所有流量。这不会影响转发流量,只会影响直接发往主机的流量。

firewall-cmd --zone=vpn --add-rich-rule='rule family=ipv4 source address=10.0.100.0/24 destination address=10.0.100.1/32 reject'

vpn请注意,应用此规则的区域需要将其目标设置为ACCEPT,以便仍将流量转发到网络上的客户端。

相关内容