Como fazer nat baseado no número da porta em nat sem estados?

2

Eu quero simplesmente encaminhar o pacote RTP recebido de um par IP: Port para outro par IP: Port. Eu já fiz isso com o iptables. iptables usam o módulo conntrack. Mas não há necessidade de conntrack no meu aplicativo. Então eu quero fazer isso com o NAT sem estado. Eu descobri que as regras NAT statless podem ser executadas com o comando "ip route add nat", por exemplo

ip route add nat 205.254.211.17 via 192.168.100.17

Este comando diz ao kernel para realizar a conversão de endereços de rede em qualquer pacote vinculado a 205.254.211.17. O parâmetro via informa ao código NAT para reescrever o pacote vinculado para 205.254.211.17 com o novo endereço de destino 192.168.100.17.

Pelo que entendi, o problema é que isso irá encaminhar todos os pacotes com destino a 205.254.211.17 a 192.168.100.17. Existe alguma opção para encaminhar pacotes RTP recebidos na porta específica de 205.254.211.17 para outro IP: Porta?

    
por UserXYZ 08.03.2018 / 18:21

2 respostas

0

Não parece que o Linux forneça suporte para NATing sem estado que permite restringir o comportamento por uma porta específica ou um conjunto de portas.

Na documentação do iproute2 :

Stateless NAT, occasionally maligned as dumb NAT, is the simplest form of NAT. It involves rewriting addresses passing through a routing device: inbound packets will undergo destination address rewriting and outbound packets will undergo source address rewriting.

Parece que esse tipo de NAT está limitado apenas a endereços IP. Dando uma olhada na atual implementação do kernel mainstream aqui , parece que as funções responsáveis por fazer o trabalho não aceitam números de porta, apenas endereços IP e máscaras de rede.

    
por 08.03.2018 / 19:22
0

Por desconfigurando os campos de cabeçalho dos pacotes com nftables é possível, mesmo sem usar ip route add nat , que, como uma funcionalidade simples do roteador, é limitada à camada 3 (IP), não à camada 4 (TCP, UDP, ...).

AVISO: requer nftables > = 0,6 (> = 0,7 aqui se estiver usando o notrack) e kernel > = 4,10. Testado aqui com nftables 0.8.3 e kernel 4.15.x.

É bem compacto, porque os nftables podem combinar vários destinos (3 alvos aqui):

# nft add table raw
# nft 'add chain raw prerouting {type filter hook prerouting priority -300;}'
# nft add rule raw prerouting ip daddr 205.254.211.17 udp dport 5004 notrack ip daddr set 192.168.100.17 udp dport set 5006

Citações na segunda linha para evitar a interpretação da casca. Se estiver fazendo testes, a maneira mais rápida de remover todo o nft é nft flush ruleset .

Portanto, apenas lendo em voz alta, a regra diz para selecionar apenas um pacote IP com destino 205.254.211.17, sendo UDP com porta de destino 5004, então tags como não rastreável (por conntrack, se estiver carregado), define seu IP de destino como 192.168.100.17 e define sua porta de destino como 5006.

Você pode misturar nftables com iptables sem muito problema, contanto que você não use nat tabelas em ambos ao mesmo tempo (bem, você não quer usar isso de qualquer maneira). Ser capaz de declarar a prioridade da cadeia explícita ainda permite escolher se os ganchos nftables serão executados antes ou após os ganchos correspondentes do iptables, por exemplo, escolhendo -301 ou -299 para ter certeza de rodar antes ou depois da tabela iptables ' raw se houvesse tal necessidade.

    
por 11.03.2018 / 12:34