O problema
Eu tenho dois programas que são executados em dois computadores distantes e se comunicam por meio de um protocolo específico. Tudo o que sei é que este protocolo só se comunica através do UDP e usa as portas 1101 e 1102 e que ambos os computadores precisam estar na mesma rede local.
Eu já consegui fazer isso usando uma VPN (p2p), mas gostaria de saber se é possível usar o iptables através do túnel SSH (o túnel SSH é obrigatório aqui).
Eu uso dois servidores wheezy Linux Debian para abrir um túnel na Internet entre os dois programas. Eu consegui criar um túnel SSH que redireciona o tráfego UDP de um lado para o outro (para todas as portas), mas isso não funciona. Para fazer isso eu uso socat (aqui a representação para a porta 1101):
transmission from computer1 --> port 1101/server1 --> socat to port 61101 --->
---> ssh tunnel --->
---> socat from port 61101--> port 1101/server2 --> reception on computer2
Meu objetivo é fazer com que "server2" se comporte exatamente como era "computer1" do ponto de vista de "computer2" (e vice-versa). Os endereços IP devem ser traduzidos corretamente quando a transmissão de pacotes e os dados transferidos tiverem que ser alterados de acordo.
O SSH é configurado com login automático usando arquivos-chave.
Minha configuração de túnel
Foi assim que configurei o túnel para redirecionar as duas portas nas duas direções.
#From server1's shell
$ ssh -f -N -T -R51101:localhost:51101 login@server2 # reverse tunnel for port 1101
$ ssh -f -N -T -R51102:localhost:51102 login@server2 # reverse tunnel for port 1102
$ ssh -f -N -T -L61101:localhost:61101 login@server2 # tunnel for port 1101
$ ssh -f -N -T -L61102:localhost:61102 login@server2 # tunnel for port 1102
#socat redirection on server1
$ socat TCP4-LISTEN:51101,fork UDP4:server1:1101 #redirects from the tunnel to the local 1101 port
$ socat TCP4-LISTEN:51102,fork UDP4:server1:1102 #redirects from the tunnel to the local 1102 port
$ sudo socat -d -d UDP4-LISTEN:1101,fork,bind=1101 TCP4:localhost:61101 #redirects to both tunnel and local UDP port 1101
$ sudo socat -d -d UDP4-LISTEN:1102,fork,bind=1102 TCP4:localhost:61102 #redirects to both tunnel and local UDP port 1102
#From server2's shell
#socat redirection on server2
$ socat TCP4-LISTEN:61101,fork UDP4:server1:1101 #redirects from the tunnel to the local 1101 port
$ socat TCP4-LISTEN:61102,fork UDP4:server1:1102 #redirects from the tunnel to the local 1102 port
$ sudo socat -d -d UDP4-LISTEN:1101,fork,bind=1101 TCP4:localhost:51101 #redirects to both tunnel and local UDP port 1101
$ sudo socat -d -d UDP4-LISTEN:1102,fork,bind=1102 TCP4:localhost:51102 #redirects to both tunnel and local UDP port 1102
Acho que é possível fazer isso usando o iptables, mas não sei como fazer isso.
Alguém está tendo uma solução? Ou uma receita sobre como fazer tradução correta de endereços usando o iptables?
Tags ssh iptables udp ssh-tunneling