■SSHで多段接続とポートフォワーディング
■ポートフォワーディングの概要
ローカルコンピュータの特定のポートに送られてきたデータを、
別な通信経路を用いてリモートコンピュータの特定ポートに送信すること
「トンネル」「トンネリング」などと呼ばれたりもする
ポートフォワードとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word12664.html
混乱しがちな「SSHトンネルの確立方法」をイメージ図とセットでまとめたコマンド集 - GIGAZINE
https://gigazine.net/amp/20210209-ssh-tunnel
■SSH多段接続の確認
C:\Users\refirio\.ssh\config で以下のように設定しておくと、「ssh refirio-entrance」のみで接続できる
(Poderosaは多段接続に対応していないようなので、Git Bash や ConEmuで試した)
さらに「ssh refirio-web1」とすれば、refirio-entrance を経由して refirio-web1 に多段接続できる
踏み台サーバを経由して本番サーバに接続する場合、何度もsshコマンドを入力せずとも接続できる
踏み台サーバと本番サーバで別々の鍵を使う場合、両方の鍵が接続元のローカルに必要
(逆に言えば、踏み台サーバに本番サーバの鍵を置く必要は無い)
Host refirio-entrance
Hostname 203.0.113.2
User ec2-user
Port 10022
IdentityFile C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
IdentitiesOnly yes
Host refirio-web1
Hostname 10.0.1.3
User ec2-user
Port 10022
IdentityFile C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
IdentitiesOnly yes
ProxyCommand ssh refirio-entrance -W %h:%p
■ポートフォワーディングの実行(Vagrant)
Windows環境で、Vagrant(
http://192.168.10.10/ であるとする)に対してポートフォワーディングを実行する
$ ssh -fNCL 0.0.0.0:80:localhost:80 vagrant@192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is SHA256:s6TtuBDr5iBjWO9atbRydfyuY8+dAz45l408mEpfc04.
Are you sure you want to continue connecting (yes/no)? yes
… 「yes」を入力(初回のみ)
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
… セキュリティ警告が出るが承認
コマンドの意味は
「80番ポートのすべてのパケット(0.0.0.0:80)を localhost:80 に転送する。vagrant@192.168.10.10 をゲートウェイとする」
となる
オプション「-fNCL」の意味は以下のとおり
-f ... SSHをバックグラウンドで実行する
-N ... リモートのコマンドを実行せず、待機状態にする
-C ... データを圧縮して送る
-L ... ポートフォワーディングを行う
これで自身からは
http://192.168.10.10/
だけでなく、
http://127.0.0.1/
http://localhost/
でもVagrantにアクセスできるようになる
(この状態なら、自身のIPアドレスを指定すれば、同一ネットワークの他端末からのブラウザアクセスが可能)
なお対象サーバを再起動した場合、SSH接続が切れるのでポートフォワーディングも解除される
以下のようにconfigの名前を指定してポートフォワーディングを行えば、configの内容で接続したり、多段接続したりもできる
$ ssh -fNCL 0.0.0.0:80:localhost:80 refirio-dev
$ ssh -fNCL 0.0.0.0:80:localhost:80 refirio-web1
ポートフォワーディングを終了させる場合、以下のようにする
$ ps | grep ssh
… SSHのプロセス番号を確認
9260 1 9260 9260 ? 197609 14:12:18 /usr/bin/ssh
$ kill 9260
… SSHを終了
なお、コマンドプロンプトでポートフォワーディングを行った場合、以下で確認&終了できる
>tasklist | findstr ssh
… タスク一覧を確認
>taskkill /F /IM ssh.exe
… SSHを終了
SSH でファイアウォールを越える - いますぐ実践! Linuxシステム管理 / Vol.101
http://www.usupi.org/sysad/101.html
ポートフォワーディングで80番ポートを解放せずにブラウジングする - はむはむエンジニアぶろぐ
http://hamuhamu.hatenablog.jp/entry/2017/05/05/095509
SSHポートフォワーディングを知った話 - Qiita
https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81
SSH ポートフォワーディング
http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/ssh_portforwarding.html
Windows でコマンドラインでプロセスを kill する - ablog
http://d.hatena.ne.jp/yohei-a/20090911/1252644040
踏み台サーバ経由で SSH ポートフォワーディングする手順 - Neo's World
https://neos21.net/blog/2019/08/26-01.html
Linux | 多段SSH, ポートフォワーディングの方法 - わくわくBank
https://www.wakuwakubank.com/posts/681-ssh-portforward-multistage/
SSHポートフォワードで、Linuxサーバを踏み台に、その先に通信 [インフラエンジニアのPC環境]
https://pc.oreda.net/tips/sshportfoward
■ポートフォワーディングの実行(EC2)
※「ポートフォワーディングの実行(Vagrant)」も参照
Windows環境から、EC2に対してポートフォワーディングを実行する
以下で対象のEC2に接続できるものとする
> ssh ec2-user@203.0.113.1 -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
以下でポートフォワーディングを実行
> ssh -NCL 80:localhost:80 ec2-user@203.0.113.1 -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
10秒ほど待ってから
http://localhost/
にアクセスすると
http://203.0.113.1/
の内容が表示されるようになった
localhostにアクセスしたとき、サーバには以下のようなアクセスログが記録された
127.0.0.1 - - [06/Dec/2023:13:34:19 +0900] "GET / HTTP/1.1" 200 136 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" 682 - - any
「Ctrl+C」でキャンセルすると、もとの状態に戻った
なおタスクの確認と強制終了は、以下のコマンドで行える
> tasklist | findstr ssh
> taskkill /F /IM ssh.exe
■ポートフォワーディングの実行(接続元IPアドレスの変更)
IPアドレスを変更した状態で、ブラウザソフト経由で他サイトにアクセスする
https://www.cman.jp/network/support/go_access.cgi
IPアドレスは「203.0.113.99」と表示されるとする
以下を実行する
> ssh -NCL 80:www.cman.jp:80 ec2-user@203.0.113.1 -p 10022 -i C:/Users/refirio/Documents/SSH/refirio/refirio-prod.pem
10秒ほど待つ
https://www.cman.jp/network/support/go_access.cgi
IPアドレスは「203.0.113.99」と表示されるが、
http://localhost/network/support/go_access.cgi
http://127.0.0.1/network/support/go_access.cgi
にアクセスするとIPアドレスは「203.0.113.1」と表示される
さらに以下を設定すると
C:/windows/System32/drivers/etc/hosts
127.0.0.1 www.cman.jp
http://www.cman.jp/network/support/go_access.cgi
IPアドレスは「52.193.221.232」と表示される
つまり、接続元IPアドレスを変更できている
※httpsでアクセスすると、「この接続ではプライバシーが保護されません」と表示されるので注意
※さらに他サイトからデータを引っ張ってきている場合、その部分は表示されない可能性があるので注意
■ConEmuで多段接続
コマンドでの接続は、前述の「SSH多段接続の確認」を参照
Poderosaは多段接続に対応していないようなので、ConEmuを試した
(PoderosaでもいったんローカルのSSHにアクセスするなどすれば、多段接続できると思われる。がアクセスが面倒)
Git Bash なら多段接続できるが、Git Bash は画面の色設定をカスタマイズするのが大変そう
ConEmuがよく紹介されているので試した
Git Bashでディレクトリが見にくいので、カラー設定を変更する - みちしるべ
http://orangeclover.hatenablog.com/entry/20120922/1348261855
ConEmu 突っ込んだら Git for Windows の Git Bash がカッコよくなった - てっく煮ブログ
http://tech.nitoyon.com/ja/blog/2014/03/07/fancy-git-bash/
https://conemu.github.io/ にアクセス
「Download」をクリック
「Download ConEmu Stable, Installer (32-bit, 64-bit)」からダウンロードし、インストール
まずは画面の色を調整する。ConEmuを起動し、
View (pallets) → <Solarized (Luke Maciak)>
とすれば「Solarized (Luke Maciak)」の色をプレビューできる。好みのものを探す
Settings → Features → Colors
「Schemes」で起動時の色を設定する
次にConEmuで Git Bash を使えるようにする
Settings → Startup → Tasks
「Predefined tasks」で「7 {Bash::Git bash}」を選択
「Hotkey」に「F1」を入力
下部のテキストエリアに以下を入力
"%ProgramFiles%\Git\bin\sh.exe" --login -i -new_console:d:C:\Users\refirio
これでConEmuを起動してF1キーを押すと、Git Bash を使えるようになる
起動時に初めから Git Bash を使いたければ、
Settings → Startup
で「Specified named task」で「{Bash::Git bash}」を選択する
ConEmuの設定については、以下のページも参考になる
おすすめのCUI環境〜GitBashとConEmu〜 - Qiita
https://qiita.com/CyberMergina/items/69cd5890f05d502716c8
Windows その3 - ConEmuで快適なコンソール環境を・おすすめのコンソールエミュレーター - kledgeb
https://kledgeb.blogspot.jp/2017/01/windows-3-conemu.html
以下、その他の設定メモ
viなどからCtrl+Vでテキストを貼り付けると、複数行でも1行のテキストとして貼り付けられる
以下のように設定すると、複数行のまま貼り付けることができる
Settings → keys & Macro → Paste
「Paste mode #2 (Ctrl+V)」で「Multi lines」にする
■SFTPで多段接続
FileZillaは多段接続に対応していないため、踏み台サーバがあると使えない
C:\Users\refirio\.ssh\config の設定を使ったり、ポートフォワーディングでアクセスしようとしたが、接続できず
設定できなくは無さそうなので、引き続き要勉強
ポートフォワードを使って踏み台先のサーバにFileZillaでファイル送受信する - C-Production
https://c-production.com/8thnote/?p=1626
Windows環境の場合、WinSCPが標準で多段接続に対応しているので、これを使うのが定番になっているみたい
以下のようにすれば接続できたので、いったんWinSCPで対応
(最終的な接続先と踏み台の設定を逆にしないように注意)
むしろ、コマンドやポートフォワーディングの知識が無い人でも使えるので、WinSCPを使う方がいいかもしれない
通常の接続:
「ログイン」ウインドウの「セッション」に、接続情報を設定する
鍵を使った接続:
「ログイン」ウインドウの「セッション」に、接続情報を設定する
鍵は「設定 → SSH → 認証 → 認証条件 → 秘密鍵」に設定する
多段接続での接続
「ログイン」ウインドウの「セッション」に、最終的な接続先(踏み台ではない)を設定する
鍵が必要なら「設定 → SSH → 認証 → 認証条件 → 秘密鍵」に設定する
踏み台サーバの情報は「設定 → 接続 → トンネル」に設定する