TL;DR
とりあえず下記のコマンドを覚えること(AWS EC2を例として):
# 踏み台サーバーを使う
$ ssh -fNL 2200:target.host.com:22 -i jump-host-key.pem ec2-user@jump.host.com
$ ssh -i target-host-key.pem ec2-user@localhost -p 2200
# ダイナミックフォワーディング(なんちゃってプロキシ)
$ ssh -fND 4242 -i jump-host-key.pem ec2-user@jump.host.com
## chrome://settings/?search=プロキシ にアクセスして下記設定を行う
## プロトコール: Socks または Socks5
## サーバー: localhost:4242
# リバースフォワーディング(なんちゃってNgrok)
## サーバー側設定:
## 1. 8080を開放
## 2. /etc/ssh/sshd_config に `GatewayPorts yes` を追記
## 3. sshdを再起動
$ ssh -fNR 8080:localhost:3030 -i jump-host-key.pem ec2-user@jump.host.com
解説
踏み台サーバーを使う場合
まず、上の図が示したサーバー配置があるとして、ローカルPCはサーバー jump.host.com
にのみアクセスできる、サーバー target.host.com
に直接アクセスできない(IP制限などがかけたとして)。
こういう場合、普通jump.host.com
を踏み台サーバーとして、まずjump.host.com
にログインして、そしてjump.host.com
に置かれたSSHキーtarget-host-key.pem
を使ってtarget.host.com
にログインする。
しかしこうすると、まず、対象サーバーのキーを踏み台サーバーに置いてしまったことはセキュリティホールになりうる。そして対象サーバーにファイルをアップしたい時は一旦踏み台サーバーにファイルをアップして、そしてscp
コマンドで対象サーバーにコッピーすることになる。
下記手順を踏まえば、ローカルPCのlocalhost:2200
にアクセスすることで、直接サーバーtarget.host.com
にログインでき、FileZillaなどFTPクライアントも自在に使える。
SSHトンネルの開放
$ ssh -fNL 2200:target.host.com:22 -i jump-host-key.pem ec2-user@jump.host.com
# ________ ____ __________________ ___________________________________________
# (1) (2) (3) (4)
上記コマンドを軽く説明する:
-
ssh -fNL
はバックグラウンドモード
ssh接続を作らない
ローカルのポートがフォワーディング先
この三つフラグをつけた。-N
がない場合、トンネルと別に、普通のSSHアクセスも一個立ち上がれる。-f
がない場合、セッションはずっと使い続ける。 -
2200
これはローカルの2200ポートをポートフォワーディング先として指定している。当然、その他使われていないポートであれば、どれでもいい。また、ローカルであるため、ホスト名を省略したが、本来は127.0.0.1:2200
と書くべきである。 -
target.host.com:22
は、フォワーディング元はtarget.host.com
の22番ポートだよ〜と指定していた。 - この部分は踏み台サーバー
jump.host.com
にSSHでログインする時と同じ設定、Passwordやポート指定もできる。
SSH接続
SSHトンネルが開放できたら、localhost:2200
が target.host.com:22
と同じ意味持つことになる。普通にSSHログインさえすれば入れる。また、FTPクライアントに該当設定をすれば、SFTP接続もできる。
$ ssh -i target-host-key.pem ec2-user@localhost -p 2200
ダイナミックフォワーディング(なんちゃってプロキシ)
IP制限をかけたサイト(例えば企業内限定ページ)を一般のPCで閲覧する場合では、プロ棋士プロキシがよく使われている。世の中有料VPNサービスやOSSのプロキシソフトはたくさんあるが、インストールするのが手間で、すぐも使いたい場合、SSHで手軽にプロキシサービスができる。
SSHトンネルの開放
$ ssh -fND 4242 -i jump-host-key.pem ec2-user@jump.host.com
# ________ ____ ___________________________________________
# (1) (2) (4)
上記コマンドを軽く説明する:
-
ssh -fND
はバックグラウンドモード
ssh接続を作らない
ダイナミックフォワーディングをする
の意味である。-D
を使えば、対象サーバーのホストやポートを指定せず、あらゆるサービスを利用できる。 -
4242
これはローカルの4242ポートをポートフォワーディング先として指定している。もちろん、ご自由に変えられる。 - 同じく、SSHログイン用の設定
プロキシ設定
OSのインターネット設定のところで自力で探してもいいし、Chromeの場合、chrome://settings/?search=プロキシにアクセスすればすぐ辿りつく。
Macの場合は下記設定で十分である。プロキシクライアントやWindowsでの設定は割愛致す。
設定がうまく行けば、ウェブサイトに提示されたIPアドレスはjump.host.com
のアドレスになっているはず。
理論上、某大国のインターネット遮断に対抗することも期待できるが、その時はAWSじゃなくて、サクラなどレンタルサーバーがいいと思う。AWSのIPが時々遮断されるという噂があったためである。
リバースフォワーディング(なんちゃってNgrok)
Ngrokはローカルのサイトを一時的にインターネット上に公開できるサービスである。昔からお世話になっている。しかしNgrokは有料サービスを購入しない限り、起動するたび、ランダムのURLが発行されて、しかも1アカウントは同時1サービスしか公開できない。Ngrok1はOSSであるため、時に自前のNgrokサーバーを立てる記事が見られるが、どれも面倒で失敗しそう。実はSSHを使えば同じ程度のことができる。
サーバー側のSSH設定
デフォルトの場合、リバースフォワーディングの一部の機能は制限されていた。まずこの制限を解除しないといけない。
-
sshd_config
を編集
$ sudo vim /etc/ssh/sshd_config
-
GatewayPorts yes
にする
...
GatewayPorts yes
...
- sshdを再起動(OSによってコマンドが変わる場合がある)
$ sudo /etc/rc.d/init.d/sshd restart
必要があれば、EC2のセキュリティグループにフォワーディング先のポートを開放(今回は8080)
SSHトンネルの開放
$ ssh -fNR 8080:localhost:3030 -i jump-host-key.pem ec2-user@jump.host.com
# ________ ____ ______________ ___________________________________________
# (1) (2) (3) (4)
上記コマンドを軽く説明する:
-
ssh -fNR
はバックグラウンドモード
ssh接続を作らない
リモートのポートがフォワーディング先
である。 - リモートのフォワーディング先、ホスト名はログインホストと一緒なので省略したが、本当は
jump.host.com:8080
や*:8080
が正しい。 - ローカルのフォワーディング元を指定、今回は
3030
。 - 同じく、SSHログイン用の設定
設定が完了すれば、jump.host.com:8080
ではlocalhost:3030
と同じサイトが見れる。
PS: ポート80や443を使いたい場合、予めサーバーにNginxやApacheとかを入れて、8080をlistenするといい。rootユーザーじゃないと1000番以下は使えないからである。
余談
上記SSHトンネルコマンドは全部-f
を入れており、バックグラウンドで動いている。それらのトンネルを終了したい場合、該当ポートを使用しているプロセスをkill
すればいい。
$ sudo lsof -i:2200
COMMAND PID
ssh 65924
$ kill 65924
TODO
これらの手法をHerokuでも使ってみること。
参考
SSHポートフォワーディング系
https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81
http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/ssh_portforwarding.html
[中国語]https://blog.twofei.com/528/
[中国語]https://blog.csdn.net/evandeng2009/article/details/51926797
[中国語]http://www.sohu.com/a/161797470_468694
SSH設定系
https://qiita.com/FGtatsuro/items/e2767fa041c96a2bae1f
https://orebibou.com/2014/10/sshサーバsshd再起動の方法(os別)/
その他
https://utano.jp/entry/2016/07/mac-and-linux-process-using-port-check-lsof/
https://devcenter.heroku.com/articles/exec