Como combinar corretamente com um conjunto de IPs do tipo 'hash: ip, port'?

1

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:

  • ipset: 6.20.1-1
  • iptables: 1.4.21-1ubuntu1
por 0xC0000022L 05.05.2015 / 12:27

1 resposta

2

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
    
por 30.11.2017 / 12:42