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

LinuxApache, OpenVPN, SSH, 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を用いて行えば良い。

sslhを設定する

sslhのconfigファイルは、/etc/default/sslhに格納される。こちらを開き、設定ファイルを記載していく。

標準ではこんな感じになっているはずだ。

これを次のように変更してやる。

今回設定するサーバーは192.168.11.2で動作しているので、上記の設定としているが、当然外部に接続されているIPアドレスを指定すること。
また、「RUN=yes」としないと、daemonとして起動しない。

Apacheの設定変更

現段階では、Apacheは*:443をlistenしており、このままではsslhと競合する。
従って、Apacheを127.0.0.1:443のみをListenするように設定を変更する。

これでOK。Apacheを再起動し、そのあとでsslhをstartする。

lsofで確認

lsofで試してみると、待ち受けが行われていることが分かる。

curlをhttps/443に飛ばしても、SSLで443ポートを指定しても、うまくいくようになった。

OpenVPNを設定する

デフォルトのOpenVPNはudpを使用する仕様となっているが、今回の場合はtcpを用いることとなる。OpenVPNではtcpの利用はあまり推奨されていない(udpのほうがパフォーマンスが良いと言われる。そりゃそうだ)が、現在ではudpとさほど変わりないパフォーマンスが出る模様。

まず、サーバーの設定ファイルのprotoをudpからtcpに変更し、restart。
そして、クライアントもそれに合わせて変更を行う。

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