sslhを用いてApache(HTTPS)、OpenVPN、SSHを同時に443番ポートで待ち受ける
443ポートは大変貴重なもので、例えば80番ポートと443番ポートしか空いていない公衆無線LANが存在しているとき、自宅のサーバーやVPSで443番ポートを経由してSSHやVPNへ接続することが出来ると、これ以外のポートを利用することが出来るようになり大変便利なのである……といっても、当然ながら複数のデーモンが同一のポートを待ち受けるなんて技、事例はほとんど存在していない。
そんな魔法のようなことを実施出来るのが、この「sslh」だ。
sslhをインストールする
sslhを用いると、sslhが対応しているdaemonを443ポートで同時に待ち受けることが出来る。対応しているのは下記だ。
- SSH
- OpenVPN
- Tinc
- XMPP
- HTTP
- HTTPS(SSL)
- TLS
今回は、SSHとOpenVPN、そしてApacheを同時に待ち受けることとする。
インストールは非常に簡単で、apt-getを用いて行えば良い。
1 2 |
sudo apt install sslh |
sslhを設定する
sslhのconfigファイルは、/etc/default/sslhに格納される。こちらを開き、設定ファイルを記載していく。
1 2 |
$ sudo vim /etc/default/sslh |
標準ではこんな感じになっているはずだ。
1 2 3 4 5 6 7 8 |
RUN=no # binary to use: forked (sslh) or single-thread (sslh-select) version # systemd users: don't forget to modify /lib/systemd/system/sslh.service DAEMON=/usr/sbin/sslh DAEMON_OPTS="--user sslh --listen <change-me>:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid" |
これを次のように変更してやる。
1 2 3 4 5 6 |
RUN=yes DAEMON=/usr/sbin/sslh DAEMON_OPTS="--user sslh --listen 192.168.11.2:443 --ssh 127.0.0.1:22 --openvpn 127.0.0.1:1194 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid" |
今回設定するサーバーは192.168.11.2で動作しているので、上記の設定としているが、当然外部に接続されているIPアドレスを指定すること。
また、「RUN=yes」としないと、daemonとして起動しない。
Apacheの設定変更
現段階では、Apacheは*:443をlistenしており、このままではsslhと競合する。
従って、Apacheを127.0.0.1:443のみをListenするように設定を変更する。
1 2 3 4 5 6 7 8 9 10 |
$ sudo vim /etc/apache2/ports.conf <IfModule ssl_module> Listen 127.0.0.1:443 </IfModule> <IfModule mod_gnutls.c> Listen 127.0.0.1:443 </IfModule> |
これでOK。Apacheを再起動し、そのあとでsslhをstartする。
1 2 3 |
$ sudo service apache2 restart $ sudo service sslh start |
lsofで確認
lsofで試してみると、待ち受けが行われていることが分かる。
1 2 3 4 5 |
$ sudo lsof -i:443 sslh 11641 sslh 3u IPv4 6002661 0t0 TCP 192.168.11.2:https (LISTEN) sslh 11652 sslh 3u IPv4 6002661 0t0 TCP 192.168.11.2:https (LISTEN) |
curlをhttps/443に飛ばしても、SSLで443ポートを指定しても、うまくいくようになった。
OpenVPNを設定する
デフォルトのOpenVPNはudpを使用する仕様となっているが、今回の場合はtcpを用いることとなる。OpenVPNではtcpの利用はあまり推奨されていない(udpのほうがパフォーマンスが良いと言われる。そりゃそうだ)が、現在ではudpとさほど変わりないパフォーマンスが出る模様。
まず、サーバーの設定ファイルのprotoをudpからtcpに変更し、restart。
そして、クライアントもそれに合わせて変更を行う。
これで無事に接続が完了するはずである。