Olá, gostaria de alguns conselhos sobre como usar o VyOS para um tipo específico de NAT.
Tenho uma situação em que gostaria de fazer NAT de uma conexão correspondida no endereço de destino e na porta de destino. Mas gostaria de traduzir não apenas a porta de destino, mas também o endereço de origem. Então, preciso de um DNAT e um SNAT correspondente.
Haverá várias conexões, e a ideia é que elas obtenham endereços de origem diferentes com base no destino original e sejam redirecionadas para um destino comum.
O problema é que o DNAT vai primeiro, e como ele traduz o destino, não sei o que combinar no SNAT. Se eu conseguisse fazer o SNAT acontecer primeiro, isso resolveria o problema. Ou se eu conseguisse de alguma forma "marcar" a conexão com o DNAT e então combinar isso no SNAT, isso também funcionaria.
Aqui está um exemplo de duas conexões, onde inventei um recurso de marcação de conexão inexistente para ilustrar o que quero fazer:
set nat destination rule 89 destination address 192.168.222.222
set nat destination rule 89 destination port 10089
set nat destination rule 89 translation port 10000
set nat destination rule 89 modify mark '89'
set nat source rule 89 connection mark '89'
set nat source rule 89 translation address 10.1.1.89
set nat destination rule 96 destination address 192.168.222.222
set nat destination rule 96 destination port 10096
set nat destination rule 96 translation port 10000
set nat destination rule 96 modify mark '96'
set nat source rule 96 connection mark '96'
set nat source rule 96 translation address 10.1.1.96
Observe que ambas as conexões são traduzidas para o mesmo destino, então não posso usar isso na regra SNAT.
Existe alguma maneira de fazer SNAT antes de DNAT ou conseguir o que quero de alguma outra forma no VyOS?
Outras coisas a serem observadas:
- Todas as conexões vêm do mesmo host, então não consigo corresponder nisso
- A porta de origem original é efêmera, então não posso corresponder a isso
- O objetivo dessa configuração é simular conexões de vários clientes para um destino comum, quando na realidade elas vêm de um único host usando uma porta de destino diferente para diferenciar cada cliente simulado.
EDIT: Acho que seria possível se eu estivesse usando o iptables em vez do VyOS assim:
iptables -t mangle -A PREROUTING -d 192.168.222.222 -p tcp --dport 10106 -j CONNMARK --set-mark 89
iptables -t nat -A PREROUTING -d 192.168.222.222 -p tcp --dport 10089 -j DNAT --to-destination 192.168.222.222:10000
iptables -t nat -A POSTROUTING -m connmark --mark 89 -j SNAT --to-source 10.1.1.89
iptables -t mangle -A PREROUTING -d 192.168.222.222 -p tcp --dport 10096 -j CONNMARK --set-mark 96
iptables -t nat -A PREROUTING -d 192.168.222.222 -p tcp --dport 10096 -j DNAT --to-destination 192.168.222.222:10000
iptables -t nat -A POSTROUTING -m connmark --mark 96 -j SNAT --to-source 10.1.1.96
Se o iptables consegue fazer isso, eu imagino que o VyOS também consiga... mas talvez não?
Fiz essa pergunta nos fóruns do VyOS e obtive uma resposta: https://forum.vyos.io/t/matching-in-snat-after-dnat/
Resumo é que, até agora, não há como atingir exatamente o que eu quero usando o VyOS. MAS, parte da solução está lá. Há uma maneira de marcar conexões, então o único recurso que está faltando é poder corresponder a uma marca de conexão para o SNAT.