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を用いて行えば良い。
sudo apt install sslh
sslhを設定する
sslhのconfigファイルは、/etc/default/sslhに格納される。こちらを開き、設定ファイルを記載していく。
$ sudo vim /etc/default/sslh
標準ではこんな感じになっているはずだ。
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"
これを次のように変更してやる。
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するように設定を変更する。
$ sudo vim /etc/apache2/ports.conf
<IfModulessl_module>
Listen 127.0.0.1:443
</IfModule><IfModulemod_gnutls.c>
Listen 127.0.0.1:443
</IfModule>
これでOK。Apacheを再起動し、そのあとでsslhをstartする。
$ sudo service apache2 restart$ sudo service sslh start
lsofで確認
lsofで試してみると、待ち受けが行われていることが分かる。
$ 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。
そして、クライアントもそれに合わせて変更を行う。
これで無事に接続が完了するはずである。