Я запускаю сервер WireGuard на своем Raspberry Pi, используя образ https://github.com/linuxserver/docker-wireguard. Я хочу разрешить одноранговым узлам делать две вещи:
Я написал следующие правила 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 я могу пропинговать и подключить NAS через SMB, но я не могу пропинговать любую другую службу в сети или получить доступ к HTTP-интерфейсу NAS.
Однако у меня есть несколько вопросов, чтобы точно понять, что я сделал.:
INPUT
/ OUTPUT
на DROP
ничего не работает. Я предполагаю, что это связано с тем, что пакеты WireGuard UDP, полученные на wg0
, отбрасываются политикой?ALLOW
трафику из/в wg0
, эффектом будет то, что контейнер не сможет подключиться ни к чему через eth0
и только FORWARD
трафик из wg0
?RELATED,ESTABLISHED
трафик через wg0
, должно соответствовать только трафику, полученному в ответ на TCP:445 или ICMP:echo-запрос. Нет необходимости быть более конкретным здесь (, например. соответствующий порт/протокол), верно?ALLOW
для эхо-ответов не требуется, потому что менее конкретное правило, разрешающее RELATED,ESTABLISHED
трафик над ним, будет совпадать перед ним, верно?FORWARD
я предполагаю, что мне не нужно фильтровать цепочку nat
таблиц POSTROUTING
, потому что любой трафик, который не предназначен для NAS по любой TCP:445 или ICM:echo-request не зайдут так далеко. Это правильно?Кратко отвечу на ваши вопросы:
INPUT
/OUTPUT
для подключений к/от локальных сокетов на все интерфейсы (lo
, eth0
, wg0
и т. д. ). Обычно вы не хотите блокировать весь исходящий трафик по умолчанию, потому что в конечном итоге вы потратите время на устранение неполадок, которые вы обычно считаете само собой разумеющимся (DNS, DHCP, NTP, различные процессы, использующие петлевые соединения и т. д.)RELATED,ESTABLISHED
без каких-либо дополнительных условий (, если вы уже разрешили соединение в одну сторону, симметричные ответы, идущие в обратном направлении, тоже должны быть приемлемыми)I думаю, что эта блок-схема обработки 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