443ポート以外が絶滅しそうです
あちこちでポートは閉じられています。ssh や sftp もプロキシ利用も、各種ポートでは、全く外部に出れず、接続できないネットワークが多いです。
TCP/IPなのにIPとポートを使った通信ができない、壊れたネットワークが当然になりました。
これらの接続制限にとても不便を感じることが多いです。
サーバー管理者の気分一つでポートが空いたり閉じたり、私が触ってたネットワークではポリシーが統一されず、クソネットワーク管理者に振り回されて、動くはずのものが動かず、不便なことが多かったのです。そこで仕方なく443を使っています。
私達が利用する端末では80/443 のポートの外部接続が閉じられることは少なく、443であれば通信できます。
そのため、443ポートに様々なアプリケーションを起動していると思います。
443 ポートとIPアドレスが枯渇する・・・
よほどのGWでない限り443は通してくれるので、443ですべての通信を行うことになります。
443 で接続したいアプリがあるたびにIPアドレスを増やす羽目になります。
かといって、手軽にIPv4アドレスを増やすのは難しく、しかしNATでは対応ができず。
443接続の中身を元に、プロトコル毎に転送出来たらイイなと思っていました
HTTPSだけであれば、443 ポートで複数のドメインをホスティングするのはSNIの技術で回避できるとしても、443 でssh を待ち受けると、https が足りなくなります。
ssh と https を443 ポートで同時に待ち受けしできたら問題解決なんです。
そのような夢のソフトウェアはあるのでしょうか。
ありました。 socks プロキシだけだと思ってたら、同時に待ち受けできる内部フォーワーダがありました。
sslh の導入
sslh はマルチプレクサ、つまり、クライアントの通信プロトコル毎に対応するアプリケーション(IP/ポート)に転送してくれる夢のようなアプリケーションです。
sslh の効果
sslh を 443 ポートで待ち受けさせておき、 ssh の通信は22/TCP へ転送、HTTPS の通信は443/TCPへ転送ができます。
443 ポートで通信内容に基づく振り分けができるのです。高レベルなレイヤでのルーティングですね。
(通信プロトコルで判別し転送)
このように443ポートで、ssh/httpの同時利用が出来てしまうのです!!(驚)
感激です。
sslh のインストール
debian 系の場合は、とてもカンタンです。
sudo apt install sslh
ほぼずっと使うので、スタンドアロンで起動するのが無難です。
sslh の起動
起動と終了は、systemd 経由でunit 化されているのでカンタンでした。
# systemctl start sslh
inetd 経由の場合はinetd で自動起動されるのであまり考えなくていいですね。
sslh の設定
設定ファイルは、/etc/default
の中にあります。
-rw-r--r-- 1 root root 715 2016-10-14 14:02 /etc/default/sslh
設定の考えかた。
外部向けの 443 ポートで待受して、内部向けの ポートに転送する。
https が転送されるときはこんな感じになります。
https client ====> 192.168.11.11:443 ( sslh ) ----(転送)---- > 127.0.0.1:443
ssh が転送されるときはこんな感じになります。
ssh client =====> 192.168.11.11:443 ( sslh ) ----(転送)----- > 127.0.0.1:22
転送先はTCP/IPで指定すればいいみたいなので、443 ゲートウェイとしても使えますね。
もし他に443 ポートを待ち受けているDaemonがあれば、それは解除の必要があります。
私の場合はApacheがhttpsで443を利用しており、apache の Listen から 外部:443 を除外して localhost:443 に絞りました。
apache の 443 ポートは次のように書き換えました。
/etc/apache2/ports.conf
編集前
#
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
編集後
#
Listen 80
<IfModule ssl_module>
Listen localhost:443
</IfModule>
sslh を転送するように設定。
外部IPからの443をlocalhost の 443/ 22 に転送するように設定しました。
設定ファイルのサンプル
/etc/default/sslh
DAEMON_OPTS="--user sslh --listen 192.168.11.11:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
これで再起動して確認します。
接続の確認
ssh の疎通確認
ssh 192.168.11.11 -p443
httpsの疎通確認
curl https://192.168.11.11 -k
これで完成です。
貴重な443ポートの有効活用
コマンドのオプションを見れば分かるんですが。
ssh / http 以外にも幾つか対応しています。
takuya@:~$ sslh -h
sslh: option '--http' requires an argument
sslh 1.16-2
usage:
sslh [-v] [-i] [-V] [-f] [-n] [-F <file>]
[-t <timeout>] [-P <pidfile>] -u <username> -p <add> [-p <addr> ...]
[--ssh <addr>]
[--openvpn <addr>]
[--tinc <addr>]
[--xmpp <addr>]
[--http <addr>]
[--ssl <addr>]
[--tls <addr>]
[--anyprot <addr>]
[--on-timeout <addr>]
-v: verbose
-V: version
-f: foreground
-n: numeric output
-F: use configuration file
--on-timeout: connect to specified address upon timeout (default: ssh address)
-t: seconds to wait before connecting to --on-timeout address.
-p: address and port to listen on.
Can be used several times to bind to several addresses.
--[ssh,ssl,...]: where to connect connections from corresponding protocol.
-F: specify a configuration file
-P: PID file.
-i: Run as a inetd service.
設定ファイルを読み込ませる場合
設定ファイル使うと、/etc/default より管理が楽になります。
/etc/default/sslh
##設定ファイルを-F で指定しておきます。
DAEMON_OPTS="--user sslh -F /etc/sslh --pidfile /var/run/sslh/sslh.pid"
/etc/sslh
listen: (
{
host : "192.168.11.11";
port :443
}
);
protocols: (
{name: "ssh" ; host: "127.0.0.1"; port: "22" ;},
{name: "http" ; host: "127.0.0.1"; port: "443"; },
)
443ポートは貴重
IPv4の ポート 443 は今はインターネットそのものになりつつあります。全ての通信が443ポートでおこなわれつつあるとおもっています。
443ポートでVPNを貼ったりssh したりSocksProxy作ったり通信内容を見られないというのはとても重要なファクタに成りつつあります。
感謝
私の長年の悪夢に素晴らしい解決方法を教えてくれた OpenSSH 実践入門にはほんとうに感謝です。
参考資料
http://www.rutschle.net/tech/sslh.shtml
https://github.com/yrutschle/sslh
追記
グーグルで、sslh で検索すると sshにキーワードを修正して検索結果が表示されました。
google さんはマジもう消えていいと思いました。
2016/10/20 追記
私は https と ssh を同時に使いたいので sslh を使うことにしました。
が、単純に443でssh を待ち受けるだけなら、不要です。
sshd_config だけで可能です。
こちらを参照→発見、sshd の待ち受けポートは二つ書けた!!! - それマグで!
あと、sslh は systemd で起動するので、sslh がダウンしてもsystemd 側が面倒見てくれるはず。