Navigare da un host non connesso direttamente e che accetta solo connessioni SSH in ingresso

Ho questa configurazione:

[internet] <----> [Host A]
                                |----------> [Host B]

ovvero l’Host A può navigare su internet e raggiungere l’Host B, mentre l’Host B non è direttamente connesso ad internet e può solo ricevere connessioni ssh in ingresso dall’Host A.

Per poter navigare anche dall’Host B, l’unica soluzione è installare un micro-proxy sull’Host A e poi creare una reverse-ssh dall’Host A verso l’Host B.

Come micro-proxy sull’Host A possiamo installare TinyProxy:

apt install tinyproxy

Su cui modifichiamo le impostazioni per lasciarlo in ascolto sulla porta 8888 e da 127.0.0.1:

apt update && apt install -y tinyproxy
sed -i 's/^Port .*/Port 8888/'           /etc/tinyproxy/tinyproxy.conf
sed -i 's/^#Listen /Listen /'            /etc/tinyproxy/tinyproxy.conf
sed -i 's/^Listen.*/Listen 127.0.0.1/'  /etc/tinyproxy/tinyproxy.conf
systemctl restart tinyproxy

Verifica:

curl -x http://127.0.0.1:8888 https://ipinfo.io/ip
# deve restituire l’IP pubblico di Host A

Ora creiamo un reverse SSH “stabile” HostA → Host B in modo che la porta 8888 di Host A diventi accessibile su Host B come 127.0.0.1:8888.

Si può ottenere eseguendo su Host A:

ssh -NT -R 8888:127.0.0.1:8888  user@HostB

In questo modo viene attivata una socket in ascolto su HostB che fa rispondere direttamente Tinyproxy sull’HostA

Per evitare che la connessione si interrompa al riavvio, la soluzione è autorizzare la connessione caricando la chiave ssh dell’HostA sull’HostB e poi usare autossh sull’HostA come segue:

apt install autossh
autossh -M 0 -NT -R 8888:127.0.0.1:8888 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3"  user@HostB

E’ possibile gestire autossh con un servizio systemD. Su HostA creiamo il file del servizio /etc/systemd/system/autossh-tunnel.service in cui inseriamo:

[Unit]
Description=Autossh reverse tunnel B → A per apt-cache
After=network.target

[Service]
Type=simple
User=root
Environment=AUTOSSH_GATETIME=0
ExecStart=/usr/bin/autossh -M 0 \
  -o "ServerAliveInterval 30" \
  -o "ServerAliveCountMax 3" \
  -o "ExitOnForwardFailure=yes" \
  -o "StrictHostKeyChecking=accept-new" \
  -N \
  -R 8888:127.0.0.1:8888 \
  user@HostB
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

e poi abilitiamo, avviamo e controlliamo il servizio con:

systemctl enable autossh-tunnel.service
systemctl start autossh-tunnel.service
systemctl status autossh-tunnel.service

Ora verifichiamo su HostB se riusciamo a collegarci con:

curl -x http://127.0.0.1:8888  https://example.com

chiaramente verrà mostrato un messaggio di errore. Esportiamo quindi le variabili per rendere globale il proxy:

export http_proxy=http://127.0.0.1:8888
export https_proxy=http://127.0.0.1:8888

e facciamo un anuova verifica da HostB:

$ curl -x http://127.0.0.1:8888 https://ifconfig.me
# deve restituire sempre l’IP pubblico di Host A

enjoy!

Ti interessa acquistare un dominio a prezzi ultraconvenienti? clicca qui

Se hai trovato utili le informazioni su questo blog,
Fai una donazione!
Clicca sul bottone qui sotto o almeno clicca sul banner pubblicitario 🙂



Commenta