Ich betreibe einen WireGuard-Server auf meinem Raspberry Pi mit demhttps://github.com/linuxserver/docker-wireguardBild. Ich möchte Peers zwei Dinge ermöglichen:
- Verbindung zu einem einzelnen NAS über SMB herstellen
- Pingen Sie dasselbe NAS an
Um dies zu archivieren, habe ich die folgenden iptables-Regeln geschrieben ( wg0
ist die WireGuard-Schnittstelle, eth0
die „zu“ meinem Netzwerk führt):
# 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
Diese funktionieren, sodass ich bei einer Verbindung über WireGuard das NAS über SMB anpingen und mounten kann, aber keinen anderen Dienst im Netzwerk anpingen oder auf die HTTP-Schnittstelle des NAS zugreifen kann.
Ich habe jedoch ein paar Fragen, um genau zu verstehen, was ich getan habe:
- Wenn ich
INPUT
/OUTPUT
policy auf setzeDROP
, funktioniert nichts. Ich gehe davon aus, dass es daran liegt, dass die auf empfangenen WireGuard UDP-Paketewg0
von der Richtlinie verworfen werden? - Wenn ich die Richtlinie trotzdem festlege und eine Regel für
ALLOW
den Datenverkehr von/nach hinzufügewg0
, hätte dies zur Folge, dass der Container keine Verbindung über herstellen kanneth0
und nurFORWARD
der Datenverkehr von empfangen werden kannwg0
? - Die Regel, die
RELATED,ESTABLISHED
Datenverkehr zulässtwg0
, sollte immer nur auf Datenverkehr zutreffen, der als Antwort auf TCP:445 oder ICMP:Echo-Anforderung erfolgt. Es ist nicht nötig, hier spezifischer zu sein (z. B. übereinstimmender Port/Protokoll), oder? - Die Regel
ALLOW
für Echo-Antworten ist nicht erforderlich, da die weniger spezifische Regel, dieRELATED,ESTABLISHED
darüber liegenden Datenverkehr zulässt, davor zutrifft, oder? - Angesichts der Filterung der
FORWARD
Kette gehe ich davon aus, dass ich dienat
Tabellenkette nicht filtern mussPOSTROUTING
, da jeglicher Datenverkehr, der nicht für das NAS bestimmt ist, über TCP:445 oder ICM:echo-request ohnehin nicht „so weit“ kommt. Ist das richtig?
Antwort1
Um deine Fragen kurz zu beantworten:
- Ja
- Die
INPUT
/OUTPUT
-Ketten werden für Verbindungen zu/von lokalen Sockets verwendet aufalleSchnittstellen (lo
,eth0
,wg0
, usw.). Normalerweise möchten Sie nicht standardmäßig alles abgehende blockieren, da Sie am Ende Zeit mit der Fehlerbehebung bei Dingen verbringen, die Sie normalerweise für selbstverständlich halten (DNS, DHCP, NTP, verschiedene Prozesse, die Loopback-Verbindungen verwenden, usw.). RELATED,ESTABLISHED
Ja. Normalerweise ist es in Ordnung, einfach alles ohne zusätzliche Bedingungen zuzulassen (wenn Sie bereits eine Verbindung über eine Richtung zugelassen haben, sollten symmetrische Antworten in die andere Richtung auch in Ordnung sein).- Ja
- Ja
ich denke dasFlussdiagramm zur iptables-Verarbeitungwird Ihnen auch helfen, besser zu verstehen, wie das funktioniert:
So würde ich Ihre Regeln schreiben:
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