Quero configurar o firewall do CentOS 7 de forma que todas as solicitações recebidas sejam bloqueadas, exceto os endereços IP de origem que eu coloquei na lista de permissões. E para os endereços IP da lista branca, todas as portas devem estar acessíveis.
Consigo encontrar algumas soluções (não tenho certeza se funcionarão), iptables
mas o CentOS 7 usa o firewalld
. Não consigo encontrar algo semelhante para conseguir com firewall-cmd
o comando.
As interfaces estão em Zona Pública. Também já mudei todos os serviços para a zona Pública.
Responder1
Eu conseguiria isso adicionando fontes a uma zona. Primeiro verifique quais fontes existem para sua zona:
firewall-cmd --permanent --zone=public --list-sources
Se não houver nenhum, você pode começar a adicioná-los, esta é a sua "lista de permissões"
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
(Isso adiciona um /24
IP inteiro e único, apenas para que você tenha uma referência para uma sub-rede e um único IP)
Defina o intervalo de portas que você deseja abrir:
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp
Isso faz apenas as portas 1 a 22. Você pode ampliar isso, se desejar.
Agora, recarregue o que você fez.
firewall-cmd --reload
E verifique seu trabalho:
firewall-cmd --zone=public --list-all
Nota lateral/editorial: Não importa, mas eu gosto da zona "confiável" para um conjunto de IPs na lista branca no firewalld. Você pode fazer uma avaliação adicional lendosugestões do redhat sobre como escolher uma zona.
Veja também:
- Artigo RHEL 7 usando Firewalls
- Documentos do Fedora FirewallD(bastante bom, o fedora já usa o firewalld há algum tempo)
Se você quiser DROP
pacotes fora desta fonte, aqui está um exemplo para descartar aqueles fora do que /24
usei como exemplo anteriormente,você pode usar regras ricas para isso, Eu acredito. Isso é conceitual, não testei (além de ver que o centos 7 aceita o comando), mas deve ser fácil fazer um pcap e ver se ele se comporta como você esperaria
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
Responder2
Mesmo que uma resposta tenha sido aceita e votada positivamente, não creio que seja correta. Não consigo encontrar uma explicação clara na documentação, mas pelo comportamento implementado é assim:
- interface e fonte são usadas como seletores - quais zonas ativar
- ambos são ignorados para a zona padrão (sempre ativa)
Então a resposta seria:
- bloqueie a zona padrão, diga "pública" - nenhuma porta aberta ou serviços disponíveis
- em outra zona, diga "trabalhar" - defina as portas de origem e abertas
Por exemplo, supondo que a zona padrão seja pública e não tenha portas abertas, adicione origem e intervalo de portas à zona "de trabalho":
$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp
agora verifique as zonas ativas (a zona padrão está sempre ativa):
$ sudo firewall-cmd --get-active-zones
você terá:
work
sources: 192.168.0.0/24
portanto, as regras da zona de "trabalho" serão aplicadas à sub-rede específica. Você terá uma variedade de portas abertas para a "lista branca" =sub-redecomo pedido. E, claro, use --permanent
a opção nas --add-xxx
declarações para manter o comportamento.
Por sua vez, quaisquer portas ou serviços que você tenha na zona "pública" (padrão) serão aplicados a todas as interfaces e endereços de origem.
$ sudo firewall-cmd --list-all-zones
public (default)
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
work (active)
interfaces:
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
O mesmo sistema funciona para interfaces. Digamos adicionando a interface "ens3" à zona "work":
$ sudo firewall-cmd --zone=work --add-interface=ens3
você usará as regras da zona "trabalho" para quaisquer solicitações da interface específica - um seletor mais aproximado do que "fonte".
Responder3
Isenção de responsabilidade: na verdade, não tentei o que estou sugerindo aqui, mas está bastante próximo da última configuração do firewalld que fiz, então vou parar com isso. O Firewalld fornece algumas zonas pré-configuradas, apenas para essa finalidade. Há um chamado "drop", que descarta qualquer coisa que chegue, e outro chamado "trusted", que permitequalquerconexão (ou seja, você nem deveria precisar abrir portas individuais, eu acho). O truque é encontrar a zona certa para acionar o que você deseja.
O Firewalld aplicará as regras para uma zona com base na seguinte precedência:
- Se o IP de origem corresponder a um IP de origem vinculado a uma zona, ele o usará.
- Se o IP de origem não corresponder a nenhuma zona específica, ele verifica se há uma zona configurada para ointerfaceo pacote chegou. Se houver, ele usa isso.
- Por último, se nada mais corresponder, ele usa a zona padrão.
Então, primeiro, você deseja vincular seus IPs confiáveis à zona "confiável":
firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4
Em seguida, defina sua zona padrão como "drop" ou vincule sua interface a ela:
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0
e, em seguida, faça com que as alterações entrem em vigor (aviso: isso provavelmente interromperá sua conexão se você estiver fazendo isso pela rede e não tiver adicionado seu IP de origem à zona confiável):
firewall-cmd --reload
Claro, você também pode testá-los temporariamente, omitindo o "--permanent" (e então você também não precisa --reload).
Responder4
Estou surpreso que as respostas da zona confiável não sejam a resposta selecionada. A zona confiável tem um padrão "target: ACCEPT" enquanto o restante é "target: default". Embora isso realmente não importe, parece ser o método pretendido devido ao seu nome e valor alvo padrão.
Como bloquear rapidamente uma caixa para que somente você possa acessá-la:
firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones
Depois de listar todas as zonas, você deverá ver algo assim:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
sources: 1.2.3.4 5.6.7.8/24
masquerade: no
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eth1
masquerade: no
Nota: removi linhas com valor nulo/ausente. O importante é que trust e drop estejam ambos (ativos) e drop tenha sua interface pública.
O que isso faz com o iptables para demonstração:
Chain INPUT_ZONES_SOURCE (1 references)
target prot opt source destination
IN_trusted all -- 1.2.3.4 0.0.0.0/0
IN_trusted all -- 5.6.7.8/24 0.0.0.0/0
Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0