Permitir requisições UPnP e NAT-PMP em iptables

1

Eu tenho uma configuração de gateway OpenVPN com encaminhamento que funciona muito bem. Minha outra máquina se conecta através dela e chega à internet. Feito uma varredura da porta externa e nenhuma porta é visível no endereço VPN externo. Instalado o linux-igd (upnpd) na máquina do gateway. Se eu definir iptables -P INPUT ACCEPT funciona como charme a porta é aberta e encaminhada para o cliente. Mas, em vez disso, quero criar regras reais para a solicitação UPnP.

Isto é o que meu iptables parece:

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Então, adiciono uma regra de log para ver o que é descartado do cliente (192.168.0.6):

sudo iptables -A INPUT -i eth0 -s 192.168.0.6 -j LOG --log-prefix "DROPPED: "

Reinicie o serviço e o cliente openvpn e, em seguida, o log mostrará isso:

Mar 19 07:32:55 raspberrypi kernel: [ 6954.935598] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b0:b0:40:00:40:11:08:1c SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45232 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:32:55 raspberrypi kernel: [ 6954.939366] DROPPED: IN=eth0 OUT= MAC=01:00:5e:7f:ff:fa:b8:27:eb:6b:f9:a6:08:00:45:00:00:a5:b9:6a:40:00:01:11:0f:35 SRC=192.168.0.6 DST=239.255.255.250 LEN=165 TOS=0x00 PREC=0x00 TTL=1 ID=47466 DF PROTO=UDP SPT=54192 DPT=1900 LEN=145
Mar 19 07:33:03 raspberrypi kernel: [ 6962.293068] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:a0:40:00:40:11:06:2c SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45728 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:03 raspberrypi kernel: [ 6962.626402] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:b6:40:00:40:11:06:16 SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45750 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:03 raspberrypi kernel: [ 6962.959560] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:be:40:00:40:11:06:0e SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45758 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:04 raspberrypi kernel: [ 6963.293411] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:d5:40:00:40:11:05:f7 SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45781 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:04 raspberrypi kernel: [ 6963.627138] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b2:d6:40:00:40:11:05:f6 SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45782 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10
Mar 19 07:33:11 raspberrypi kernel: [ 6970.968277] DROPPED: IN=eth0 OUT= MAC=b8:27:eb:b0:98:45:b8:27:eb:6b:f9:a6:08:00:45:00:00:1e:b3:5f:40:00:40:11:05:6d SRC=192.168.0.6 DST=192.168.0.172 LEN=30 TOS=0x00 PREC=0x00 TTL=64 ID=45919 DF PROTO=UDP SPT=51251 DPT=5351 LEN=10

Então eu vejo que ele faz uma transmissão no UDP 1900 e, em seguida, tenta se conectar ao UDP 5351. Então eu insiro essas duas regras antes da regra de log:

sudo iptables -I INPUT 4 -i eth0 -p udp --dport 1900 -j ACCEPT
sudo iptables -I INPUT 4 -i eth0 -p udp --dport 5351 -j ACCEPT

Nada é falsificado até a regra de log, de modo que, até onde eu saiba, nada está bloqueado, mas o UPnP não está funcionando. Se eu apenas fizer:

sudo iptables -P INPUT ACCEPT

Tudo funciona muito bem! Eu também tentei isso, mais ou menos todos os números de porta relacionados a isso eu poderia encontrar em toda e qualquer documentação ...

sudo route add -net 239.0.0.0 netmask 255.0.0.0 eth0

sudo iptables -A INPUT -i eth0 -p tcp --dport 2869 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 5000 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 49152:49154 -j ACCEPT

sudo iptables -A INPUT -i eth0 -p udp --dport 1900 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p udp --dport 5351 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p udp --dport 5353 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 2869 -j ACCEPT

Alguma ideia ou sugestão?

    
por Kristofer Källsbo 19.03.2016 / 08:43

1 resposta

1

Então eu finalmente descobri o que estava errado! Eu defino a política padrão da cadeia de entrada para aceitar.

sudo iptables -P INPUT ACCEPT

Em seguida, adicionei essas duas linhas na parte inferior da minha cadeia INPUT:

iptables -A INPUT -j LOG --log-prefix "INPUT:DROP:" --log-level 6
iptables -A INPUT -j DROP

Então eu abri uma segunda janela SSH e fiz uma cauda no log:

tail -f /var/log/messages

A primeira coisa que notei foi que o tráfego de 127.0.0.1 originado na interface lo foi bloqueado, totalmente perdido para adicionar isso. Então eu adicionei isso:

iptables -I INPUT 1 -i lo -j ACCEPT

Depois, executei a solicitação UPnP várias vezes de dentro para ver o que estava sendo bloqueado. Acabou com estas duas regras:

sudo iptables -A INPUT -i eth0 -p udp -m multiport --dports 1900,5351,5353 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp -m multiport --dports 49152 -j ACCEPT

Espero que ajude alguém!

    
por 19.03.2016 / 22:09