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