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?