# reverse SSH トンネルでポートを転送する

# 利点

  • ホスト側 LAN でポートフォワーディングが不要
  • 接続が暗号化される
  • ホストの IP を隠せる

# 要件

  • Virtual Private Server (VPS)(例: Lunanode の最小プランで約 3.5$/月)
  • VPS で root アクセス可能であること(1000 未満のポート転送は root のみ可能)
  • ホストコンピューター(ポート転送元)への ssh アクセス

# セットアップ

# ホスト側(BTCPay Server インスタンス)

# switch to root user (if not logged in as root)
sudo su -

# check for an existing ssh public key
cat ~/.ssh/*.pub

公開鍵がなければ生成します(ENTER を押し続けます)。

ssh-keygen -t rsa -b 4096

これにより ~/.ssh 内に SSH キーペア id_rsa(秘密鍵)と id_rsa.pub(公開鍵)が生成されます。

秘密鍵は ssh-agent に追加する必要があります。

# start the ssh-agent in the background
eval $(ssh-agent -s)

# add private key to ssh-agent
ssh-add ~/.ssh/id_rsa

公開鍵を VPS にコピーします(VPS_IP_ADDRESS を入力)。 VPS の root パスワード入力が求められます。

ssh-copy-id -i ~/.ssh/id_rsa.pub root@VPS_IP_ADDRESS

動作確認として VPS に SSH 接続します。成功すればパスワードはもう求められません。

ssh root@VPS_IP_ADDRESS

# VPS 側

先ほどの接続を再利用しても、root で再ログインしても構いません。

sshd 設定を編集します。

sudo nano /etc/ssh/sshd_config

次の項目が有効になっていることを確認してください(行頭に # がない状態)。 または、以下をファイル末尾に貼り付けても構いません。

RSAAuthentication yes     # not needed on latest OpenSSH versions
PubkeyAuthentication yes
GatewayPorts yes
AllowTcpForwarding yes
ClientAliveInterval 60

保存は CTRL+O, ENTER、終了は CTRL+X です。

WARNING

この時点で sshd 設定が誤っているとアクセス不能になる可能性があります。必ず再確認してください。

sshd サービスを再起動します。

sudo systemctl restart sshd

# ホスト側(BTCPay Server インスタンス)に戻る

# autossh のインストールと設定

依存パッケージ autossh をインストールします。

sudo apt-get install autossh

サービスファイルを作成します。

sudo nano /etc/systemd/system/autossh-tunnel.service

以下を貼り付け、VPS_IP_ADDRESS を入力します。 必要に応じてポートを追加・削除してください。

[Unit]
Description=AutoSSH tunnel service
After=network.target

[Service]
User=root
Group=root
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -C -M 0 -v -N -o "ServerAliveInterval=60" -R 9735:localhost:9735 -R 443:localhost:443 -R 80:localhost:80 root@VPS_IP_ADDRESS
StandardOutput=journal

[Install]
WantedBy=multi-user.target

サービスを有効化して起動します。

sudo systemctl enable autossh-tunnel
sudo systemctl start autossh-tunnel

これで reverse ssh-tunnel によるポート転送は完了です。 VPS の IP 経由でホストコンピューターのポート/サービスにアクセスできるはずです。

# 監視

ホストコンピューターでエラーがないか確認します。

sudo journalctl -f -n 20 -u autossh-tunnel

VPS 側でトンネルが有効か確認するには:

netstat -tulpn

# 参考資料