Tor ako nástroj na vzdialený prístup k počítaču cez SSH

Mnohí poznáte tento problém – pod stolom si rozbeháte Raspberry Pi, ktoré vám zaťahuje žalúzie, do toho sa stará o vaše fotky a monitoruje vlhkosť vzduchu. A potom odídete a spomeniete si, že ste zabudli zatiahnuť žalúzie a chcete sa tam pripojiť. Namiesto zložitého forwardovania portov (kde vám poskytovateľ často zablokuje zrovna ten port, ktorý forwardujete), riešenia statických IP adries alebo forwardovacích služieb od tretích strán môžete použiť open-source projekt Tor a službu “Tor hidden service”, ktorá je určená na tvorbu anonymných služieb, ktorých poloha je skrytá.

V tomto postupe nebudeme polohu utajovať, ale využijeme fakt, že Tor pripojeniu je jedno akú máte IP adresu, netreba forwardovať porty, ale k službe sa dostanete cez tzv. Tor obvod (Tor circuit). Nasleduje geekovina a command-line. Robil som to pre Mac, ale konkrétnosti pre Mac popíšem.

Klientom bude notebook (v mojom prípade s operačným systémom mac OS), serverom môže byť tiež Mac alebo Linux.

Najprv nastavíme notebook:

# nainštalujeme Tor
brew install tor && brew services start tor

# vytvoríme nastavenia
mkdir -p /usr/local/var/lib/tor/onion_auth
cat > /usr/local/etc/tor/torrc << EOF
SocksPort 9050 # Default: Bind to localhost:9050 for local connections.
ClientOnionAuthDir /usr/local/var/lib/tor/onion_auth
EOF

# reštartneme tor
brew services restart tor

Vygenerujeme kľúč. Toto technicky nie je potrebné, SSH ako také má overenie kľúčom, ale ak budeme pridávať aj iné služby, ktoré nevyžadujú prihlásenie alebo chceme zvýšiť bezpečnosť a nechceme aby sa skúšal prihlásiť ktokoľvek, dáva to zmysel. Pozor, na zakazovanie IPčiek zabudnite, Tor vám IPčky neukáže zo žiadnej strany, čiže sa nedajú použiť klasické techniky “ak niekto 3x skúsi zlé heslo, zablokujem jeho IPčku”. Preistotu radšej vyrobme tie kľúče…

wget 'https://raw.githubusercontent.com/pastly/python-snippits/master/src/tor/x25519-gen.py'
pip3 install pynacl
python3 ./x25519-gen.py

Tento príkaz nám vygeneruje dva kľúče, private a public. Odložíme si oba. Príklad výstupu:

public:  VJC4DIDPPM3EQYMTIQWG4VJO6MLP3D56HJ2FH7C5HZSMFZZ3GJVA
private: BC3GVIGQWG35YDY23KSOU3BSJVCOF2Y7WXQAG7SFOQUJQ5XZBOVA

Poďme nastaviť server:

# Nainštalujeme Tor na mac cez homebrew
brew install tor && brew services start tor

# Vytvoríme základnú konfiguráciu
mkdir -p /usr/local/var/lib/tor
cat > /usr/local/etc/tor/torrc << EOF
SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections.
DataDirectory /usr/local/var/lib/tor
HiddenServiceDir /usr/local/var/lib/tor/ssh/
HiddenServicePort 22 127.0.0.1:22
EOF

# Reštartneme Tor
brew services restart tor

# Sem dáme verejný - public - kľúč (za descriptor:x25519:)
echo 'descriptor:x25519:VJC4DIDPPM3EQYMTIQWG4VJO6MLP3D56HJ2FH7C5HZSMFZZ3GJVA' > /usr/local/var/lib/tor/ssh/authorized_clients/laptop.auth
brew services restart tor
echo -n 'Hidden service hostname: '
cat /usr/local/var/lib/tor/ssh/hostname
echo 'Now add key to client /usr/local/var/lib/tor/onion_auth/HOSTNICKNAME.auth_private:'
sed -e 's/.onion/:descriptor:x25519:PRIVATE_KEY/' < /usr/local/var/lib/tor/ssh/hostname
echo '(replace PRIVATE_KEY with your private key)'

Dostaneme hostname, ktorý končí na .onion a poradí nám v akom formáte máme pridať kľúč do klienta. Ideme naspäť na klienta a nastavíme prihlasovanie na tento konkrétny server.

Najprv do súboru /usr/local/var/lib/tor/onion_auth/HOSTNICKNAME.auth_private pridáme kľúč vo formáte ako je napísané vyššie (HOSTNAME bude náš názov počítača, ako ho budeme chcieť volať, nemusí to byť žiadny v DNS známy hostname). Bude začínať onion adresou (bez .onion na konci), nasledovať bude :descriptor:x25519: a za tým privátny kľúč (v našom príklade BC3GVIGQWG35YDY23KSOU3BSJVCOF2Y7WXQAG7SFOQUJQ5XZBOVA)

# Reštartneme tor 
brew services restart tor

Do súboru ~/.ssh/config pridáme:

Host HOSTNICKNAME
 Hostname ONIONADDRESS.onion
 User USERNAME
 Port 22
 CheckHostIP no
 ProxyCommand /usr/bin/nc -x localhost:9050 %h %p

Časti veľkými písmenami nahradíme: HOSTNICKNAME je prezývka akou budeme volať náš počítač, ONIONADDRESS bude onion adresa Tor hidden služby, ktorú nám vypísal skript a voliteľne môžeme dať aj parameter USERNAME, ktorý nám automaticky nastaví meno užívateľa, ak neuvedieme iné (napríklad “pi” pre raspberry pi).

Potom spustíme iba príkaz:

ssh HOSTNICKNAME

…a sme na serveri (bez ohľadu na to, kde sa nachádza, akú má IP adresu, …).

Ak to robíte na Linuxe, tak sa služba inštaluje inak (napr. pomocou príkazov apt alebo yum), reštartuje inak (napr. pomocou príkazu service alebo systemctl, podľa distribúcie) a je možné, že Tor bude mať konfiguračné súbory inde (/etc/tor namiesto /usr/local/etc/tor). Inak princíp ostáva rovnaký.

Výhodou tohto prístupu je, že sa nemusíte nikde registrovať, vytvárať si účty a riešiť rôzne obmedzenia ako majú služby typu ngrok, tunelin a podobne. Nevýhodou je trochu zložitejšie úvodné nastavenie a to, že takéto pripojenie bude pomalšie, keďže ide cez niekoľko vrstiev anonymizácie.

Ďalšie možnosti

Pekný návod na SSH cez Tor hidden service pre Ubuntu. Jediný problém je, že tam neriešia autentifikáciu klienta, čo znamená, že sa môže k ssh pokúsiť pripojiť ktokoľvek.

Možné alternatívne riešenia pripájania sa na SSH vo vnútornej sieti sú:

  • ngrok. Adresa sa dosť mení alebo treba platený účet, treba bežať custom klienta
  • tunnelin podobné ako ngrok, stálejší endpoint, majú celkom fajn free verziu
  • OpenVPN Cloud – zadarmo umožní prepojiť tri “vnútorné” siete bez nutnosti mať jeden endpoint na verejnej sieti. Môžete tak napríklad prepojiť dve domácnosti a jeden notebook, ktorý sa vie k obom sieťam automaticky pripojiť
  • ZeroTier – podobné, ale môže fungovať o úroveň nižšie (SD-WAN, Ethernet). Free verzia má do 50 zariadení, resp. majú aj open-source variantu, ak si chcete bežať vlastný server
  • frp – ak máte aspoň jeden vlastný server s verejnou IP adresou, môžete použiť tento open-source nástroj v klient-server móde na jednoduché forwardovanie portov z rôznych “klientov” (ktorí poskytujú server služby napr. http, ssh). Pekné je, že jeden server na jednej verejnej IP dokáže obslúžiť viacero klientov.
  • autossh – ak máte server, môžete si k nemu pomocou autossh vytvárať aj ssh spojenia, cez ktoré urobíte reverzný tunel naspäť na ssh. Autossh tieto spojenia udržiava a prípadne reštartuje. Môže sa hodiť aj tento návod na automatické spúšťanie.

Bonus: Ak sa vám na klientovi mení IP adresa a chcete mať stále otvorené nejaké ssh spojenia, prípadne prežiť super pomalé pripojenie, odporúčam sa pozrieť na mosh.