Debian

Firewalld 阻止 WireGuard LAN 上客戶端之間的 SSH

  • December 24, 2021

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:沒有到主機的路由”


故障排除

  1. 機器之間的路徑已啟動,因為我可以 ping…
  • 客戶端到伺服器,
  • 伺服器到客戶端,
  • 和客戶對客戶。
  1. 這些埠是可訪問的,因為我可以遠端登錄…
  • 從伺服器到埠 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 是您的伺服器)。

引用自:https://serverfault.com/questions/1086216