ひと昔前は、ちょっと知っている人しかポート転送なんてことをしませんでしたが、最近は子供でも当たり前のようになっています。
今回は、ポート転送する時にセキュリティを考慮した小技です。
本ページはこんな方におすすめ
- 一つのポートを他サービスでも使いたい
- ポート開放は最低限にしたい
- 443 ポートしか解放できない
なぜ一つのポートを使いまわす?
インターネットの通信、特に TCP/IP プロトコルはアドレスとポートで通信を行います。
アドレスはいわゆる IP アドレスのことで、ポートは http ポートとか、アプリによってデフォルトが違います。
例えば、ポート 23 番は telnet、70 番は Gopher など、定番が決まっています。もっとも有名なのが http の 80 番です。
https の 443 番もここ最近は常識ですね。
サーバー利用の計算機のくせに、ブラウザから https アクセスできないというのも奇妙ですので、多くのサーバーは、https についてはアクセス制限をつけずに接続を受け付ける設定にしています。つまり、443 番は比較的すべてのサーバー、機器で解放しているケースが多いです。
その一方で、セキュリティ的な理由で Dos 攻撃対策なども含めて、それ以外の他のポートはアクセス制限を付けた初期設定をしていることが多いです。そのため、https の 443 番しか解放できない、場合によっては解放したくないケースが発生します。
ここで、「443 番ポートを複数のサービスで使いまわせたらな」と思い始めます。
443 番で ssh と https を使う設定をやってみます。
Ubuntu に sslh をインストールする
設定環境
Linux 5.15.0-71-generic #78-Ubuntu SMP Tue Apr 18 09:00:29 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
bash
ubu@ntu:~$ sudo apt install sslh
sslh は一つのポートで複数のサービスを待ち受けるデーモンです。
これを利用して sslh が対応しているデーモンを 443 ポートだけで待ち受けることができます(同時)。
対応しているデーモンは、HTTPS、SSH、OpenVPN、tinc と XMPP です。
sslh を設定する
sslh のデフォルトの設定ファイルは、Ubuntu の場合 /etc/default/sslh にあります。
bash # /etc/default/sslh # Default options for sslh initscript # sourced by /etc/init.d/sslh # 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"
変更する点は <change-me> だけです。ここをサーバーの NIC のアドレスに変更します。というか、サーバーを立ち上げたいアドレスに変更します。Wi-Fi ルーターからローカル IP を受けっとっている場合は、その IP アドレスを使います。
そして、後からそのルーターのポート転送を設定します。
既存の https サービスをローカルホストだけにバインドしなおす
多くの web サーバーは、例えばマシンAで動かしたら、そのマシンの持つ IP アドレスと localhost にバインドされれるようになっています。
例えば、マシンAの IP アドレスが 192.168.1.10 なら、https://192.168.1.10 だけでなく、https://120.0.0.1 や https://localhost などでもアクセスできます。
注意
先ほどの設定ファイルに倣うと、すでにウェブサーバーなとせの設定が済んでいる場合は、起動アドレスを 127.0.0.1 にだけバインドする必要があります。つまり、
sslh を使うので、今回のウェブサーバー(sslh を起動する前に準備することとしては)は、
- https://192.168.1.10 へのアクセスは×
- https://localhost (https://127.0.0.1) へのアクセスだけ○
に設定しなおします。
つまり、sslh へのアクセスを https://192.168.1.10 とやりたいので、すでに https サーバーが起動している場合は、アドレスを 127.0.0.1 に限定して起動すべしという意味になります。
httpd の待ち受けを変更
apache の場合
bash ubu@ntu:$ cat /etc/apache2/ports.conf # If you just change the port or add more ports here, you will likely also # have to change the VirtualHost statement in # /etc/apache2/sites-enabled/000-default.conf Listen 80Listen 127.0.0.1:443 Listen 127.0.0.1:443 # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Nginx の場合
Nginx の場合は、 nginx.conf を書き換えます。
bash
listen 127.168.100.217:80; #80;
server_name 192.168.100.217; #localhost;
sshd の待ち受けを変更
bash # /etc/ssh/sshd_config # This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. ~(途中略)~ Port 22 #AddressFamily any ListenAddress 127.0.0.1 #ListenAddress :: #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_ecdsa_key #HostKey /etc/ssh/ssh_host_ed25519_key # Ciphers and keying #RekeyLimit default none (以下略)
OpenVPN も sslh に預けてしまおう
OpenVPN にも sslh は対応しているので、sslh の 443 番ポートを利用することができます。
設定ファイル(openvpn.conf)を開きサーバーを localhost だけで起動します。
変更するのは、udp で起動ではなく tcp に変更するのがポイントです。
bash # 設定変更の例 # Which local IP address should OpenVPN # listen on? (optional) ;local a.b.c.d local 127.0.0.1 # port number than the default of 1194. port 1194 # Choose one of three protocols supported by # OpenVPN. If left commented out, defaults # to udp. ; proto [tcp-server | tcp-client | udp] proto tcp
sslh の耐性は?
サービスそのものは、個人ユーザーが、自宅のサーバにアクセスする程度なら問題ならない遅延です。デーモンも落ちないので、問題なく使えます。
ただ、普通に別個にポート開放してデーモンを起動した場合に比べて sslh を通す方が切れやすく感じます。
さらに、sslh デーモンそのもののセキュリティ耐性は普通の様で、sslh のポート(ここでは 443 番)にポートスキャンがあれば、普通に何のサービスのポートかバレるようです。というか、ssh のポートだと一番に判断されるようです。
ネットワークの構成をもう少し複雑にしている方は、ルーターとの絡みで一工夫いるかもしれませんが、使い勝手は良いです。
sslh はどう使う?
私の場合、外からサーバーにアクセスして、ipfw のファイアウォール設定をやりすぎ設定してしまい、サーバー再起動後にアクセスできなくしてしまうようなミスをよくやりました。
このため、もしかの時の保険のために 443 ポートを開放したサーバーを一つ起動させています。何かの時は、バックアップサーバーの 443 ポートから ssh で入るという感じです。普段のバックアップサーバーは 443 ポートからは https のサーバー負荷情報ぐらいしか見えないようにしています。
現実的な使い道としては、443 ポートへのアクセスしか認めない設定の公共 Wi-Fi みたいなアクセスポイントからは、UDP 1194 ポートで OpenVPN に繋げないこともあります。そのような場合は、sslh の 443 ポートから OpenVPN に繋いでネットに出るという方法があります。
普段使いではないにしろ、sslh を設定しておくと、いざというときは便利に助けてくれます。
有料サービスの VPN もいざというときのために利用しておくと助かります。
-
MillenVPN と NordVPN、どちらの VPN を選ぶか考えてみる
本ページはこんな方におすすめ お手軽価格の VPN を探している MillenVPN(ミレンVPN)ってどんな感じ? N ...
続きを見る