需要在firewalld 中允许什么以便 WireGuard 客户端可以通过 SSH 相互连接?
设置
我在 WireGuard VPN 网络上有两个客户端和一个服务器。它们都运行 Debian 11。
CLIENT A -------- SERVER -------- CLIENT B
10.0.1.2 10.0.1.1 10.0.1.3
可以做什么
- 我可以从任一客户端通过 SSH 连接到服务器。
- 我可以从服务器通过 SSH 连接到任一客户端。
问题: 但是当我尝试通过 SSH 客户端连接到客户端时,我收到“ssh:连接到主机 10.0.1.2 端口 22:没有到主机的路由”
故障排除
- 机器之间的路径已打开,因为我可以 ping 通...
- 客户端到服务器,
- 服务器到客户端,
- 以及客户对客户。
- 这些端口是可访问的,因为我可以通过 telnet 进行访问……
- 从服务器到端口 22 上的任一客户端。
- 从任一客户端到端口 22 上的服务器。
问题: 但是当我尝试从客户端到客户端进行 telnet 时,出现“telnet:无法连接到远程主机:没有到主机的路由”
已确认的内容
- SSH 是防火墙上列出的服务:
firewall-cmd --list-services
返回ssh
- ip-foward 在内核中设置:
sysctl -a
返回net.ipv4.ip_forward = 1
- 在 iptables 上设置了转发:
iptables-save
返回-A FORWARD -i wg0 -o wg0 -j ACCEPT
- 在服务器上禁用防火墙确实允许两个 WireGuard 客户端之间建立 SSH 连接。
谢谢您的帮助和指点。
答案1
虽然通常情况下,firewalld 是配置 Linux 防火墙的绝佳工具,但对于这种特定用例(转发其他主机的流量),使用起来却有点麻烦。我建议在您的服务器上关闭它,直接使用 iptables(或 nftables)。
但是,如果您确实想使用firewalld,请尝试以下操作(以root身份):
1. 为您的 WireGuard 接口创建一个接受所有流量的自定义区域:
firewall-cmd --permanent --new-zone=mywg
firewall-cmd --permanent --zone=mywg --set-target=ACCEPT
firewall-cmd --reload
2. 向区域添加“丰富”规则,以拒绝从 WireGuard 到服务器本身的入站连接:
firewall-cmd --zone=mywg --add-rich-rule='rule family="ipv4" priority="30001" protocol value="tcp" reject'
firewall-cmd --zone=mywg --add-rich-rule='rule family="ipv4" priority="30002" protocol value="udp" reject'
firewall-cmd --zone=mywg --add-rich-rule='rule family="ipv6" priority="30003" protocol value="tcp" reject'
firewall-cmd --zone=mywg --add-rich-rule='rule family="ipv6" priority="30004" protocol value="udp" reject'
3. 添加“直接”规则以允许转发其他 WireGuard 主机之间的 IPv4 SSH 连接,并拒绝其他所有内容:
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter FORWARD 1 -i wg0 -o wg0 -m state --state NEW -p tcp --dport 22 -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter FORWARD 2 -i wg0 -j REJECT
firewall-cmd --direct --add-rule ipv6 filter FORWARD 0 -i wg0 -j REJECT
4. 将区域绑定到您的 WireGuard 接口并保存您的更改:
firewall-cmd --zone=mywg --add-interface=wg0
firewall-cmd --runtime-to-permanent
REJECT
如果您想允许 WireGuard 主机之间进行其他类型的流量(或者只需将规则 0 和 1 替换为单个规则,例如如果您想允许服务器转发 WireGuard 主机之间的任何和所有流量) ,则可以在 0 和 2 之间添加更多 IPv4 直接规则(将规则重新编号为最后一条-i wg0 -o wg0 -J ACCEPT
)。
请参阅本文的“中心辐射”部分如何将 WireGuard 与 Firewalld 结合使用文章以获得完整的解释(在本文中,主机 C 是您的服务器)。