Endereços IP de origem da lista de permissões no CentOS 7

23

Desejo configurar o firewall do CentOS 7 para que todas as solicitações recebidas sejam bloqueadas, exceto pelos endereços IP de origem que eu incluo na lista de permissões. E para os endereços IP da lista de permissões, todas as portas devem estar acessíveis.

Eu consigo encontrar algumas soluções (não tenho certeza se elas funcionarão), iptablesmas o CentOS 7 usa firewalld. Não consigo encontrar algo semelhante para obter com o firewall-cmdcomando.

As interfaces estão na zona pública. Eu também mudei todos os serviços para a zona Pública.

Krishnandu Sarkar
fonte

Respostas:

44

Eu faria 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, você poderá começar a adicioná-los. Esta é 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 /24IP inteiro e um ú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 apenas executa 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 listados em branco no firewalld. Você pode fazer uma avaliação adicional lendo as sugestões da redhat sobre como escolher uma zona .

Veja também:


Se você gostaria de DROPpacotes fora desta fonte, aqui está um exemplo para descartar aqueles fora do que /24eu usei como exemplo anteriormente, você pode usar regras valiosas para isso , acredito. Isso é conceitual, eu não testei (além de ver que o centos 7 aceita o comando), mas deve ser fácil o suficiente para 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'
dougBTV
fonte
Muito obrigado por responder. Não é possível votar devido à falta de reputação. Mas como descartar todos os outros IPs, exceto o que adicionei usando fontes?
Krishnandu Sarkar
Obrigado @KrishnanduSarkar - você está certo, por padrão, deve ser uma rejeição do ICMP. Mas acho que você pode adicionar uma regra rica para descartar os pacotes. Adicionei um exemplo à minha resposta que acho que funcionará. Obrigado pelo voto positivo, eu entendo, se uma resposta funcionar, considere aceitar uma resposta.
DougBTV
Ótima resposta, eu estava usando o iptables até agora.
Tensigh
(!) Esta resposta não funcionará como esperado para a configuração padrão atual do FirewallD (as interfaces são atribuídas à zona pública por padrão).
dess
24

Mesmo que uma resposta tenha sido aceita e aprovada, não acho que seja correta. Não consigo encontrar uma explicação clara na documentação, mas, a partir do comportamento implementado, é assim:

  1. interface e fonte são usados ​​como seletores - em quais zonas ativar
  2. ambos são ignorados para a zona padrão (sempre ativa)

Então a resposta seria:

  1. bloquear a zona padrão, dizer "público" - nenhuma porta aberta ou serviços disponíveis
  2. em outra zona, diga "trabalho" - defina portas de origem e abertas

Por exemplo, supondo que a zona padrão seja pública e não tenha portas abertas, adicione a fonte e o intervalo de portas à zona "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 "trabalho" serão aplicadas à sub-rede específica. Você terá um intervalo de portas abertas para a "lista branca" = sub-rede, conforme solicitado. E é claro, use a --permanentopção em--add-xxx declarações para manter o comportamento.

Por sua vez, todas as portas ou serviços que você possui na zona "pública" (padrão) serão aplicadas 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. Diga adicionando a interface "ens3" à zona "work":

$ sudo firewall-cmd --zone=work --add-interface=ens3

você usará as regras de zona "trabalho" para todas as solicitações da interface específica - seletor mais áspero do que "origem".

Normunds Kalnberzins
fonte
4
Esta é a melhor resposta. A parte mais crucial é a explicação de que a configuração de uma interface amplia o acesso (caso as fontes sejam definidas). Eu tive um problema que as portas estavam acessíveis, mesmo que eu tivesse uma sourceslista de permissões. O motivo foi que a zona tinha uma interface atribuída.
pinkeen
1
Para estar exatamente correta, essa resposta precisa remover todos os serviços padrão da publiczona, se houver algum (esses serviços estarão disponíveis para todos os endereços, pois as interfaces são atribuídas à publiczona por padrão). Ou mude a zona padrão para outra: blockou drop(essa é uma prática comum). Ou mude o publicdestino da zona para %%REJECT%%ou DROP.
dess 25/09
6

Isenção de responsabilidade: Na verdade, eu não tentei o que estou sugerindo aqui, mas é bastante próximo da última configuração de firewall que eu fiz, então vou desistir disso. O Firewalld fornece algumas zonas pré-configuradas, apenas para essa finalidade. Há um chamado "drop", que descarta qualquer coisa que entra, e um chamado "confiável", que permite qualquer conexão (ou seja, você não precisa nem abrir portas individuais, eu acho). O truque é conseguir 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 será utilizado.
  • Se o IP de origem não corresponder a nenhuma zona específica, ele verifica se há uma zona configurada para a interface o pacote entrou. Se houver, ele usa isso.
  • Por fim, se nada mais corresponder, ele usará a zona padrão.

Portanto, 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 faça as alterações entrarem em vigor (aviso: isso provavelmente interromperá sua conexão se você estiver fazendo isso pela rede e não tiver adicionado o IP de origem à zona confiável):

firewall-cmd --reload

Obviamente, você também pode testá-las temporariamente, omitindo o "--permanent" (e também não precisa - recarregar).

Jemenake
fonte
blocktambém pode ser usado (em vez de drop) se você quiser dizer às outras máquinas que você não está falando com eles ....
van den Berg Gert
5

Eu opero meus firewalls dessa maneira. Aqui está o meu método preferido para realizar o que você deseja.

# firewall-cmd --list-all

Você verá que sua zona padrão é pública e os serviços ativados são dhcpv6-client e ssh. Não queremos serviços públicos disponíveis, certo? Somente os IPs da lista de permissões estão autorizados. Então, vamos remover os dois serviços públicos.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Agora, vamos colocar na lista branca um IP específico que conceda acesso a qualquer porta.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Agora, vamos adicionar outro IP à lista de permissões, que queremos apenas ter acesso ao acesso SSH, http e https. Nenhuma outra porta.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Se você estiver se conectando via SSH, certifique-se de autorizar seu IP antes de aplicar seu novo conjunto de regras. Quando estiver pronto para aplicar as novas regras.

#firewall-cmd --reload
Sagaponack FX
fonte
2

Você pode gerenciar facilmente pelo Rich Rule.

Primeiro passo

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Segunda etapa - Adicionar regra rica

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

Toda porta é acessível por 192.168.2.2 depois de adicionar uma regra avançada e bloquear todas as portas de outra origem.

Se você adicionar qualquer porta ou serviço pelo comando abaixo, ele será acessível por todas as fontes.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Se você deseja abrir uma porta específica para o comando Ip than than below

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
Ranjeet Ranjan
fonte
2

A resposta principal da dougBTV está errada. Não consigo responder à resposta dele porque ainda não tenho os pontos de representante necessários, por isso vou explicar aqui:

Ele está usando a zona padrão "public". Ele está amarrando redes a essa zona e, em seguida, abrindo portas nessa zona. Mas, em uma configuração padrão, todo o tráfego passa pela zona padrão, não apenas pelas redes de origem que você vincula a ela. Portanto, seus comandos --add-source não fazem diferença e seus comandos --add-port agora permitem que o mundo inteiro acesse essas portas.

A segunda resposta de Normunds Kalnberzins está correta. Você deseja criar uma zona separada, vincular sua rede / IP a essa zona e abrir as portas nessa zona.

Como alternativa, você pode deixar tudo na zona padrão e usar as regras avançadas do firewalld para permitir o acesso de determinados IPs:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Isso permite todo o tráfego de 192.168.2.2 para todas as portas e, como eu não especifiquei uma zona, ela será aplicada à zona padrão "public" (use --get-default-zone para verificar qual é sua zona padrão e - obter zonas ativas para ver quais zonas estão em uso no momento).

Para permitir o acesso desse IP apenas a uma porta específica, eu faria:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

A melhor prática é executar esses comandos sem --permanent (ou --perm for short) que afeta o firewall atualmente em execução. Após testar se sua regra está funcionando, execute-a novamente com --perm anexado para que seja lembrado nas recargas subsequentes do firewalld.

devhen
fonte
1

Apenas para adicionar à resposta de Normunds:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Para bloquear todo o outro tráfego:

$ sudo firewall-cmd --set-default-zone=drop

Aviso: se você acessar da máquina remota, isso poderá desconectar sua sessão de login. Se você não obteve a configuração IP da zona 'trabalho' corretamente, não poderá se conectar ao seu servidor.

Para recarregar o firewall:

$ sudo firewall-cmd --reload

Não consegui descobrir como adicionar dois IPs diferentes com '--add-rich-rule'.

SongLiAtDuke
fonte
Para a configuração padrão atual do FirewallD, pode não ser suficiente. Veja meu comentário na resposta de Normunds para obter detalhes.
dess 25/09
para vários IPs usar criar um ipsetcomo firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipips adicionar aos ipset com firewall-cmd --ipset=blacklist --add-entry=192.168.1.4então você pode usarfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye
0

Estou surpreso que as respostas da zona confiável não sejam a resposta selecionada. A zona confiável tem um "destino: ACEITAR" padrão, enquanto o restante é "destino: padrão". Embora 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 um valor nulo / ausente. O importante é que confiável e drop são ativos (ativos) e drop possui 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
Kirin
fonte