Linux: sintonizando uma conexão recebida

0

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.

    
por Alexander Gladysh 13.02.2012 / 17:51

3 respostas

0

Parece ser tão simples assim:

user@I$ ssh -L I:N:T:N user@T
    
por 14.02.2012 / 05:46
1

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

    
por 13.02.2012 / 19:10
1

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
    
por 13.02.2012 / 21:02