Hlavní navigace

SSLH: SSH, SSL, VPN a další služby na jednom portu

Petr Krčmář 7. 7. 2014

Určitě to znáte: přijedete do hotelu, kde krásně svítí WiFi. Připojíte se, ale ouha, firewall vás nepustí na žádný port kromě 80 a 443. Jak se ale dostat na SSH nebo alespoň do VPN? Pokud používáte HTTP a HTTPS, zbývá jediná možnost: spustit si předem multiplexer, který vám dovolí mít na nich více služeb.

Začarované porty 80 a 443

Určitě se vám už nejednou stalo, že jste přišli do sítě, ve které příliš horlivý správce zakázal všechny porty kromě 80 a 443. Typicky se to stává třeba v hotelích. Běžnému uživateli „internet funguje“, takže nemá důvod se zlobit. Pokud ale chcete použít třeba SSH, Jabber nebo OpenVPN, jste nahraní. Na příslušný port se prostě nedostanete.

Pochopitelně je možné se na to předem připravit a některou z těchto služeb si spustit na portu 80 či lépe 443. Ovšem když máte k dispozici jen server (typicky VPS) s jednou IP adresou a chcete na ní provozovat zároveň veřejný HTTPS, nemáte ani ten volný port, a v tu chvíli babo raď.

Yves Rutschle vymyslel pro takové případy velmi elegantní řešení: multiplexer sslh. Ten se posadí na zvolený port (typicky 443) a sám přijímá spojení. Podle úvodního představení klienta pozná požadovaný protokol a postará se o propojení na reálný port konkrétní služby.

Program byl původně vytvořen jako multiplexer protokolů SSH a SSL (odtud jeho název), ale později byl přepsán do obecnější podoby a podporuje podstatně více protokolů. Ve výchozím stavu jde o HTTP, SSL, SSH, OpenVPN, tinc a XMPP, ale do konfigurace je možné připsat další protokol a pomocí regulárních výrazů multiplexer učit.

Manuálová stránka popisuje, jak přesně detekce protokolů funguje:

Detekce protokolů probíhá podle prvních bytů, které klient serveru odešle. SSH spojení začíná identifikací verze, například pomocí řetězce „SSH-2.0“ (podle verze). To je definováno v RFC4253 v sekci 4.2. OpenVPN klient začíná komunikaci „0×00 0×0D 0×38“, tinc začíná s „0 “ a první paket XMPP obsahuje slovo „jabber“.

Příprava web serveru

Abyste mohli začít sslh používat, musíte mu uvolnit port 443 na rozhraní, na kterém bude sám poslouchat. Varianty jsou v zásadě dvě: můžete buďto web server uhnout na jiný port, nebo ho necháte na 443 poslouchat jen na lokálním rozhraní (localhost). Druhá možnost je doporučována dokumentací, když už nic, tak vám nezabere další port na vnějším rozhraní.

Ve výchozím stavu web servery poslouchají na všech rozhraních ( 0.0.0.0:443), což musíme změnit.

Pokud používáte Apache, upravíte konfiguraci tak, aby sekce mod_ssl obsahovala

Listen 127.0.0.1:443

Stejně tak je potřeba upravit konfiguraci u jednotlivých virtuálů, kde musíme sekci <VirtualHost *:443> změnit opět na adresu lokálního rozhraní.

Pokud máte Lighttpd, pak v souboru 10-ssl.conf nastavíte

$SERVER["socket"] == "127.0.0.1:443" {

Pokud používáte Nginx, změňte nastavení SSL virtuálů na

listen 127.0.0.1:443 ssl;

U jiných web serverů to bude v principu podobné, jen je potřeba najít správnou část konfigurace a nastavit lokální IP adresu.

Samozřejmě musíte server restartovat, aby se změny projevily a port se uvolnil. U ostatních služeb nemusíte dělat vlastně vůbec nic, protože ty pak zůstanou viditelné na svých původních portech, i na multiplexovaném 443. Pokud už třeba nechcete mít SSH na portu 22, můžete ho také nechat poslouchat jen na lokálním rozhraní.

Můžete pro jistotu ověřit funkčnost pomocí

# netstat -tulpn|grep 443
tcp 0   0 127.0.0.1:443 0.0.0.0:*   LISTEN  18887/nginx: worker

Vidíte, že Nginx poslouchá jen na localhost rozhraní. Můžeme začít multiplexovat.

Instalujeme a začínáme

Distribuce běžně sslh obsahují, autor zmiňuje Debian, Gentoo a také FreeBSD. K dispozici jsou také binárky zkompilované proti Cygwin, takže program spustíte i na Windows. Pokud chcete sami kompilovat, zdrojové kódy najdete na GitHubu.

Konfigurační soubor je velmi jednoduchý a skládá se vlastně jen ze tří řádků (v Debianu). Na prvním z nich musíme určit, že se má multiplexer zapnout:

RUN=yes

Druhý řádek vybírá, která binárka se má použít. Výchozí volba sslh způsobuje forkování procesu pro každý příchozí požadavek. To je sice doporučovaná varianta, ale je náročnější na systémové prostředky. Proti tomu sslh-select běží v jednom vlákně a zpracovává všechna spojení naráz. Jedná se o novější a méně otestovanou variantu, která je ale šetrná k systémovým prostředkům (jen 16 bytů paměti na spojení).

Dokumentace doporučuje první variantu na méně zatížené servery a druhou variantu na ty pod větší zátěží. Volba je na vás, záleží na tom, jak potřebujete šetřit pamětí. Takže třeba:

DAEMON=/usr/sbin/sslh

Poslední řádek určuje parametry samotného multiplexeru, tedy zejména to, na kterém portu a rozhraní poslouchá ta která služba. Může to vypadat třeba takto:

DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.00.0.1:443 --openvpn 127.0.0.1:1194 --pidfile /var/run/sslh/sslh.pid"

Nastavuje se uživatel pro běh sslh, IP adresa a port multiplexeru a následují jednotlivé služby a jejich adresa a port. Na konci je volba souboru k uložení PID master procesu v případě forkovací varianty sslh.

Teď už stačí jen multiplexer nahodit:

/etc/init.d/sslh start

Pokud je vše nastaveno správně, mělo by fungovat připojení pomocí SSH na sdílený port 443:

$ ssh petr@1.2.3.4 -p 443

Plány do budoucna

Démon sslh je velmi jednoduchý a jednoúčelový, ale podle unixové filosofie dělá tu jednu věc dokonale. Umožňuje vám propojit se se zbytkem internetu i tam, kde to obvykle kvůli firewallu není možné. Většinou stačí jen SSH nebo VPN a máte k dispozici otevřenou bránu do celého světa.

Autor má několik nápadů na vylepšení, chce například umožnit připojení k některým multiplexovaným službám jen z konkrétních rozsahů IP adres nebo chce připravit něco jako port knocking. Démon vám pak zpřístupní cestu třeba k SSH jen v tom případě, že pomocí HTTPS nejprve navštívíte konkrétní URL na serveru. Tak bude pro náhodného kolemjdoucího nemožné zjistit, jaké další protokoly port 443 nabízí.

Našli jste v článku chybu?

7. 7. 2014 10:28

Blume (neregistrovaný)

jak ze stareho dobreho roota :) Takove mam rad, strucny, jasny, upozorni na neco zajimaveho a uzitecneho. Diky!!

7. 7. 2014 10:45

Právě kvůli těmto "hotelovým", "firemním" a "vesnickým" sítím mám jeden virtuální stroj s OpenVPN na portu 443 k naprosté spokojenosti :-)

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Levný tarif pro Brno nebude. Radní: je to kartel

Levný tarif pro Brno nebude. Radní: je to kartel

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?