Come inoltrare una porta a un'altra connessione al server tramite SSH


2

Penso che quello che sto cercando di fare è chiamato SSH Tunneling. Sono un po 'confuso se questo è in realtà ciò che voglio fare.

Voglio installare un tunnel sulla porta 1234 sopra Server A . Server A inoltra tutte le connessioni attraverso la porta 1234 a Server B in porto 5678 . E 'possibile farlo con SSH?

Fondamentalmente voglio accedere a un server secondario su una rete locale attraverso il server primario che si trova su una rete pubblica dal mio computer locale senza dover accedere al server primario.

Desidero inoltre che il tunnel consenta a un utente non root di connettersi al server privato. Dovrebbe essere autenticato come normalmente quando si accede a SSH. È necessario assicurarsi che questo funzioni anche per WinSCP in modo che il client possa accedere al proprio account nella casella privata tramite l'indirizzo IP pubblico correttamente.

Risposte:


4

Ciò che @RolandW suggerisce è corretto e funzionerà se e solo se il server B sulla rete privata è direttamente accessibile dal server A, cioè se e solo il server B è non dietro un firewall e un router NATting.

Se una di queste due assunzioni è falsa, dovrai utilizzare una soluzione diversa. In questo caso, poiché B è non direttamente accessibile da A, dovrai stabilire un tunnel inverso da B a A, quindi potrai accedere a B da casa tua.

Sul server B,

  1. Aggiungi questa linea a /etc/rc.local

    su -c /home/your_name/bin/auto your_name
    
  2. Crea un file eseguibile chiamato auto in /home/your_name/bin, chiamato auto, con questo contenuto:

    #!/bin/sh
    /usr/lib/autossh/autossh -M 6321 -f -p 22 -2 -N -D  -R 8100:localhost:22 your_name_o_server_A@IP_address_of_server_A -i /path/to/cryptokey/of_server_A
    

    Il comando autossh è un'utilità molto comoda che riavvia automaticamente il tunnel ssh ogni volta che va giù (interruzione di corrente, riavvio, qualsiasi cosa); per farlo usa una porta (nel mio caso, 6321) per verificare lo stato della connessione. Puoi benissimo usare una porta TCP diversa da 6321 (ma più grande di 1024!), Ma assicurati che sia aperta sul server A.

    Il comando precedente presuppone che tu abbia abilitato l'autenticazione tramite chiavi crittografiche, cosa che dovresti assolutamente fare.

  3. Sul server A, dovrai introdurre la seguente riga

    GatewayPorts yes
    

    nel file /etc/ssh/sshd_config. Questo richieste sudo privilegi.

  4. Infine, puoi connetterti da casa come segue:

    ssh -YC -t -t -p 22 -i /path/to/cryptkey/of_server_A \
      your_name_o_server_A@IP_address_of_server_A        \
      "ssh -Y your_name_on_server_B@localhost -p 8100 -i /path/to/cryptkey/of-server_B" 
    

Ovviamente sarà conveniente stabilire degli alias per rendere più veloce la chiamata sopra.


2

Suppongo che vogliate ottenere l'accesso SSH al Server B, che si trova su una rete privata connessa al server (pubblico) A. Il server B esegue un daemon ssh in ascolto sulla porta 5678.

Per fare ciò, è possibile creare un port forwarding sul server pubblico che inoltra i pacchetti TCP in arrivo sulla porta 1234 a server-b: 5678. Secondo https://serverfault.com/questions/140622/how-can-i-port-forward-with-iptables questo può essere fatto su una macchina Linux con iptables (netfilter) usando i seguenti comandi

iptables -t nat -A PREROUTING -p tcp -i <WAN interface> --dport 1234 -j DNAT --to-destination <server-b-IP>:5678
iptables -A FORWARD -p tcp -d <server-b-IP> --dport 5678 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

La prima regola riscrive l'indirizzo di destinazione, la seconda consente di consegnare il pacchetto modificato alla sua destinazione. Ciò presuppone che il gateway predefinito del Server B sia Server A.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.