O seu ipset consiste de IP e portas, então você precisa dizer ao iptables match para IP e porta. Se você quer combinar com a porta de destino use dst, caso contrário use src.
-A INPUT -m set --match-set public_services dst,dst -j ACCEPT
Minha configuração atual é que eu tenho um servidor com vários endereços IPv4. Vamos ignorar a parte do IPv6 por enquanto, pois os sintomas são idênticos lá.
Nas regras de firewall, gostaria de combinar com o tráfego HTTP para um determinado IP, bem como alguns outros serviços (permitindo que eles passem com -j ACCEPT
em minha INPUT
cadeia a tabela filter
).
Esta é efetivamente a segunda para a última regra na corrente INPUT
:
-A INPUT -m set --match-set public_services dst -j ACCEPT
-A INPUT -j NFLOG --nflog-prefix "[IPv4:inp/flt] (drop)"
-A INPUT -j DROP
# filter/INPUT chain ends here
mas, como acontece algum registro antes do -j DROP
, vejo que o tráfego acaba sendo descartado pela última regra, em vez de ser aceito, conforme desejado. O marcador usado no registro é único dentro das regras do meu netfilter.
Meu conjunto de IPs parece com:
# ipset save public_services
create public_services list:set size 8
add public_services public_services4
add public_services public_services6
Considerando que o conjunto IP específico do IPv4 é (endereço IP real redigido):
# ipset save public_services4
create public_services4 hash:ip,port family inet hashsize 1024 maxelem 65536 counters
add public_services4 192.168.0.1,tcp:80 packets 0 bytes 0
add public_services4 192.168.0.1,tcp:22 packets 0 bytes 0
Ativei os contadores para ver se as regras na cadeia INPUT
correspondem ou não. No entanto, parece que não. O que eu acho muito estranho, porque o IP, o protocolo ( tcp
) e a porta correspondem quando eu os comparo do arquivo de log (endereços MAC e IP redigidos):
[IPv4:inp/flt] (drop) IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=1.2.3.4 DST=192.168.0.1 LEN=40 TOS=00 PREC=0x00 TTL=242 ID=54321 PROTO=TCP SPT=51433 DPT=80 SEQ=2936666534 ACK=0 WINDOW=65535 SYN URGP=0 MARK=0
Eu também tentei adicionar minhas regras como regras específicas de IPv4 e IPv6, respectivamente, para referenciar o conjunto de IP específico da versão de IP. Isso também não funciona e cai na regra explícita adicionada primeiro.
O que estou fazendo errado neste caso ao tentar corresponder o IP, o protocolo e a porta de destino?
Mais informações:
A referida regra acima é o número 26, por isso decidi inserir uma regra explícita antes:
-I INPUT 26 -p tcp -d 192.168.0.1 --dport 80 -j ACCEPT
Isso funcionou. No entanto, quero abstrair o máximo de partes variáveis das minhas regras de netfilter e em conjuntos de IPs.
Então eu adicionei (só para provar o ponto que não funciona com conjuntos) outra regra:
-I INPUT 26 -m set --match-set public_services4 dst -j ACCEPT
e isso não funciona. De acordo com os filtros netfilter e IP set, esta regra não corresponde.
Versões dos pacotes envolvidos:
O seu ipset consiste de IP e portas, então você precisa dizer ao iptables match para IP e porta. Se você quer combinar com a porta de destino use dst, caso contrário use src.
-A INPUT -m set --match-set public_services dst,dst -j ACCEPT