★10/11 sslhコマンドのパラメタ形式の変更に伴い記事を修正しました
外出先から自宅サーバにアクセスしたいことってありますよね?
そんな時は、443番ポートでOpenVPNを利用すれば安全&便利という記事を以前紹介しました。
しかし、 HTTPSで既にWEBページを公開していた場合、443番ポートが使えない場合があります。この場合、通常は443番ポートをHTTPSで使うか、OpenVPNで使うかどちらかを選ぶ必要があります。
これは、究極の選択ですよね。。
しかし、SSLHを使えば443番ポートで HTTPSとOpenVPNを同時に待ち受けることができるのです。加えて、SSHも同時に443番ポートで待ち受けすることもできます。
イメージはこんな感じです。
つまり、SSLHは443番ポートでHTTPSとOpenVPNとSSHを同時待ち受けて、プロトコルレベルでリバースプロキシを実現してくれるのです。これは本当に便利!
本記事では、そんなSSLHをLinux(ubuntu 18.04LTS)とDockerを使ってインストール方法をご紹介します。 「Dockerを使って」というところがこの記事のミソなので、サーバ環境を汚さずに構築したい場合にぜひ参考にしてください。
Contents
事前準備
既に443番ポートを使ったアプリケーションを使っている場合は、待ち受けポートを変更してください。443番ポートはSSLHに明け渡します。
例えば、私の以下の記事を読んでdockerでOpenVPN-ASを導入した場合は、docker-compose.ymlのポート設定を修正する必要があります。修正例を次に示します。 これから、新しいサーバにSSLHを導入する方は特にありません。
私と同じ環境で構築される場合、構築で躓いた際にサポートできると思います。メモリ8GB以上を選択すればエンコード等しても性能的に問題はないと思います。Windows10マシンですが、私はUbuntuを上書きインストールして自宅サーバを構築しています。
OpenVPNのdocker-compose.ymlの修正
OpenVPNのコンテナが起動している場合は、一旦停止します。
1 |
docker-compose down |
そして、docker-compose.ymlを以下のように修正してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
version: "2" services: openvpn-as: image: linuxserver/openvpn-as container_name: openvpn-as cap_add: - NET_ADMIN privileged: true environment: - PUID=1001 - PGID=115 - TZ=Asia/Tokyo - INTERFACE=enp1s0 #optional volumes: - ./data:/config ports: - 943:943 - 9443:9443 - 1194:1194/udp restart: always |
18行目のports部分を9443:9443修正しています。ホスト側の443番ポートを避けて、9443番ポートとコンテナ側の9443番ポートを紐づけます。
他にもホスト側の443番ポートを使っているサービスがある場合は、設定変更をしておきます。
設定が終わったら、コンテナを再開します。
1 |
docker-compose up -d |
インストール方法
では、早速DockerでSSLHをインストールしていきます。
前提
git、dockerおよびdocker-composeがインストールされていることが前提です。
もし、まだインストールしていない場合はこちらを参照してインストールしましょう。
また、dockerプロジェクトのディレクトリを適当な場所と名前で作成しておきます。
1 2 |
mkdir ~/docker-sslh cd ~/docker-sslh |
このあと作成するファイルは、docker-compose.yml、Dockerfile、entry.shの3つです。
最終的に以下のディレクトリ構成になります。
1 2 3 4 5 |
~/docker-sslh |--docker-compose.yml |--sslh |--Dockerfile |--entry.sh |
では、順番に作成していきます。
docker-compose.yml
docker-compose.ymlを作成します。エディタは何でもOKです。
1 |
emacs docker-compose.yml |
以下の内容をdocker-compose.ymlファイルにコピー&ペーストします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
version: '3' services: sslh: build: context: sslh container_name: sslh ports: - "443:443" environment: TZ: Asia/Tokyo LISTEN_IP: 0.0.0.0 LISTEN_PORT: 443 SSH_HOST: 10.29.3.7 SSH_PORT: 22 OPENVPN_HOST: openvpn-as OPENVPN_PORT: 9443 HTTPS_HOST: 10.29.3.7 HTTPS_PORT: 443 restart: always |
environment
443番ポートでsslhが受けたセッションをproxyする先を環境変数で指定します。
例えば、OpenVPNのプロトコルのプロキシ先は、OPENVPN_HOSTとOPENVPN_PORTで設定します。この例では、10.29.3.7:9443に転送する例となっています。
上記のOpenVPNで設定した場合は OPENVPN_HOSTのみ環境に合わせて変更すればOKです。
こんな感じで、SSH_HOST、SSH_PORT、HTTPS_HOST、HTTPS_PORTも 環境に合わせて変更します。
Dockerfile
次に、Dockerfileを作成します。sslhディレクトリの配下に作成します。
1 2 3 |
mkdir sslh cd sslh emacs Dockerfile |
以下の内容をDockerfileファイルにコピー&ペーストします。
1 2 3 4 5 6 7 8 9 10 |
FROM alpine:latest RUN apk update && \ apk add --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ sslh && \ rm -rf /var/cache/apk/* ADD entry.sh /usr/local/bin/entry.sh RUN chmod +x /usr/local/bin/entry.sh ENTRYPOINT ["/usr/local/bin/entry.sh"] |
こちらは特に修正する部分はありません。
entry.sh
次に、entry.shを作成します。こちらも、sslhディレクトリの配下に作成します。
1 |
emacs entry.sh |
以下の内容をentry.shファイルにコピー&ペーストします。
★10/11 sslhコマンドのパラメタ形式の変更に伴い記事を修正しました
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/sh # コマンド表示 echo "sslh -f -u root --listen=${LISTEN_IP}:${LISTEN_PORT} \ --ssh=${SSH_HOST}:${SSH_PORT} \ --tls=${HTTPS_HOST}:${HTTPS_PORT} \ --openvpn=${OPENVPN_HOST}:${OPENVPN_PORT}" # コマンド実行 sslh -f -u root --listen=$LISTEN_IP:$LISTEN_PORT \ --ssh=$SSH_HOST:$SSH_PORT \ --tls=$HTTPS_HOST:$HTTPS_PORT \ --openvpn=$OPENVPN_HOST:$OPENVPN_PORT |
こちらも、 特に修正する部分はありません。
作成するファイルは以上です。
1 2 3 4 5 |
~/docker-sslh |--docker-compose.yml |--sslh |--Dockerfile |--entry.sh |
コンテナ起動
以下のコマンドでコンテナを起動します。
1 2 3 |
docker-compose pull docker-compose build --no-cache docker-compose up -d |
1分~待てばSSLHコンテナの出来上がりです。
このあと、インターネット側から443番ポートに対してOpenVPNとSSHが正常に接続できれば成功です!wifi(同じNW)からだと、インターネット経由にならないので、スマホのテザリング等で別NWから試してみてください。
まとめ
SSLHを使って、OpenVPNとHTTPS、SSHを443番ポートで同時待ち受けする方法を紹介しました。
貴重な443番ポートを複数サービスでシェアすることで、より便利かつ安全に自宅サーバにアクセスることができます。
今回は、DockerコンテナでSSLHを導入する手順を紹介しました。この方法なら、途中で失敗しても簡単にやり直しすることができますし、再現性が高いのでサーバ環境が変わっても簡単に導入することができます。
これでまた便利になりましたね!
他にもいろいろなサービス導入方法をご紹介しています。よかったら参考にしてください。
コメント