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