サーバ成果物

ポート開放ができないネットワークで Web サーバをお手軽に公開する (SSH ポートフォワード) v2

前提
  • 特定のポートを公開したい
  • ポート開放ができない
  • 外部に対する SSH 接続は可能なネットワークに接続している
  • ポート開放が可能なネットワーク (ex. 実家) とサーバがある
    (なければ格安のレンタルサーバとかでも)
構成

ポート開放が可能なネットワークにあるサーバ 1 に SSH サーバを立てる
ポート開放ができないネットワークにある サーバ 2 から、サーバ 1 に SSH トンネルを掘る
サーバ 2 に来た通信をサーバ 1 に転送する

設定

サーバ 2 : 通信を転送するかの設定 (/etc/ssh/sshd_config)

GatewayPorts yes
AllowTcpForwarding yes

公開鍵認証もできるようにしておく。

サーバ 1 : 起動時に自動でサーバ 2 に SSH トンネルを掘る設定

portforward.sh

autossh -M 0 -N -f \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  -p <ssh_port> \
  -R *:<forward_port>:localhost:<forward_port> \
  <user_name>@<domain>

-N, -f : SSH が確立したらシェルを開かず、バックグラウンドへ潜る
-R : サーバ側のポートをローカルへ転送する
* : サーバに来た全部の IP からの通信を転送

実行権限を付けて実行できるか試してみる。
起動時に自動で接続されてほしかったら、crontab -e に起動時このシェルスクリプトを実行するように書いておく。

@reboot /home/<user_name>/portforward.sh

v1 と比べて、タイムアウト他の理由で切断があったとき自動再接続するので、安定性が格段に向上。

あとがき

レオパレスの LeoNet でサーバを公開するために編み出した術。
本当はできないことをするので、何かしらの問題が起こっても自己責任で。
もっと良くするならば、autossh とかを使って、SSH 切断時のリトライとかの設定など。

VPN などを使う手法もあるかと思うが (実際別案件では VPN を使用している)、特定のポートへ通信を転送するだけなら、SSH のポートフォワードのほうが楽だし同じことができると思う。

コメント