Eu tenho um servidor executando o Ubuntu 16.04 com um aplicativo que precisa apenas de conexões de saída para atualizações de pacotes e sincronização de horário NTP. Ele possui um endereço IPv6 dinâmico em uma interface de rede separada para essa finalidade. Todas as outras conexões são via LAN em outra interface, que não possui gateway para a WAN.
Eu gostaria de proteger esta máquina não permitindo quaisquer conexões de saída que não sejam para atualizações de pacotes e sincronização de tempo NTP.
No entanto, quando tento as seguintes regras, nada está sendo bloqueado:
ip6tables -A OUTPUT -o lo -p all -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
ip6tables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -p udp -m owner --uid-owner systemd-timesync -j ACCEPT
ip6tables -A OUTPUT -p tcp --dport 53 -j ACCEPT
ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT
while read p; do
ip6tables -A OUTPUT -d $p -j ACCEPT
done < firewall/hosts-to-allow.list
ip6tables -A OUTPUT -o ens18 -j REJECT
Observe que as solicitações icmpv6 de entrada são permitidas, mas todas as outras portas de entrada são bloqueadas.
Observe que, em um estado anterior desta pergunta, eu havia descartado erroneamente todos os pacotes primeiro depois de registrá-los.
As regras aplicadas são as seguintes:
Chain INPUT (policy ACCEPT 70 packets, 126K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all * lo ::/0 ::/0
8 536 ACCEPT icmpv6 * * ::/0 ::/0
67 6405 ACCEPT all * * ::/0 ::/0 state NEW,RELATED,ESTABLISHED
0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53
0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:53
0 0 ACCEPT udp * * ::/0 ::/0 owner UID match 100
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::11
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::11
0 0 ACCEPT tcp * * ::/0 2001:67c:1562::19
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT tcp * * ::/0 2001:67c:1562::16
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT tcp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT tcp * * ::/0 2001:67c:1560:8001::11
0 0 ACCEPT udp * * ::/0 2001:67c:1562::19
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::14
0 0 ACCEPT udp * * ::/0 2001:67c:1562::16
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::21
0 0 ACCEPT udp * * ::/0 2001:67c:1360:8001::17
0 0 ACCEPT udp * * ::/0 2001:67c:1560:8001::11
0 0 REJECT all * ens18 ::/0 ::/0 reject-with icmp6-port-unreachable
Chain LOGGING (0 references)
pkts bytes target prot opt in out source destination
Sua tabela OUTPUT começa imediatamente enviando todo o tráfego para ens18 para a tabela LOGGING, que procede ao log e, em seguida, descarta todo o tráfego.
Lembre-se que as regras do iptables são interpretadas em ordem. Como você já descartou todo o tráfego para ens18, nenhuma outra regra em OUTPUT é avaliada para esse tráfego.
Suspeito que uma regra de registro deva estar no final da tabela, e não no início. Claro que você já colocou uma regra de alvo REJECT lá, então você deve decidir qual delas você quer.
Eu também suspeito que você teria notado muito mais cedo se tivesse tentado se conectar ao seu servidor via IPv6 na interface afetada, pois teria notado imediatamente que nenhum tráfego estava fluindo ...
Além disso, depois de corrigir esse problema, você está permitindo explicitamente todo o tráfego nesta regra:
Isso corresponde a todos os estados de conexão válidos possíveis. Eu espero que você não queira permitir todas as
NEW
conexões, apenas aquelasRELATED
eESTABLISHED
aquelas que você permitir mais tarde.Você precisa remover
NEW
disso (e usar-m conntrack
em vez do obsoleto-m state
) e adicioná-lo às conexões de saída que deseja permitir, por exemplo:e