bloquear todos os ips, exceto alguns, com firewalld

17

Em uma máquina em rede Linux, eu gostaria de restringir o conjunto de endereços na zona "pública" (conceito firewalld), que têm permissão para alcançá-la. Portanto, o resultado final seria que nenhuma outra máquina possa acessar nenhuma porta ou protocolo, exceto aqueles explicitamente permitidos, como uma mistura de

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.120" drop'

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.105" drop'

O problema acima é que essa não é uma lista real, ela bloqueará tudo, pois se um endereço for bloqueado por não ser o mesmo que o outro, gerando um efeito acidental de "soltar tudo", como eu "desbloquear" um elemento não específico conjunto contíguo? a fonte aceita uma lista de endereços? até agora, não vejo nada na minha olhada nos documentos ou no resultado do google.


EDIT: Acabei de criar isso:

# firewall-cmd  --zone=encrypt --list-all
encrypt (active)
  interfaces: eth1
  sources: 192.168.56.120
  services: ssh
  ports: 6000/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

Mas ainda posso alcançar a porta 6000 .123 , pois minha intenção era que, se uma fonte não estiver listada, ela não conseguiria acessar nenhum serviço ou porta

Mike
fonte

Respostas:

24

As regras ricas não são necessárias.

Se você deseja restringir uma região a um conjunto específico de IPs, simplesmente defina esses IPs como fontes para a própria zona (e remova qualquer definição de interface que possa estar presente, pois elas substituem os IPs de origem).

Você provavelmente não deseja fazer isso na zona "pública", no entanto, uma vez que isso significa semanticamente que os serviços públicos sejam abertos ao mundo.

Em vez disso, tente usar uma zona diferente, como "interno", para endereços IP na maior parte confiáveis, para acessar serviços potencialmente sensíveis, como o sshd. (Você também pode criar suas próprias zonas.)

Aviso: não confunda a zona "confiável" especial com a zona "interna" normal. Quaisquer fontes adicionadas à zona "confiável" serão permitidas em todas as portas; adicionar serviços à zona "confiável" é permitido, mas não faz sentido fazê-lo.

firewall-cmd --zone=internal --add-service=ssh
firewall-cmd --zone=internal --add-source=192.168.56.105/32
firewall-cmd --zone=internal --add-source=192.168.56.120/32
firewall-cmd --zone=public --remove-service=ssh

O resultado disso será uma zona "interna" que permite o acesso ao ssh, mas apenas a partir dos dois endereços IP fornecidos. Para torná-lo persistente, execute novamente cada comando com --permanentanexado.

Michael Hampton
fonte
esclareça o que você quer dizer com "definição de interface que pode estar presente", iv tentei sua sugestão, consulte minha edição.
6153 Mike
@ Mike Como eu disse, você precisa remover eth1da zona. firewall-cmd --zone=encrypt --remove-interface=eth1
Michael Hampton
bem, a zona de criptografia é a nova zona, antes de eth1 estar em público, eu a mudei de pública para criptografada, então criptografar tem a fonte .120, pensei que apenas 120 deveriam chegar à porta, o que estou perdendo?
06515 Mike mike
1
Se você colocar a interface na zona, qualquer coisa que chegue pela interface poderá acessar as portas e serviços adicionados à zona, independentemente do endereço IP. Portanto, provavelmente pertence ao público, onde estava originalmente.
Michael Hampton
ahh, então as fontes aceitas ainda serão permitidas, mesmo que a interface seja colocada em público, e as fontes de aceitação sejam colocadas em uma fonte confiável diferente?
6153 Mike mike
1

Conforme firewalld.richlanguage:

Fonte de origem [not] address = "address [/ mask]"

   With the source address the origin of a connection attempt can be limited to the source address. An address is either a single IP address, or a network IP address. The address has to match the rule family (IPv4/IPv6). Subnet mask is expressed in either
   dot-decimal (/x.x.x.x) or prefix (/x) notations for IPv4, and in prefix notation (/x) for IPv6 network addresses. It is possible to invert the sense of an address by adding not before address. All but the specified address will match then.

Especifique uma máscara de rede para o endereço para permitir blocos contíguos.

Fora isso, você pode tentar criar uma ipsetlista não contígua de IPs permitidos.

Por exemplo, em /etc/firewalld/direct.xml:

<?xml version="1.0" encoding="utf-8"?>
<direct>
   <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-m set --match-set whitelist src -j ACCEPT</rule>
</direct>

O real ipsetdeve ser criado separadamente.

dawud
fonte
isso iria rejeitar, o que eu preciso é o inverso, aceitar se no conjunto,
mike
0

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