Túnel através de um NAT

4

Eu tenho um roteador que fornece conexão à Internet para um único dispositivo cliente por meio de uma rede de dados celular sem fio. Essa rede fornece endereços IP não públicos que são exibidos. Eu gostaria de obter um endereço IP estático fora da rede que encaminhará tudo de volta para o dispositivo na rede celular.

Como este é um dispositivo incorporado, o espaço é limitado (cerca de 500kB para trabalhar aqui). Como a rede é cara, ela não precisa consumir muito tráfego.

Primeiro, tentei criar um túnel IPIP usando o iproute2. Do servidor, usei o IP de saída do roteador para o IP remoto, não o endereço privado que o roteador recebeu. Eu esperava que uma vez que o roteador se comunicasse através do túnel para o servidor, o servidor poderia se comunicar de volta. Este não foi o caso.

Eu tentei dropbear SSH e descobri que ele não vai fazer um túnel genérico, mas eu pensei que eu poderia contornar isso usando o iptables. No entanto, parece que apenas ter o link ssh aberto consome cerca de 150 bytes / seg.

Eu também tentei nc, mas a comunicação é apenas uma direção, então eu posso iniciar uma conexão com o servidor, mas não consigo recuperar nada.

OpenSSH e OpenVPN são muito grandes para caber no dispositivo (ambos em torno de 1MB).

Minha próxima tentativa provavelmente será escrever um programa que mantenha um soquete persistente aberto ao servidor e usar o iptables para rotear o tráfego para esse programa. Eu queria ver se havia outras idéias primeiro.

Então, alguma ideia?

    
por Shawn J. Goff 21.11.2010 / 14:02

1 resposta

4

O único NAT com o qual um túnel IPIP pode trabalhar é o NAT um-para-um, o que claramente não é o que você tem no caso do celular.

Esse negócio de "150 bytes / segundo para uma conexão SSH aberta" é muito estranho e você deve investigar. Isso não acontece comigo com o OpenSSH - > Sessões de OpenSSH (há as keepalives inevitáveis, mas você quer aquelas quando você está atrás de um NAT) e não há razão para isso, a menos que você esteja realmente passando tráfego.

Você está enganado porque o netcat está sendo unidirecional, uma sessão TCP iniciada com o netcat funciona nos dois sentidos.

Eu sugiro obter um fluxo bidirecional de qualquer maneira possível (provavelmente netcat e um ouvinte TCP no servidor) e executar o PPP sobre isso. Você obtém todas as desvantagens habituais de executar IP sobre TCP, mas é melhor do que não ter conectividade em tudo.

Veja o que funciona para mim em um teste rápido - no servidor:

server:~$ sudo pppd noauth passive pty "nc -lp 9999" debug nodetach

No cliente:

client:~$ sudo pppd noauth pty "nc server 9999" debug nodetach

Acho que ter a semântica de discagem também fornece um modelo útil para os casos em que seu dispositivo de célula simplesmente não pode ser acessado.

Depois de ter a conexão IP em execução, você pode considerar a reprodução de IPIP ou NAT 1: 1.

    
por 21.11.2010 / 19:17