41
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SSHポートフォワーディングのプチ魔術

Last updated at Posted at 2019-03-06

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

解説

踏み台サーバーを使う場合

無題のプレゼンテーション_-_Google_スライド.png

まず、上の図が示したサーバー配置があるとして、ローカル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)

上記コマンドを軽く説明する:

  1. ssh -fNLバックグラウンドモード ssh接続を作らない ローカルのポートがフォワーディング先 この三つフラグをつけた。-Nがない場合、トンネルと別に、普通のSSHアクセスも一個立ち上がれる。-fがない場合、セッションはずっと使い続ける。
  2. 2200 これはローカルの2200ポートをポートフォワーディング先として指定している。当然、その他使われていないポートであれば、どれでもいい。また、ローカルであるため、ホスト名を省略したが、本来は127.0.0.1:2200と書くべきである。
  3. target.host.com:22は、フォワーディング元はtarget.host.comの22番ポートだよ〜と指定していた。
  4. この部分は踏み台サーバーjump.host.comにSSHでログインする時と同じ設定、Passwordやポート指定もできる。

SSH接続

SSHトンネルが開放できたら、localhost:2200target.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)

上記コマンドを軽く説明する:

  1. ssh -fNDバックグラウンドモード ssh接続を作らない ダイナミックフォワーディングをするの意味である。-Dを使えば、対象サーバーのホストやポートを指定せず、あらゆるサービスを利用できる。
  2. 4242 これはローカルの4242ポートをポートフォワーディング先として指定している。もちろん、ご自由に変えられる。
  3. 同じく、SSHログイン用の設定

プロキシ設定

OSのインターネット設定のところで自力で探してもいいし、Chromeの場合、chrome://settings/?search=プロキシにアクセスすればすぐ辿りつく。
設定.png

Macの場合は下記設定で十分である。プロキシクライアントやWindowsでの設定は割愛致す。
スクリーンショット_2019_03_06_14_13.png

設定がうまく行けば、ウェブサイトに提示されたIPアドレスはjump.host.comのアドレスになっているはず。
アクセス情報【使用中のIPアドレス確認】.png

理論上、某大国のインターネット遮断に対抗することも期待できるが、その時はAWSじゃなくて、サクラなどレンタルサーバーがいいと思う。AWSのIPが時々遮断されるという噂があったためである。

リバースフォワーディング(なんちゃってNgrok)

Ngrokはローカルのサイトを一時的にインターネット上に公開できるサービスである。昔からお世話になっている。しかしNgrokは有料サービスを購入しない限り、起動するたび、ランダムのURLが発行されて、しかも1アカウントは同時1サービスしか公開できない。Ngrok1はOSSであるため、時に自前のNgrokサーバーを立てる記事が見られるが、どれも面倒で失敗しそう。実はSSHを使えば同じ程度のことができる。

サーバー側のSSH設定

デフォルトの場合、リバースフォワーディングの一部の機能は制限されていた。まずこの制限を解除しないといけない。

  • sshd_configを編集
$ sudo vim /etc/ssh/sshd_config
  • GatewayPorts yesにする
/etc/ssh/sshd_config
...
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)

上記コマンドを軽く説明する:

  1. ssh -fNRバックグラウンドモード ssh接続を作らない リモートのポートがフォワーディング先である。
  2. リモートのフォワーディング先、ホスト名はログインホストと一緒なので省略したが、本当はjump.host.com:8080*:8080が正しい。
  3. ローカルのフォワーディング元を指定、今回は3030
  4. 同じく、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

41
41
1

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
41
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?