takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

NAT 配下の Linux ホストから、サーバーに ssh している状態で、サーバーから NAT 配下のホストに ssh する

目的

NAT 配下の Linux ホスト -> host1
host1 からアクセスできるサーバー -> SV がある
host1 から SVssh して経路を作って、 SV から host1ssh して、 SV から host1 をいじりたい

リバース SSH トンネル

という名前の技術である

ssh -R <remote_listen_port>:localhost:<local_listen_port> <user>@<host>

という書式で、 host1 から SVssh する

ssh -R 10022:localhost:22 takashi@REMOTE_HOST_NAME_OR_IP

SV では、 10022 が listen されているので

ssh -p 10022 <host1_username>@localhost

で、 SV から host1ssh 出来る

host1 の起動時に、トンネルを作る

#!/bin/bash

# SV のユーザー名とアドレス
USER="username"
HOST="SV_address"

# SV で開けるリモートポート (任意)
REMOTE_PORT=remote_port

# ローカルSSHポート
LOCAL_PORT=22

# 無限ループでトンネルを維持
while true; do
    # リバースSSHトンネルを確立
    ssh -R $REMOTE_PORT:localhost:$LOCAL_PORT -N \
        -o ServerAliveInterval=60 \
        -o ServerAliveCountMax=3 \
        $USER@$HOST
    
    # トンネルが切断された場合、10秒待機してから再接続
    sleep 10
done

実行権限をつけて

chmod +x /path/to/script.sh

これを、 cron に入れる

@reboot /path/to/script.sh