usando firewalld e firewall-cmd como adicionar regra à cadeia INPUT primária não INPUT_direct

1

então, depois de ler a man page do firewall e a documentação do fedora, entendi que para adicionar uma regra personalizada ao firewall com argumentos específicos, eu preciso usar a estrutura

 firewall-cmd [--permanent] --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>

O que estou tentando especificamente é criar uma regra personalizada com correspondência geográfica para bloquear todos os países que não são originários dos EUA. Antes de fazer isso, preciso primeiro adicionar uma regra de correspondência que permita o acesso da minha rede local, pois estou controlando o servidor por meio do ssh em uma rede privada local, portanto, adiciono uma regra assim

 firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.0.0/24 -j ACCEPT

eu então adiciono uma segunda regra assim

 firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -m geoip ! --src-cc US -j DROP

estes adicionam à cadeia de entrada, mas adicionam sob uma subcadeia chamada INPUT_direct, esta subcadeia é listada na lista genérica de regras INPUT inalterada como 3ª e uma rápida

 iptables -L INPUT

mostra a cadeia INPUT como esta

 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
 ACCEPT     all  --  anywhere             anywhere
 INPUT_direct  all  --  anywhere             anywhere
 INPUT_ZONES_SOURCE  all  --  anywhere             anywhere
 INPUT_ZONES  all  --  anywhere             anywhere
 ACCEPT     icmp --  anywhere             anywhere
 DROP       all  --  anywhere             anywhere             ctstate INVALID
 REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

e o INPUT_direct como

 Chain INPUT_direct (1 references)
 target     prot opt source               destination
 ACCEPT     all  --  192.168.0.0/24         anywhere
 DROP       all  --  anywhere             anywhere             -m geoip ! --source-country US

isso pode funcionar para alguns, mas se eu correr

 ping france.fr

Eu tenho como resultado

 PING france.fr (46.18.192.148) 56(84) bytes of data.
 64 bytes from ns1-sgg.produhost.net (46.18.192.148): icmp_seq=1 ttl=52 time=136 ms
 64 bytes from ns1-sgg.produhost.net (46.18.192.148): icmp_seq=2 ttl=52 time=135 ms
 64 bytes from ns1-sgg.produhost.net (46.18.192.148): icmp_seq=3 ttl=52 time=136 ms

isso é mais do que provável devido à regra INPUT # 1

 iptables  -L INPUT 1

 ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Eu percebo que eu poderia simplesmente aplicar o mesmo conjunto de regras personalizado à cadeia OUTPUT e bloquear a solicitação de ping para france.fr ou qualquer coisa externa aos EUA, mas como eu poderia adicionar o conjunto de regras para basear a cadeia de entrada

 iptables -L INPUT

mostra isso ao invés

 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 ACCEPT     all  --  192.168.0.0/24         anywhere
 DROP       all  --  anywhere             anywhere             -m geoip ! --source-country US
 ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
 ACCEPT     all  --  anywhere             anywhere
 INPUT_direct  all  --  anywhere             anywhere
 INPUT_ZONES_SOURCE  all  --  anywhere             anywhere
 INPUT_ZONES  all  --  anywhere             anywhere
 ACCEPT     icmp --  anywhere             anywhere
 DROP       all  --  anywhere             anywhere             ctstate INVALID
 REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Eu pergunto isso porque eu sinto que o que eu quero em vez de qual é o resultado do firewall-cmd é um pouco mais seguro, estou errado? Eu gostaria de manter o firewall sendo controlado pelo firewalld em vez de descartar o firewalld e reverter para o iptables para melhor integração futura e possíveis problemas de descontinuação, então isso é possível com o firewalld ou serei forçado a executar um script personalizado em arrancar que inclui

 iptables -I INPUT 1 -s 192.168.0.0/24 -j ACCEPT
 iptables -I INPUT 2 -m geoip ! --src-cc US -j DROP

e se essa for a opção onde coloco esse script?

    
por Chris 07.10.2015 / 20:24

1 resposta

0

no momento, a melhor maneira de efetuar isso é apenas fazer exatamente o que eu propus, que é não só adicionar a regra de recebimento de entrada, mas também adicionar a gota de saída para que os comandos sejam

 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 192.168.0.0/24 -j ACCEPT
 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -m geoip ! --src-cc US -j DROP
 firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 192.168.0.0/24 -j ACCEPT
 firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -m geoip ! --dst-cc US -j DROP

atualmente não há outra maneira de adicionar a regra diretamente à cadeia INPUT ou OUTPUT através do firewall-cmd

Eu só me propus a fazer isso assim porque eu senti que se algum tipo de malware ou worm entrasse em meu servidor, sua conexão de saída para qualquer país seria considerada RELACIONADA, ASSEGURADA ou ESTABELECIDA, mas esse método apenas adicionando a cadeia delegate_output parece estar trabalhando para bloquear todas as conexões de saída, então estou satisfeito

Eu sou mais do que certo que alguém poderia melhorar esta resposta explicando como eu poderia colocar o comando em algum script de inicialização ou script systemd, mas eu acho que ficaria mais feliz se o fedora descobrisse uma opção que o adicionasse diretamente para a cadeia primária, mas talvez isso seja uma má prática

    
por 26.10.2015 / 18:18