Debian
Firewalld 阻止 WireGuard LAN 上客戶端之間的 SSH
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 介面創建一個接受所有流量的自定義區域:
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 替換為單個規則,例如-i wg0 -o wg0 -J ACCEPT
,如果您想允許,則可以在 0 和 2 之間添加更多 IPv4 直接規則(將規則重新編號為最後一個)伺服器在您的 WireGuard 主機之間轉發任何和所有流量)。請參閱這篇How to Use WireGuard With Firewalld文章的Hub and Spoke 部分以獲取完整說明(在本文中主機 C 是您的伺服器)。