sslhを用いてApache(HTTPS)、OpenVPN、SSHを同時に443番ポートで待ち受ける

2018年7月8日Linux・Ubuntu Tips, プロキシLinux, Ubuntu, Apache, SSH, VPN, OpenVPN, プロキシ, sslh

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

<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する。

$ 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。
そして、クライアントもそれに合わせて変更を行う。

これで無事に接続が完了するはずである。

執筆者紹介

Thir

最新のガジェットを購入してはレビューする、を繰り返しています。このブログでは、ガジェットの紹介のほか、各種サーバーやスマートホームの構築などを提供しています。最近はYouTubeでもレビュー動画やVlogをあげています。(プロフィール