WireGuard 允許存取網路上的單一服務

WireGuard 允許存取網路上的單一服務

我正在我的 Raspberry Pi 上運行 WireGuard 伺服器,使用https://github.com/linuxserver/docker-wireguard圖像。我想讓同行做兩件事:

  1. 透過 SMB 連接到單一 NAS
  2. 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 介面。

然而,我確實有幾個問題來準確地理解我所做的事情:

  1. INPUT將/ OUTPUTpolicy設為 時DROP,沒有任何效果。我的假設是,這是因為收到的 WireGuard UDP 封包wg0被策略丟棄了?
  2. ALLOW如果我無論如何設定策略並在from/to 的流量中新增規則wg0,效果將是容器無法通過eth0且只能FORWARD透過 from 的流量連接到任何內容wg0
  3. RELATED,ESTABLISHED允許流量通過的規則wg0應該只符合回應 TCP:445 或 ICMP:echo-equest 的流量。不需要在那裡更具體(例如匹配端口/協定),對吧?
  4. ALLOW不需要 echo-r​​esponses規則,因為允許RELATED,ESTABLISHED其上方流量的不太具體的規則將在其之前匹配,對嗎?
  5. 對於鏈上的所有過濾FORWARD,我的假設是我不需要在錶鍊上進行過濾natPOSTROUTING因為 TCP:445 或 ICM:echo-equest 上不適合 NAS 的任何流量都不會通過無論如何,“到目前為止」。它是否正確?

答案1

簡要回答您的問題:

  1. 是的
  2. INPUT/OUTPUT用於與本地套接字之間的連接全部接口(loeth0wg0等)。通常您不想默認阻止所有出站,因為您最終會花時間對您通常認為理所當然的事情進行故障排除(DNS、DHCP、NTP、使用環回連接的雜項進程等)
  3. 是的。通常,在沒有任何附加條件的情況下允許所有內容就可以了RELATED,ESTABLISHED(如果您已經允許通過一種方式進行連接,則以另一種方式返回的對稱響應也應該可以)
  4. 是的
  5. 是的

我認為這iptables處理流程圖也將幫助您更好地理解其工作原理:

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

相關內容