Parece ser tão simples assim:
user@I$ ssh -L I:N:T:N user@T
Configuração: PC I (Ubuntu 11.10, tem sudo), Mac T (OS X 10.7.2, tem sudo), Dispositivo inteligente S (mal configurável).
S pode ser visto em I na rede local, mas não é possível ver T . I e T podem ver um ao outro.
Existe um programa que escuta em T na porta N . Se alguém se conecta ao programa e não fala seu protocolo proprietário ou não diz nada na conexão, o programa é desligado e tem que ser dolorosamente reiniciado manualmente.
S deve se conectar a T na porta N e falar com o programa. O IP real S se conecta é configurável.
Vejo que preciso configurar um tipo de retransmissão de I , porta N para T , porta N , mas até agora não consigo entender como fazer isso. Dicas são bem vindas.
Uma solução temporária (por exemplo, executar o ssh com algumas teclas sofisticadas) é preferível a uma "permanente" (como configurar o iptables ou algo do tipo), já que isso é um problema temporário.
Configure um túnel ssh reverso remoto em "I" para redirecionar a porta "N" em si para a porta "N" em "T". Dessa forma, a máquina S pode se conectar a "T" via "I".
Se "N" é, por exemplo, a porta 8080, em "I" você pode definir manualmente como
ssh -R 8080:IpofT:8080 localhost
Você pode adicionar -N, -f, -n e -v, se necessário. Veja a página man do ssh.
Existem alguns problemas de segurança que podem estar no caminho. Como se a porta "N" fosse uma porta de menor alcance, você precisa de privilégios de root, o sudo serve.
Também por padrão muitos servidores Ubuntu não permitem redirecionamento de ip externo. Isso pode ser alternado configurando /etc/ssh/ssh.conf e definindo
GatewayPorts yes
Para automatizar o login, você pode adicionar sua própria chave ssh na máquina "I" ao arquivo authorized_keys2 em "I" (como você faz login via localhost). Você também pode configurar o cronjobs para testar se o trabalho ssh está sendo executado e também para matá-lo / reiniciá-lo.
Como alternativa, você pode configurar para que a máquina "T" efetue o login na máquina "I" e direcione o tráfego para si mesmo (embora não esteja familiarizado com o ssh toolset on osx)
ssh -R 8080:localhost:8080 username@IPofI
Mais informações sobre encaminhamento / encapsulamento de portas no Ubuntu
Okey, não percebeu que você preferiu não usar o iptables.
Instale socat
e você pode criar um encaminhador de porta como este em I :
"LOCAL/LISTEN" PORT "TARGET" DEST : PORT
sudo socat TCP4-LISTEN:N,reuseaddr,fork TCP4:T:N
como
sudo socat TCP4-LISTEN:888,reuseaddr,fork TCP4:1.2.3.4:888
Veja a man-page do socat para mais informações
Aqui está uma maneira iptables para fazer um NAT de destino de porta (tradução de endereço de rede).
# allow forwarding
sysctl -w net.ipv4.ip_forward=1
# forward port 888 to host 1.2.3.4:888
iptables -I PREROUTING -t nat -p tcp --dport 888 -j DNAT --to 1.2.3.4:888
# most likely you'll need this to get routing back to your device to work.
# try without this first.
iptables -I POSTROUTING -t nat -j MASQUERADE
Versão um pouco "mais segura" onde você define a rede de onde as conexões / encaminhamento são permitidos
# forward port 888 to host 1.2.3.4:888 allowd from net 2.2.2.0/24
iptables -I PREROUTING -t nat -p tcp -s 2.2.2.0/24 --dport 888 -j DNAT --to 1.2.3.4:888
iptables -I POSTROUTING -t nat -s 2.2.2.0/24 -j MASQUERADE
Tags networking tunnel linux macos