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

ポート開放が可能なネットワークにあるサーバ 1 に SSH サーバを立てる
ポート開放ができないネットワークにある サーバ 2 から、サーバ 1 に SSH トンネルを掘る
サーバ 2 に来た通信をサーバ 1 に転送する
設定
サーバ 2 : 通信を転送するかの設定 (/etc/ssh/sshd_config
)
GatewayPorts yes AllowTcpForwarding yes
サーバ 1 : 起動時に自動でサーバ 2 に SSH トンネルを掘る設定 (crontab -e
)
@reboot /usr/bin/ssh -N -f -p 1822 -i <秘密鍵のパス!> -R \*:80:localhost:8080 <username>@<domain>
-N, -f : SSH が確立したらシェルを開かず、バックグラウンドへ潜る
-R : サーバ側のポートをローカルへ転送する
* : サーバに来た全部の IP からの通信を転送
80 : サーバのこのポートに来た通信を転送
localhost : 変えることないはず
8080 : リモートのこのポートに転送する
あとがき
レオパレスの LeoNet でサーバを公開するために編み出した術。
本当はできないことをするので、何かしらの問題が起こっても自己責任で。
もっと良くするならば、autossh とかを使って、SSH 切断時のリトライとかの設定など。
VPN などを使う手法もあるかと思うが (実際別案件では VPN を使用している)、特定のポートへ通信を転送するだけなら、SSH のポートフォワードのほうが楽だし同じことができると思う。
コメント