Estou executando um servidor WireGuard no meu Raspberry Pi usando ohttps://github.com/linuxserver/docker-wireguardimagem. Quero permitir que os colegas façam duas coisas:
- Conecte-se a um único NAS via SMB
- Faça ping no mesmo NAS
Eu escrevi as seguintes regras de iptables para arquivar isso ( wg0
é a interface WireGuard, eth0
aquela "em direção" à minha rede):
# 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
Eles funcionam, portanto, quando conectado via WireGuard, posso executar ping e montar o NAS via SMB, mas não consigo executar ping em nenhum outro serviço na rede ou acessar a interface HTTP do NAS.
No entanto, tenho algumas perguntas para entender exatamente o que fiz:
- Ao definir
INPUT
/OUTPUT
política comoDROP
, nada funciona. Minha suposição é que é porque os pacotes UDP do WireGuard recebidoswg0
são descartados pela política. - Se eu definir a política de qualquer maneira e adicionar uma regra ao
ALLOW
tráfego de/parawg0
, o efeito será que o contêiner não poderá se conectar a nada viaeth0
e somenteFORWARD
ao tráfego dewg0
? - A regra que permite
RELATED,ESTABLISHED
o tráfegowg0
deve corresponder apenas ao tráfego que responde a TCP:445 ou ICMP:echo-request. Não há necessidade de ser mais específico (por exemplo, porta/protocolo correspondente), certo? - A regra
ALLOW
de respostas de eco não é necessária porque a regra menos específica que permiteRELATED,ESTABLISHED
o tráfego acima dela corresponderá antes dela, certo? - Com toda a filtragem na
FORWARD
cadeia, minha suposição é que não preciso filtrar na cadeianat
de tabelasPOSTROUTING
, porque qualquer tráfego que não seja para o NAS em TCP:445 ou ICM:echo-request não será executado. "até aqui" de qualquer maneira. Isso está correto?
Responder1
Para responder brevemente às suas perguntas:
- Sim
- As cadeias
INPUT
/OUTPUT
são usadas para conexões de/para soquetes locais emtodosinterfaces (lo
,eth0
,wg0
, etc). Normalmente, você não deseja bloquear tudo o que sai por padrão, porque acabará gastando tempo solucionando problemas que normalmente considera garantidos (DNS, DHCP, NTP, processos diversos usando conexões de loopback, etc.) - Sim. Normalmente, não há problema em permitir tudo
RELATED,ESTABLISHED
sem quaisquer condições adicionais (se você já permitiu uma conexão de uma maneira, respostas simétricas voltando para o outro lado também devem servir) - Sim
- Sim
eu acho istofluxograma de processamento iptablestambém ajudará você a entender melhor como isso funciona:
É assim que eu escreveria suas regras:
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