Antecedentes
Ao pesquisar isso, parece que você não pode restringir o tráfego de saída usando os comandos básicos do firewalld. Várias fontes confirmam isso:
- Como abandonar as conexões de saída com o Firewalld
- Compreendendo o Firewalld em configurações multizona}
- Regras do Firewalld OutBound
Seu único recurso é usar os comandos firewall-cmd --direct ...
, que fazem pouco mais do que facilitar iptables
regras para você. Dado isso, você tem a opção de fazer isso através do Firewalld ou apenas fazer isso usando quaisquer métodos que você tenha empregado anteriormente ao usar iptables
.
OBSERVAÇÃO: as regras diretas serão semelhantes a isto:
$ firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 0 -d 74.125.136.99/32 -p tcp -m tcp --dport=80 -j DROP
Solução potencial
Se você puder relaxar o requisito de impedir o host de qualquer comunicação de saída, poderá obter a maior parte do que deseja da seguinte forma usando os comandos básicos firewall-cmd
.
NOTA: No meu exemplo eu tenho 3 nós:
- 192.168.56.101 - VM # 1 - servidor com regras de Firewalld
- 192.168.56.102 - VM # 2
- 192.168.56.1 - meu laptop
$ firewall-cmd --permanent --zone=internal --add-source=192.168.56.101/32
$ firewall-cmd --permanent --zone=internal --add-source=192.168.56.1/32
$ firewall-cmd --permanent --zone=internal --add-port=8080/tcp
$ firewall-cmd --zone=public --set-target=DROP
Com essa configuração, posso acessar a VM nº 1 do meu laptop, mas não consigo em nenhum outro lugar, como na VM nº 2.
zona padrão$ firewall-cmd --get-default-zone
public
zonas ativas
$ firewall-cmd --get-active-zones
internal
sources: 192.168.56.101/32 192.168.56.1/32
public
interfaces: eth0 eth1
configuração da zona pública
$ firewall-cmd --zone=public --list-all
public (active)
target: DROP
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
configuração da zona interna
$ firewall-cmd --zone=internal --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 192.168.56.101/32 192.168.56.1/32
services: ssh mdns samba-client dhcpv6-client
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
alvo padrão da zona pública
$ firewall-cmd --permanent --get-target
DROP
Teste
Para testar essa configuração, usarei nc
(ncat) para criar um 'listener daemon' na porta 8080 e use os comandos curl -v telnet://...
para atuar como clientes que se conectarão a esses ouvintes.
OBSERVAÇÃO: Isso é apenas para ilustrar que as coisas estão funcionando conforme o esperado e podem ser removidas posteriormente.
Na VM # 1:$ nc -4 -l -p 8080 -k
Agora, no aviso da VM nº 2, não podemos nos conectar:
$ timeout 1 curl -v telnet://192.168.56.101:8080
* About to connect() to 192.168.56.101 port 8080 (#0)
* Trying 192.168.56.101...
$
Enquanto no laptop, podemos:
$ timeout 1 curl -v telnet://192.168.56.101:8080
* Rebuilt URL to: telnet://192.168.56.101:8080/
* Trying 192.168.56.101...
* Connected to 192.168.56.101 (192.168.56.101) port 8080 (#0)
$
A única pegadinha com essa abordagem é que o nó VM # 1 ainda pode sair:
$ timeout 2 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=26.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=25.6 ms
$
$ timeout 1 curl -v telnet://www.google.com:80
* About to connect() to www.google.com port 80 (#0)
* Trying 216.58.217.164...
* Connected to www.google.com (216.58.217.164) port 80 (#0)
$