No Debian 9, instalei firewalld
(versão 0.4.4.2-1
).
sudo firewall-cmd --get-active-zones
não mostra saída. E echo $?
mostra que o status de saída era 0 ( EXIT_SUCCESS
). Por quê?
Eu tenho uma interface de rede eth0
, que é mostrada por ip link
(assim como a interface de loopback lo
).
Devo dizer que minha configuração de firewall parece estar funcionando principalmente. FWIW, alterei a zona padrão de public
para MyZone
, definida da seguinte forma:
$ sudo cat /etc/firewalld/zones/MyZone.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>My Zone</short>
<service name="ssh"/>
<service name="https"/>
<!-- ... -->
</zone>
Se eu tentar me conectar usando outro computador, terei permissão para acessar os serviços SSH e HTTPS. E se eu rodar ncat -l -p 8000
no servidor, e tentar conectar com ncat my-server 8000
, a conexão é bloqueada corretamente. ( Ncat: No route to host.
E tcpdump
mostra que uma resposta inacessível ICMP é gerada, digite "admin proibido").
Por que firewall-cmd --get-active-zones
não está mostrando MyZone como ativo?
$ sudo firewall-cmd --state
running
$ sudo firewall-cmd --get-active-zones
$ echo $?
0
$ sudo firewall-cmd --get-default-zone
MyZone
$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:43:01:c0:ab brd ff:ff:ff:ff:ff:ff
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fd5e:fcf3:b885:0:250:43ff:fe01:c0ab/64 scope global mngtmpaddr dynamic
valid_lft forever preferred_lft forever
inet6 fe80::250:43ff:fe01:c0ab/64 scope link
valid_lft forever preferred_lft forever
firewalld.service
não registra nenhum aviso.
$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2019-01-30 13:17:31 GMT; 56min ago
Docs: man:firewalld(1)
Main PID: 509 (firewalld)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/firewalld.service
└─509 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
Jan 30 13:17:21 brick systemd[1]: Starting firewalld - dynamic firewall daemon...
Jan 30 13:17:31 brick systemd[1]: Started firewalld - dynamic firewall daemon.
Vejo que firewalld
prefere ser usado com o NetworkManager. Não estou executando o NetworkManager no momento, e parece que isso é um pouco frágil.
https://firewalld.org/documentation/concepts.html
Se o NetworkManager não for usado, existem algumas limitações... Se o firewalld for iniciado depois que a rede já estiver ativa, as conexões e as interfaces criadas manualmente não serão vinculadas a uma zona.
No entanto, reiniciei pelo menos uma vez desde a instalação do firewalld
. Verifiquei o systemd
serviço. firewalld.service
é iniciado Before=network-pre.target
. networking.service
é iniciado After=network-pre.target
. Eu confirmei que firewalld
é iniciado antes networking.service
:
$ sudo journalctl -b -u networking -u firewalld
-- Logs begin at Sat 2019-01-26 04:15:01 GMT, end at Wed 2019-01-30 14:15:33 GMT. --
Jan 30 13:17:21 brick systemd[1]: Starting firewalld - dynamic firewall daemon...
Jan 30 13:17:31 brick systemd[1]: Started firewalld - dynamic firewall daemon.
Jan 30 13:17:31 brick systemd[1]: Starting Raise network interfaces...
Jan 30 13:17:37 brick systemd[1]: Started Raise network interfaces.
Não reiniciei manualmente a rede ou executei ifdown
/ ifup
e não estou executando ifplugd
. Os logs do kernel (abaixo) dizem que o link ethernet está ativo e o IPv6 está em execução continuamente desde a inicialização.
$ sudo dmesg|grep eth0
[ 4.082350] mv643xx_eth_port mv643xx_eth_port.0 eth0: port 0 with MAC address 00:50:43:01:c0:ab
[ 47.577570] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 49.981569] mv643xx_eth_port mv643xx_eth_port.0 eth0: link up, 1000 Mb/s, full duplex, flow control disabled
[ 49.991543] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Eu nem estou usando DHCP. A configuração para eth0
in /etc/network/interfaces
é
auto eth0
iface eth0 inet static
address 172.16.1.8
netmask 255.255.255.0
gateway 172.16.1.1
dns-nameservers 172.16.1.1
Eles não estão brincando.
Na ausência do NetworkManager, o documento da página da Web continua dizendo que você deve duplicar/manter a consistência entre a configuração em dois locais diferentes.
Além disso, o primeiro dos dois lugares é o
ifcfg
sistema de configuração de rede, que não existe no Debian. Por implicação, o NetworkManager é necessário no Debian :-).(Sintetizando várias informações, fica claro que a configuração duplicada em
/etc/firewalld/
, é necessária apenas no caso de você iniciar manualmentefirewalld
após a interface de rede ter sido iniciada. Isso inclui se você reiniciarfirewalld
, embora normalmente prefira não reiniciarfirewalld
.)Por um lado, provavelmente é justo esperar o comportamento específico "principalmente trabalhando" que foi observado na pergunta. Com base em outra documentação e observações adicionais, você pode esperar que a zona padrão seja aplicada à(s) sua(s) interface(s).
No Debian sem NetworkManager, atribuir uma interface a uma zona diferente provavelmente parecerá funcionar no sistema em execução, mas não funcionará quando você reiniciar.
Você pode querer ter mais do que "expectativas razoáveis" para seu firewall. É mais reconfortante se você puder usar a configuração "recomendada", que provavelmente obtém melhores testes quando
firewalld
alterada, e não precisa confiar em um comportamento tão confuso.E continuo confuso com as implicações disso, inclusive para os sistemas Red Hat. É extremamente confuso que
firewall-cmd --permanent --add-interface=...
possa mostrar literalmente o resultado "success
", quando não conseguiu salvar a configuração da zona corretamente!Aqui está a citação relevante em
man firewalld
:Como experimento, tentei o comando mencionado:
Esse comportamento é o que você esperaria da documentação se minha interface de rede tivesse sido iniciada após o
firewalld
. No entanto, minha interface de rede não foi iniciada após ofirewalld
.A
man
página faz parecer quefirewalld
depende de obter retornos de chamadaifcfg
quando inicia uma interface de rede. No entantoifcfg
, é o sistema de rede da Red Hat; ele não está instalado no meu sistema Debian. Parece que ofirewalld
pacote Debian não fornece nenhum equivalente. Portanto, degradamos para "as interfaces serão tratadas automaticamente pela zona padrão".Corri
sudo iptables-save
para ver as regras do iptables (somente IPv4) geradas pelofirewalld
. Se eu não tiver executado manualmentefirewall-cmd --add-interface...
, não há menção aoeth0
. Mas se eu ler corretamente, as regras tratam tais pacotes usando as regras da zona padrão, como um fallback.Se você não colocou nenhum arquivo de configuração em
/usr/lib/firewalld/zones
ou/etc/firewalld/zones
você não tem nenhuma zona configurada. Tudo que você teria é um firewall genérico. Ainda é eficaz dependendo das regras que você possui, apenas não há como alternar de público para privado ou qualquer outra zona que você possa ter configurado e fazer com que as regras sejam alteradas automaticamente.Além disso, se você usou uma GUI para configurar o firewall, apenas verifique esses diretórios para garantir que as configurações que você definiu foram realmente implementadas.
Se você colocar manualmente os arquivos de configuração lá ou o gerenciador de configurações da GUI colocar com êxito os arquivos para as zonas que você configurou, não tenho ideia.
Verifique:
iptables -S
, o que há? Se houver regras listadas, é um firewall genérico! Você não precisa de firewalld para ter um firewall, você pode editar manualmente o iptables.Em seguida, instale
iptables-persistent
e salve suas regras após cada edição comnetfilter-persistent save
A política padrão na maioria dos sistemas é (PUBLIC):
Então você pode elaborar com regras na forma de cadeias.
Sintaxe:
Exemplo: (permitir todo o SSH de entrada na porta padrão não é uma boa prática para segurança)