我正在我的 Raspberry Pi 上運行 WireGuard 伺服器,使用https://github.com/linuxserver/docker-wireguard圖像。我想讓同行做兩件事:
- 透過 SMB 連接到單一 NAS
- Ping 同 NAS
我編寫了以下 iptables 規則來存檔此內容(wg0
是 WireGuard 接口,eth0
“朝向”我的網絡的接口):
# Reset (flush) rules
iptables -t nat -F
iptables -F
# Allow WireGuard traffic
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
# Deny any forward traffic by default
iptables --policy FORWARD DROP
# Allow SAMBA traffic to NAS
NAS="192.168.178.23/32"
iptables -A FORWARD -i wg0 -p tcp --dport 445 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow ICMP echo request
iptables -A FORWARD -i wg0 -p icmp --icmp-type 8 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -p icmp --icmp-type 0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# NAT tunnel IP to internal IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
這些工作正常,因此當透過 WireGuard 連接時,我可以透過 SMB ping 並安裝 NAS,但無法 ping 網路中的任何其他服務或存取 NAS 的 HTTP 介面。
然而,我確實有幾個問題來準確地理解我所做的事情:
INPUT
將/OUTPUT
policy設為 時DROP
,沒有任何效果。我的假設是,這是因為收到的 WireGuard UDP 封包wg0
被策略丟棄了?ALLOW
如果我無論如何設定策略並在from/to 的流量中新增規則wg0
,效果將是容器無法通過eth0
且只能FORWARD
透過 from 的流量連接到任何內容wg0
?RELATED,ESTABLISHED
允許流量通過的規則wg0
應該只符合回應 TCP:445 或 ICMP:echo-equest 的流量。不需要在那裡更具體(例如匹配端口/協定),對吧?ALLOW
不需要 echo-responses規則,因為允許RELATED,ESTABLISHED
其上方流量的不太具體的規則將在其之前匹配,對嗎?- 對於鏈上的所有過濾
FORWARD
,我的假設是我不需要在錶鍊上進行過濾nat
,POSTROUTING
因為 TCP:445 或 ICM:echo-equest 上不適合 NAS 的任何流量都不會通過無論如何,“到目前為止」。它是否正確?
答案1
簡要回答您的問題:
- 是的
- 這
INPUT
/OUTPUT
用於與本地套接字之間的連接全部接口(lo
、eth0
、wg0
等)。通常您不想默認阻止所有出站,因為您最終會花時間對您通常認為理所當然的事情進行故障排除(DNS、DHCP、NTP、使用環回連接的雜項進程等) - 是的。通常,在沒有任何附加條件的情況下允許所有內容就可以了
RELATED,ESTABLISHED
(如果您已經允許通過一種方式進行連接,則以另一種方式返回的對稱響應也應該可以) - 是的
- 是的
我認為這iptables處理流程圖也將幫助您更好地理解其工作原理:
這就是我寫規則的方式:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# INPUT chain of filter table:
# drop known bad packets
iptables -A INPUT -m state --state INVALID -j DROP
# accept responses to established connections
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# accept ICMP packets
iptables -A INPUT -p icmp -J ACCEPT
# accept loopback connections
iptables -A INPUT -i lo -J ACCEPT
# accept connections to WireGuard listen port
iptables -A INPUT -p udp --dport 51820 -J ACCEPT
# FORWARD chain of filter table:
# drop known bad packets
iptables -A FORWARD -m state --state INVALID -j DROP
# forward responses to established connections
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# forward ICMP packets from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p icmp -J ACCEPT
# forward SMB connections from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p tcp --dport 445 -J ACCEPT
# POSTROUTING chain of nat table:
# masquerade all packets forwarded to LAN
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE