前提
- 特定のポートを公開したい
- ポート開放ができない
- 外部に対する 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 のポートフォワードのほうが楽だし同じことができると思う。
コメント