これは
とある環境で, 安定したトンネルを掘っておきたいと考えて結構安定していた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変わってもいいように以下のスクリプトを用意する
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
になっていれば完了.