Preciso redirecionar todos os pacotes UDP com a porta de destino 15000 para a porta 15001 se o pacote contiver, por exemplo, a string test
. Eu tenho estas duas regras simples:
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 15000 -m string --string 'test' --algo bm -j LOG --log-prefix='[netfilter] '
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 15000 -m string --string 'test' --algo bm -j REDIRECT --to-ports 15001
Os comportamentos estranhos:
- se o primeiro pacote contiver
test
string, o redirecionamento será feito para todos os pacotes da conexão; - se o primeiro pacote da conexão não contiver
test
, o redirecionamento nunca será feito, mesmo que um pacote subsequente contenhatest
No entanto, todos os pacotes correspondentes à regra são registrados corretamente.
Tentei adicionar também as informações da faixa à regra:
-m state --state NEW,ESTABLISHED
mas o comportamento é o mesmo. Algumas ideias?
Este é o iptables
conjunto de regras completo :
tabela de filtro:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
tabela nat:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
LOG udp -- anywhere anywhere udp dpt:15000 STRING match "test" ALGO name bm TO 65535 LOG level warning prefix "[netfilter] "
REDIRECT udp -- anywhere anywhere udp dpt:15000 STRING match "test" ALGO name bm TO 65535 redir ports 15001
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
mesa mangle:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
tabela bruta:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
nf_conntrack_udp_timeout
parâmetro para 1 asysctl
. A única coisa ruim é que este é um parâmetro global e afeta todos "conexões" UDP em cacheIsso é causado pelo fato de o iptables aplicar o rastreamento de conexão na
PREROUTING
cadeia. Sempre que uma nova conexão é estabelecida, o iptables consultará o cache do conntrack. Se uma correspondência foi encontrada, nenhuma regra será aplicada a partir da tabela nat.Se você deseja desativar a alteração desse comportamento, observe o
NOTRACK
destino na tabela bruta.Observe que isso se aplica mesmo ao UDP (que é um protocolo sem conexão). O primeiro pacote é considerado como conexão de abertura
NEW
e o outro é uma respostaESTABLISHED
.Encontrei uma postagem relacionada no serverfault .
fonte
ESTABLISHED
estado à regra, o iptables deve ignorar o cache? Se não, existe uma maneira de forçar isso?NOTRACK
não funciona para mim, conexão ainda é monitorado-j NOTRACK
/-j CT --notrack
, o mais novo-j CT --zone
possa ser configurado (ainda na tabela bruta): para que os fluxos de pacotes ainda possam ser rastreados, nados etc., mas todos os que tiverem teste terão seus zona separada conntrack, assim esperamos colocar em seu próprio fluxoiptables com zonas conntrack
O recurso de zonas do conntrack permite que dois conntrack idênticos de 5 Uples (ou parte de) sejam considerados distintos por sua propriedade de zona . Normalmente, isso é provavelmente usado com roteamento complexo baseado em políticas, manipulando IPs idênticos, mas fluindo por diferentes caminhos (rotas) para impedir que o conntrack mescle fluxos não relacionados dos diferentes caminhos.
Aqui, ele pode ser usado para resolver esse problema: considere que os pacotes UDP não possuem
test
e o pacotetest
deve fazer parte de duas zonas de origem diferentes (usandoCT --zone-orig
): a zona normal e a zona redirecionada. Cada zona de origem permitirá que as entradas do conntrack noNEW
estado não colidam e sejam consideradas separadas. Considere como se houvesse duas tabelas nat noPREROUTING
gancho: em vez de avaliar asnat
regras que acontecem uma vez para o primeiro pacote do fluxo, isso pode acontecer uma vez para o primeiro pacote normal e uma vez para o primeirotest
pacote.Embora não seja realmente necessário, para evitar ainda mais duplicação de regras, definirei uma marca e a reutilizarei mais tarde para simplificar.
Teste (o servidor está no IP
10.0.3.66
). Cronologicamente, as respostas digitadas após as consultas (resposta1 do termo1 e resposta2 do termo2):Advertência: a
string
correspondência é avaliada para cada pacote do fluxo. Considere, se possível, usaru32
menos custo adicional.fonte