sshというと22番ポートを利用するものだが、環境によっては利用できない事がある。 で、そういった場合だと443番ポート(SSL)を利用する場合が多いのだが、Webサーバなんかの場合だとすでにhttpsで使用している場合が多い。 そんなとき、sshとsslを443番ポートで同居させて、それぞれのパケットのときは適切に割り振りをしてくれるリバースプロキシのような動作をしてくれるのが『SSLH』になる。

1. インストール

CentOSやDebian系のOSを使っている場合は簡単で、yum(epelが必要)やaptからインストールが可能だ。

Debian/Ubuntu系の場合

sudo apt install sslh

CentOSの場合

sudo yum install epel-release
sudo yum install sslh

2. 設定する

インストールできたら、諸々の設定を行う。 まず、Webサーバ側で443番ポートを127.0.0.1にのみ許可してやり、外部からアクセス時の443ポートを開放してやる。 以下、Nginx or Apacheでの設定ファイル別での記述(Apacheの場合はVirtualHostで設定する方がいいだろう)。

Nginxの場合(ex:/etc/nginx/nginx.conf)

#listen 443 ssl;
listen 127.0.0.1:443 ssl;

Apacheの場合(ex:/etc/httpd/conf.d/ssl.conf)

#Listen 443 https
Listen 127.0.0.1:443 https

Webサーバ側の設定が終わったら、sslhの設定を行う。 過去のバージョンから設定ファイルが変わったようで、jsonっぽい書き方になっているようだ。 「/etc/sslh.cfg」で、listenするhostに受付をするインターフェイスのIPアドレスやホスト名を入力する。

...
# Change hostname with your external address name.
listen:
(
    { host: "IPアドレス"; port: "443"; }
);
...

設定ファイル編集後は、systemctlでサービスを起動してやればいい。

systemctl enable sslh
systemctl start sslh

設定完了後、443ポートでhttpsとsslがそれぞれ利用できることを確認する。 デフォルトの状態だとhttpも443で利用できてしまうので、不要であれば上記設定ファイルで記述を削除しておくといいだろう。