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...
- 客户端到服务器,
- 服务器到客户端,
- 和客户对客户。
- 这些端口是可访问的,因为我可以远程登录...
- 从服务器到端口 22 上的任一客户端。
- 从任一客户端到端口 22 上的服务器。
问题: 但是当我尝试 telnet 客户端到客户端时,我得到“telnet:无法连接到远程主机:没有到主机的路由”
已确认的内容
- SSH 是 firewalld 上列出的服务:
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
- 在服务器上禁用 firewalld 确实允许两个 WireGuard 客户端之间的 SSH 连接。
感谢您的帮助和指点。
虽然 firewalld 通常是在 Linux 机器上配置防火墙的出色工具,但对于这种特殊用例——为其他主机转发流量——使用起来有点痛苦。我建议在你的服务器上关闭它,直接使用 iptables(或 nftables)。
但是,如果您真的想使用 firewalld,请尝试以下操作(以 root 身份):
1. 为您的 WireGuard 接口创建一个接受所有流量的自定义区域:
2. 向区域添加“丰富”规则以拒绝从 WireGuard 到服务器本身的入站连接:
3. 添加“直接”规则以允许在其他 WireGuard 主机之间转发 IPv4 SSH 连接,并拒绝其他所有内容:
4. 将该区域绑定到您的 WireGuard 界面并保存您的更改:
REJECT
如果您想允许 WireGuard 主机之间的其他类型的流量(或者只需将规则 0 和 1 替换为单个规则,例如-i wg0 -o wg0 -J ACCEPT
,如果您想允许,则可以在 0 和 2 之间添加更多 IPv4 直接规则(将规则重新编号为最后一个)服务器在您的 WireGuard 主机之间转发任何和所有流量)。请参阅这篇How to Use WireGuard With Firewalld文章的Hub and Spoke 部分以获取完整说明(在本文中主机 C 是您的服务器)。