iptables: combine check com set no módulo "recente" em 1 regra

iptables: combine check com set no módulo "recente" em 1 regra

Usandorecentmódulo em iptables, como posso verificar se o endereço IP src existe em uma lista e, se existir, adicioná-lo a outra lista?

Estou tentando implementarbater na portausando iptablesjunto com este módulo ( recent).

Então, eu gostaria de detectar se os pacotes TCP chegam em uma ordem específica, mudando o endereço IP src de uma lista para outra, progredindo assim para a lista final, o que permitiria o acesso IP src à máquina.

Minha dúvida é, basicamente, como adicionar src ip a uma próxima etapa (lista), quando um pacote tem a porta de destino correta E está na etapa atual correta (lista), tudo em uma regra. Algo assim:

1:

# we'd like to accept the already authenticated packets quickly, hence the first rule
iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT

2:

# src ip is not authenticated, let's verify the first knock
# if the first port knock was correct (port 1111), add the src ip to the 'knock1' list
iptables -A KNOCKING -p tcp --dport 1111 -m recent --name knock1 --set -j DROP

3:

# now, here is the issue...
# how do we both check if the src ip is already in the 'knock1' list
# plus the second port knock was correct (port 2222), and add the src ip to 'knock2' list
# ideally, we would write something like this
iptables -A KNOCKING -m recent --rcheck --seconds 10 --reap --name knock1 -p tcp --dport 2222 -m recent --name knock2 --set -j DROP

Eu li várias abordagens diferentes para configurar o port-knocking usando iptables, mas esta pareceu a mais trivial para mim, então eu realmente gostaria de confirmar ou negar que é possível fazer isso usando esta abordagem.

Responder1

Acontece que a linha que postei acima é exatamente como deveria ser escrita :) Acho que estava muito pessimista em esperar iptablesser capaz de processar uma regra tão "complexa".

Aqui está minha configuração para a configuração fácil de bater na porta:

# set default policy for INPUT chain to DROP
iptables -P INPUT DROP

# accept all local traffic
iptables -A INPUT -i lo -j ACCEPT

# accept all the already-established connections
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m multiport --sports 25,80,443,465,587 -j ACCEPT

# add more of your own rules here...

# at the end, redirect all the packets into the KNOCKING chain
# this makes it easy to quickly enable/disable KNOCKING chain, if need be
iptables -A INPUT -j KNOCKING

# if the src ip is already authenticated, accept it
iptables -A KNOCKING -m recent --rcheck --seconds 60 --reap --name knockfinal -j ACCEPT

# if the packet is not authenticated and the first port knock is correct
# add the src ip into the 'knock1' list
iptables -A KNOCKING -p tcp -m tcp --dport 1111 -m recent --set --name knock1 -j DROP

# if the src ip is already in the 'knock1' list (with the expiry time of 10 seconds)
# and the 2nd port knock is correct, add the src ip to the 'knock2' list
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock1 -m tcp --dport 2222 -m recent --set --name knock2 -j DROP

# if the src ip is already in the 'knock2' list (with the expiry time of 10 seconds)
# and the 3rd port knock is correct, add the src ip to the 'knock3' list
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock2 -m tcp --dport 3333 -m recent --set --name knock3 -j DROP

# if the src ip is already in the 'knock3' list (with the expiry time of 10 seconds)
# and the 4th port knock is correct, add the src ip to the 'knockfinal' list
iptables -A KNOCKING -p tcp -m recent --rcheck --seconds 10 --reap --name knock3 -m tcp --dport 4444 -m recent --set --name knockfinal -j DROP

# otherwise, we don't do anything and the default INPUT policy will drop the packet

Eu acho que este é o conjunto de regras de porta mais curto para iptables que eu já vi ...

informação relacionada