最近はネットワークのフィルタリングが厳密すぎて、tcp/22ポートにおけるsshの接続ができなくなってきました。sshはsshd_configで簡単にポート番号を変えられれますので、どのネットワークでもまず閉じられていないtcp/443(SSL)に変えてしまうという手があります。しかしながら、webサーバを立ち上げているサーバでは当然443は占拠されているので、今回のsslhを使ってクライアントのリクエストに応じて適切なサービスに割り振ることをします。
インストール
Debianではパッケージがありましたので、そこからインストールします。
# apt install sslh
最初に、inetdで起動するか、standaloneで起動するか聞いてきます。sshもhttpdもstandaloneで動いているわけですし、sslhも素直にstandaloneにしておきます。
既存サービスのポート変更
httpd
私はApacheを使っていますので、/etc/apache2/ports.confを書き換えました。
Listen 80
<IfModule ssl_module>
Listen localhost:443
</IfModule>
<IfModule mod_gnutls.c>
Listen localhost:443
</IfModule>
ポート番号はそのままに、待ち受けるアドレスをlocalhostにしています。編集後にapacheの再起動。
ssh
/etc/ssh/sshd_configを編集します。
#Port 22
Port 12345
Port 23456
もともとの22番はコメントアウトしています。22番ポートへの攻撃は多いのであえて閉じています。そのあとにある12345,23456が待ち受けポートです(本当は違う値ですけど)。編集後にsshdの再起動。
sslhの設定
sslhの設定は/etc/default/sslhです。
RUN=yes
DAEMON_OPTS="--user sslh --listen xxx.xxx.xx.x:443 --listen xxxx:xxx:xx:x:x:x:x:x:443 --ssh 127.0.0.1:12345 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
変更箇所は2行です。–listenでまちうけのアドレスとポートを指定します。–sshでsshのポート番号を、–sslでhttpdのポート番号を指定しています。編集後にsslhの再起動をします。
まちうけにはIPv4もIPv6の両方共いけました。転送先のアドレス(127.0.0.1)がIPv4しか書いてないのに、IPv6でsshのコネクションが張れていまいち謎な感じですけど、できてしまいました。一種のIPv6トランスレーター的な動きをしているのかもしれません。
確認
httpdの確認は通常のブラウザから出来ます。sshはポート番号を変えましたので以下のようにつなぎます。
$ ssh -p 12345 サーバのアドレスなど
毎回ポート番号を書くのが面倒であればconfigに書くのがいいでしょう。
注意
リモートのサーバを編集するときは注意しましょう。設定を間違えると2度と繋がらなくなる可能性があります。sshなどは設定を変更してサービス再起動しても、今あるセッションはそのまま残りますので、設定が完全に出来上がって問題なくなるまで、作業中は切断しないようにするといいと思います。