espelhamento de porta do iptables

8

Preciso obter uma cópia dos pacotes recebidos na porta 8001 para a porta 8002. Tentei o seguinte, mas recebo um erro que --tee é indefinido.

sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
Parikshit
fonte
Seu kernel ou iptablespode ser muito antigo; consulte Enviar pacotes duplicados por duas conexões com a Internet.
Gilles 'SO- stop be evil'
Esta pergunta é respondida aqui: superuser.com/questions/753294/mirror-port-via-iptables/…
Pat

Respostas:

6

A --teebandeira não faz parte da cadeia DNAT, faz parte da ROUTE. Você só pode usá-lo após uma declaração de -j ROUTE. Você pode obter ajuda específica do iptables sobre o assunto desta forma:

 $ iptables -j ROUTE help

Eu estava olhando para o seu comando iptables, e isso não faz nenhum sentido para mim. Por que você está tentando comparar com a fonte e a porta de origem de um pacote quando em sua pergunta disse "pacotes recebidos na porta"? Você está tentando dividir o tráfego de entrada para atingir duas portas ou pegar a saída de uma porta e ligá-la à entrada de outra?

Se o primeiro, existem realmente duas etapas. Você não pode usar tee para obter uma cópia do pacote E alterar o pacote para alterar os números de porta ao mesmo tempo. Você pode tentar isso em duas etapas, primeiro enviando uma cópia duplicada do pacote, combinando apenas a cópia e destruindo a porta de destino. AVISO: não testado, considere este pseudo-código:

$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
Caleb
fonte
1
Aviso ... outro visitante do site observou que uma versão semelhante disso realmente resulta em um loop infinito! Você provavelmente precisará descobrir como marcar o pacote duplicado na mesma ação e, em seguida, corresponder à marca.
Caleb
ROUTE parece obsoleto, certo?
daisy
É apenas um erro de digitação, 172.0.0.1 -> 127.0.0.1.
Aki
1
Leitores de NB para SE: O ROUTEalvo usado na resposta acima é obsoleto até o momento e não está disponível nas tabelas de ip nas distros mais recentes. Veja serverfault.com/questions/333155/…
Jonathan Ben-Avraham
6

Além Caleb resposta 's, se você estiver trabalhando com mais recente iptables(v1.4.14) que não tem mais o ROUTEalvo que você vai precisar de algo como o seguinte, testado em Debian Wheezy *:

iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002

Teste usando "netcat" ( man nc). Em uma janela do terminal, digite o seguinte e pressione a Entertecla:

nc -l 8002

O comando aguardará a entrada que você digitará em uma segunda janela do terminal.

Na segunda janela do terminal, digite o seguinte e pressione a Entertecla:

nc 127.0.0.1 8001

O comando aguardará por mais informações. Digite qualquer coisa e pressione a Entertecla Depois de pressionar a Entertecla na segunda janela do terminal, o texto digitado na segunda janela do terminal deve aparecer na primeira janela do terminal. Pressione Ctrl-c na segunda janela para finalizar a sessão.


* Esta sintaxe não é suportada no RHEL / Centos (6.5 ou anterior) :-( portanto, você precisa usar o socatT e encaminhar pacotes de entrada na porta original para duas novas portas. Se você teve processos ouvindo a porta de recebimento original, então é necessário reconfigurá-los para escutar em uma das portas em tee, como socatagora é o ouvinte na porta original.Veja esta postagem do SE, por exemplo, socatsintaxe para clonagem de portas.

Jonathan Ben-Avraham
fonte
Por alguma razão no debian você precisa especificar a porta explicitamente com netcatnc -l -p 8002
Marcelo Lacerda
Eu tenho tentado replicar esta solução no meu Mint 19 Tessa sem sucesso. Eu descobri que alguns pacotes retornam e apenas uma das duas portas recebe o pacote. Se eu cometer o erro de adicionar o log para tentar solucionar uma regra, os logs (kernel, syslog, diário) consomem rapidamente meu armazenamento.
hanzo2001 30/04
Também não entendo por que o DNAT está definido na cadeia OUTPUT. O pacote já não está deixando meu processo para o mundo exterior? ou os endereços de loopback se comportam de maneira diferente?
hanzo2001 30/04