Iptables + módulo recent
Como este módulo está se difundindo bastante ultimamente, resolvi escrever um pequeno artigo descrevendo esse poderoso recurso que o iptables nos oferece. Com ele você poderá criar regras dinâmicas com uma determinada resposta ou ação quando ativada.
Parte 5: Último exemplo e final - Personal PortKnocking
Agora vamos colocar outra situação. Você trabalha em uma empresa e presta serviço, por fora, para outras empresas. Não podendo assim pedir para o administrador de redes, se caso não for você, abrir determinadas portas porque precisa prestar um suporte que não diz respeito a empresa. Mas o interessante é que portas default estão liberadas, como por exemplo a 22 (SSH).
Geralmente o ping de dentro para fora funciona normalmente, então vamos desenvolver uma solução que funcione da seguinte maneira: enviar 6 pacotes icmp do tipo 8 (echo request) com o ttl setado para um número irreal, pode ser 121, para abrir a porta 22 do ssh em um período de tempo de 30 segundos.
R. iptables -N PNG_ACCEPT_SSH
E. Criar a CHAIN (tabela) PNG_ACCEPT_SSH
R. iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
E. Permitir (-j ACCEPT) que entre no meu firewall (-A INPUT) pacotes TCP (-p tcp) estando estabilizados, originados de uma conexão local (tabela OUTPUT), relatados, sendo colocadas em um espaço de memória. Importante quando usado a política padrão como DROP.
R. iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -m ttl --ttl-eq 121 -j PNG_ACCEPT_SSH
E. Enviar para a CHAIN, tabela, PNG_ACCEPT_SSH todos os pacotes ICMP (-p icmp) que estiverem com o seu tipo setado para 8 (-m icmp --icmp-type echo-request) e seu ttl seja igual a 121.
R. iptables -A PNG_ACCEPT_SSH -p icmp -m icmp --icmp-type echo-request -m recent --set --name liberateSSH
E. Verificar na tabela PNG_ACCEPT_SSH (-A PNG_ACCEPT_SSH) se o pacote entrante é igual ao protocolo icmp (-p icmp) setado para seu tipo ser 8 (-m icmp --icmp-type echo-request), habilitar o módulo recent (-m recent) e criar uma tabela dinâmica (--set) de nome liberateSSH (--name liberateSSH).
R. iptables -A PNG_ACCEPT_SSH -p icmp --icmp-type echo-request -m recent --rcheck --name liberateSSH --hitcount 6 --seconds 30 --rttl -j LOG --log-prefix "LIBERAR_SSH_PING: "
E. Logar (-j LOG -- log-prefix "LIBERAR_SSH_PING: ") o que entrar na tabela PNG_ACCEPT_SSH (-A PNG_ACCEPT_SSH), sendo seu pacote igual ao protocolo icmp (-p icmp) setado para seu tipo ser 8 (-m icmp --icmp-type echo-request), habilitar o módulo recent (-m recent), verificar se o host de origem (--rcheck) está com seis entradas (--hitcount 6) em um tempo de 30 segundos (--seconds 30) e seu ttl é igual ao setado (--rttl) na tabela de nome liberateSSH (--name liberateSSH).
R. iptables -A PNG_ACCEPT_SSH -j RETURN
E. Voltar para a tabela anterior que estava interpretando as regras, no nosso caso a INPUT.
R. iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --name liberateSSH --hitcount 6 --seconds 30 -j ACCEPT
E. Liberar o acesso (-j ACCEPT) dos pacotes de início de conexão (-m state NEW) que entrarem no firewall e sejam do protocolo tcp (-p tcp) com destino a porta 22 (--dport 22) e que seu endereço de origem (--rcheck) esteja setado mais de 6 vezes (--hitcount 6) em um espaço de tempo de 30 segundos (--seconds 30).
Como podem perceber, com o módulo recent do iptables dá para fazer muita coisa. Usem a imaginação e criem suas regras.
Abraços,
--
Ivan Santos
LPIID: 61925
Geralmente o ping de dentro para fora funciona normalmente, então vamos desenvolver uma solução que funcione da seguinte maneira: enviar 6 pacotes icmp do tipo 8 (echo request) com o ttl setado para um número irreal, pode ser 121, para abrir a porta 22 do ssh em um período de tempo de 30 segundos.
R. iptables -N PNG_ACCEPT_SSH
E. Criar a CHAIN (tabela) PNG_ACCEPT_SSH
R. iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
E. Permitir (-j ACCEPT) que entre no meu firewall (-A INPUT) pacotes TCP (-p tcp) estando estabilizados, originados de uma conexão local (tabela OUTPUT), relatados, sendo colocadas em um espaço de memória. Importante quando usado a política padrão como DROP.
R. iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -m ttl --ttl-eq 121 -j PNG_ACCEPT_SSH
E. Enviar para a CHAIN, tabela, PNG_ACCEPT_SSH todos os pacotes ICMP (-p icmp) que estiverem com o seu tipo setado para 8 (-m icmp --icmp-type echo-request) e seu ttl seja igual a 121.
R. iptables -A PNG_ACCEPT_SSH -p icmp -m icmp --icmp-type echo-request -m recent --set --name liberateSSH
E. Verificar na tabela PNG_ACCEPT_SSH (-A PNG_ACCEPT_SSH) se o pacote entrante é igual ao protocolo icmp (-p icmp) setado para seu tipo ser 8 (-m icmp --icmp-type echo-request), habilitar o módulo recent (-m recent) e criar uma tabela dinâmica (--set) de nome liberateSSH (--name liberateSSH).
R. iptables -A PNG_ACCEPT_SSH -p icmp --icmp-type echo-request -m recent --rcheck --name liberateSSH --hitcount 6 --seconds 30 --rttl -j LOG --log-prefix "LIBERAR_SSH_PING: "
E. Logar (-j LOG -- log-prefix "LIBERAR_SSH_PING: ") o que entrar na tabela PNG_ACCEPT_SSH (-A PNG_ACCEPT_SSH), sendo seu pacote igual ao protocolo icmp (-p icmp) setado para seu tipo ser 8 (-m icmp --icmp-type echo-request), habilitar o módulo recent (-m recent), verificar se o host de origem (--rcheck) está com seis entradas (--hitcount 6) em um tempo de 30 segundos (--seconds 30) e seu ttl é igual ao setado (--rttl) na tabela de nome liberateSSH (--name liberateSSH).
R. iptables -A PNG_ACCEPT_SSH -j RETURN
E. Voltar para a tabela anterior que estava interpretando as regras, no nosso caso a INPUT.
R. iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --name liberateSSH --hitcount 6 --seconds 30 -j ACCEPT
E. Liberar o acesso (-j ACCEPT) dos pacotes de início de conexão (-m state NEW) que entrarem no firewall e sejam do protocolo tcp (-p tcp) com destino a porta 22 (--dport 22) e que seu endereço de origem (--rcheck) esteja setado mais de 6 vezes (--hitcount 6) em um espaço de tempo de 30 segundos (--seconds 30).
Como podem perceber, com o módulo recent do iptables dá para fazer muita coisa. Usem a imaginação e criem suas regras.
Abraços,
--
Ivan Santos
LPIID: 61925
um abraço