0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[備忘録] リバースポートフォワードをサービス化

Last updated at Posted at 2025-03-12

これは

とある環境で, 安定したトンネルを掘っておきたいと考えて結構安定していたRポートフォワードの手順の備忘録です

前提環境

ネットワーク側

  • ホスト側のLAN内プライベートIPは固定IPでなく定期的に(大体2週間程度)DHCPから払い出される
  • WAN自体は固定IP
  • 不安定なネットワークで定期的にPingが通らなくなる(謎)
  • 22番は空いていない(というか, 443しか空いてない)
  • 透過型のプロキシがある

その他

  • ホストマシンはUbuntu 24
  • 外部に固定IPを持つUbuntuマシンを配置(さくらVPS)

手順

透過型プロキシのIPを調べる

$ tcptraceroute 8.8.8.8
$ traceroute 8.8.8.8

こんな感じでダメもとで調べてみる. 通信にちょくちょく挟まってくる謎のIPがあるので,その場合が高い.

外部サーバのSSHDの設定

この辺はいつも通り.トンネル用のサーバでnginxとかを立ち上げていることはほぼないし,公開サーバでそんなことをやるのは何となく気持ち悪い.したがって,そんな設定をする人はいないと思うが,プロトコルによってサービスに割り当ているにはsslhというソフトウェアが便利.

ともかく443番ポート(もしくは任意のポート)と外部サーバへ秘密鍵でsshログインできるようにする.

プロキシを抜ける

Ubuntu / macの場合は, corkscrewというソフトウェアを使う.apt / brewではいる.

Host jump-server
    HostName {外部サーバのIP}
    User {ssh ログインユーザ}
    Port {443 / もしくは任意のポート}
    Proxycommand corkscrew {プロキシサーバのIP} {443 / もしくはプロキシのポート} %h %p
    IdentityFile {外部サーバにログインするための秘密鍵へのパス}

これで$ ssh jump-serverでログインできれば設定完了.

ホストマシンのSSHDの設定

これもいつも通り.気休め程度に22番以外へ変更.パスワード認証も心許ないので,公開鍵認証に変更しておく.

リバースポートフォワードする

不安定なネットワークでは,autosshが便利.自動で繋ぎ直してくれる.

autossh -N jump-server -R {Rポートフォワード用ポート(何でもいい)}:{ホストマシンのプライベートIP}:{ホストマシンへのSSHポート番号}

上記のコマンドをホストマシンで実行する.そうすると, 外部サーバでRポートフォワードのポートにlocalhostで繋ぎに来たものがホストマシンへ転送される.

試すには外部サーバにログインした状態で,

ssh {ホストマシンのsshログインユーザ}@localhost -p {Rポートフォワード用ポート} 

とする.

デーモン化する

このままでもいいが,やっぱり電源つけたら勝手にRポートフォワードして欲しいし,間違ってrebootなんて叩いても動くようになって欲しい.デーモン化する.

IP変わって自動でいい感じになるスクリプト

ローカルIP変わってもいいように以下のスクリプトを用意する

r-port-foward.sh
HOST_IP=`ip -f inet -o addr show {NIC名} | cut -d\   -f 7 | cut -d /  -f 1`
echo "Host IP Addr : "${HOST_IP}

autossh -N jump-server -R {Rポートフォワード用ポート}:${HOST_IP}:{ホストマシンへのSSHポート}

これにchmod +xして,実行権限与えてから,いい感じの場所に置く./home/{自分のユーザ名}/binとかでいいかもね.

サービスファイルかく

妥当な場所に置く.
/user/{name}/.config/systemd/user/reverse-port-foward.serviceみたいな感じ.多分.

[Unit]
Description=Reverse Port Forward Service 
After=network-online.target sshd.service sshd.service

[Service]
Type=simple
ExecStart=/bin/bash /home/{自分のユーザ名}/bin/r-port-foward.sh
Restart=always
RestartSec=3
TimeoutStopSec=10

[Install]
WantedBy=default.target

Afterのとこが超重要.ネットワークとかssh関連のサービスが開始してからでないと起動できないので,これがないと動かない.

あとはこれをsystemctlなりで登録・有効化して, start後にactiveになっていれば完了.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?