Iptables

Wireguard 限制對本地網路中的服務和機器的訪問

  • February 18, 2022

我在我的本地網路中執行一個 Wireguard“伺服器”,我通過我的靜態公共 IP 遠端訪問它。我希望能夠將 Wireguard 遠端對等點的訪問限制為我的區域網路中的服務/機器,我在其中託管其他伺服器。

範例:安裝了 Wireguard 的伺服器 1 (192.168.1.23 | 10.0.0.1) + Nextcloud + Jellyfin 在同一台機器上 伺服器 2 (192.168.1.62) 和 Photoprism

遠端對等體 1 (10.0.0.2 | 動態 ip) 遠端對等體 2 (10.0.0.3 | 動態 ip)

我想要:

1- 允許 peer1 (10.0.0.2) 訪問伺服器 1 Nextcloud + Jellyfin 並訪問伺服器 2 到 Photoprism。

2- 允許 Peer2 (10.0.0.3) 僅訪問伺服器 1 Nextcloud 但不允許訪問 Jellyfin 並阻止訪問伺服器 2

現在我可以從所有 Peers 訪問我區域網路中的所有機器。

iptables 規則:

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s7 -j MASQUERADE; iptables -t nat -A POSTROUTING -o wg0
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp0s7 -j MASQUERADE; iptables -t nat -D POSTROUTING -o wg0

我遵循了Justin Ludwig的本教程,因為站點到點拓撲與我的非常相似。所以我嘗試用這些規則複製 Iptables 規則:

# masquerading
PreUp = iptables -t mangle -A PREROUTING -i wg0 -j MARK --set-mark 0x200
PreUp = iptables -t nat -A POSTROUTING ! -o wg0 -m mark --mark 0x200 -j MASQUERADE
PostDown = iptables -t mangle -D PREROUTING -i wg0 -j MARK --set-mark 0x200
PostDown = iptables -t nat -D POSTROUTING ! -o wg0 -m mark --mark 0x200 -j MASQUERADE

# wireguard ingress
PreUp = iptables -I INPUT -p udp --dport 2332 -j ACCEPT
PostDown = iptables -D INPUT -p udp --dport 2332 -j ACCEPT

# site firewall
PreUp = iptables -N wg0-filter
PreUp = iptables -N to-photoprism
PreUp = iptables -N to-jellyfin
PreUp = iptables -N to-nextcloud

PreUp = iptables -I INPUT   -i wg0 -j wg0-filter
PreUp = iptables -I FORWARD -i wg0 -j wg0-filter
PreUp = iptables -I FORWARD -o wg0 -j wg0-filter
PreUp = iptables -I OUTPUT  -o wg0 -j wg0-filter

PreUp = iptables -A wg0-filter -m state --state ESTABLISHED,RELATED -j ACCEPT
PreUp = iptables -A wg0-filter -d 192.168.1.63  -p tcp --dport   2342 -j to-photoprism
PreUp = iptables -A wg0-filter -d 192.168.1.23  -p tcp --dport   8096 -j to-jellyfin
PreUp = iptables -A wg0-filter -d 192.168.1.23  -p tcp --dport     80 -j to-nextcloud
PreUp = iptables -A wg0-filter -j REJECT

PreUp = iptables -A to-photoprism     -s 10.0.0.2    -j ACCEPT

PreUp = iptables -A to-jellyfin       -s 10.0.0.2    -j ACCEPT
PreUp = iptables -A to-jellyfin       -s 10.0.0.3    -j ACCEPT

PreUp = iptables -A to-nextcloud      -s 10.0.0.2    -j ACCEPT
PreUp = iptables -A to-nextcloud      -s 10.0.0.3    -j ACCEPT

PostDown = iptables -D INPUT   -i wg0 -j wg0-filter
PostDown = iptables -D FORWARD -i wg0 -j wg0-filter
PostDown = iptables -D FORWARD -o wg0 -j wg0-filter
PostDown = iptables -D OUTPUT  -o wg0 -j wg0-filter

PostDown = iptables -F to-photoprism
PostDown = iptables -F to-jellyfin
PostDown = iptables -F to-nextcloud

PostDown = iptables -X to-photoprism
PostDown = iptables -X to-jellyfin
PostDown = iptables -X to-nextcloud

這不起作用,Peer 1 和 Peer 2 可以訪問伺服器 1,這兩個服務,但不是伺服器 2。

我不太了解我必須改變什麼才能完成這項工作,如果有人能插話,我會很高興。

提前致謝

總體而言,您的 iptables 規則對我來說看起來不錯;雖然:

  1. 在問題描述中,您提到伺服器 2 的 IP 地址為192.168.1.62;但在 iptables 規則中,您似乎正在使用192.168.1.63它:
iptables -A wg0-filter -d 192.168.1.63  -p tcp --dport   2342 -j to-photoprism

這是一個地方或另一個地方的錯字嗎? 2. 在描述中,您提到 Peer 2 ( 10.0.0.3) 不應訪問 Jellyfin;但是在 iptables 規則中,您可以使用以下行授予它訪問權限:

iptables -A to-jellyfin       -s 10.0.0.3    -j ACCEPT

也許您打算刪除此規則? 3. 我沒有看到任何PostDown斷開wg0-filter鏈條的命令,就像您對其他自定義鏈條所做的那樣;確保包括它們:

PostDown = iptables -F wg0-filter
PostDown = iptables -X wg0-filter

如果沒有這些拆卸命令,如果您進行更改並重新啟動,最終wg0-chain可能會使用以前嘗試的舊規則,而不是更新的更新。(並確保您遵循文章中的“進行配置更改”建議,在進行配置更改並重新啟動之前關閉 WireGuard 界面 -sudo iptables-save在界面關閉時執行以仔細檢查您是否有任何舊規則或鏈沒有清理乾淨。)

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