それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

sslh でport443 を有効活用して、sshもhttpsも同時に待ち受けする。

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 が足りなくなります。

sshhttps を同時に待ち受けしたい。

sshhttps を443 ポートで同時に待ち受けしできたら問題解決なんです。

そのような夢のソフトウェアはあるのでしょうか。

ありました。 socks プロキシだけだと思ってたら、同時に待ち受けできる内部フォーワーダがありました。

sslh の導入

sslh はマルチプレクサ、つまり、クライアントの通信プロトコル毎に対応するアプリケーション(IP/ポート)に転送してくれる夢のようなアプリケーションです。

sslh の効果

sslh を 443 ポートで待ち受けさせておき、 ssh の通信は22/TCP へ転送、HTTPS の通信は443/TCPへ転送ができます。

443 ポートで通信内容に基づく振り分けができるのです。高レベルなレイヤでのルーティングですね。

f:id:takuya_1st:20161014151145j:plain (通信プロトコルで判別し転送)

このように443ポートで、ssh/httpの同時利用が出来てしまうのです!!(驚)

感激です。

sslh のインストール

debian 系の場合は、とてもカンタンです。

sudo apt install sslh 

ほぼずっと使うので、スタンドアロンで起動するのが無難です。

sslh の起動

起動と終了は、systemd 経由でunit 化されているのでカンタンでした。

# systemctl start sslh

inetd 経由の場合はinetd で自動起動されるのであまり考えなくていいですね。

sslh の設定

設定ファイルは、/etc/default の中にあります。

# ls -l /etc/default/sslh
-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

443 ポートがゲートウェイ

転送先はTCP/IPで指定すればいいみたいなので、443 ゲートウェイとしても使えますね。

もし他に443 ポートを待ち受けているDaemonがあれば、それは解除の必要があります。

私の場合はApachehttpsで443を利用しており、apache の Listen から 外部:443 を除外して localhost:443 に絞りました。

apache の443を解除して localhost に絞る例

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 追記

私は httpsssh を同時に使いたいので sslh を使うことにしました。

が、単純に443でssh を待ち受けるだけなら、不要です。

sshd_config だけで可能です。

こちらを参照→発見、sshd の待ち受けポートは二つ書けた!!! - それマグで!

あと、sslh は systemd で起動するので、sslh がダウンしてもsystemd 側が面倒見てくれるはず。