SSHダイナミックポートフォワードを使ってローカルマシンから固定IPアドレスでWebアクセスをする

あるWebサイトにアクセスする際に固定IPアドレスが必要。（複数人)
でも自宅は固定IPサービスを持っていない。
外部に固定IPを持ったマシンは作れる。(AWSなど)

そんな時にSSHダイナミックポートフォワードを使うことでローカルマシンから外部の固定IPを経由してWebサイトにアクセスし、ブラウザで表示できたのでメモ。

# 環境

+ ローカルPC(Mac OSX 10.11.4)
+ リモートサーバー(Amazon Linux AMI 2016.03.0)

# 参考

+ [OpenSSH[実践]入門 (Software Design plus)](http://www.amazon.co.jp/OpenSSH-%E5%AE%9F%E8%B7%B5-Software-Design-plus/dp/4774168076/ref=sr_1_1?ie=UTF8&qid=1460961432&sr=8-1&keywords=ssh)
+ [特定のネットワーク内からしか見れないウェブページを外から見る方法](https://rcmdnk.github.io/blog/2014/09/04/computer-remote/)

# ダイナミックポートフォワードでlocalhostからのみアクセスできるページを確認してみる

## サーバー側の準備

まずはいきなり、本題を実施せず、ダイナミックポートフォワードがうまくできるかやってみます。

httpdの情報が取得できるserver-statusを有効にします。
その後、上記サイトへはlocalhostからのアクセスのみ許可するように設定し、ローカルマシンのブラウザから確認できるかやってみます。


```bash
# httpdのインストール
$sudo yum install httpd -y

# 設定ファイルを変更し、server-statusを有効化
$sudo vi /etc/httpd/conf/httpd.conf

```

```/etc/httpd/conf/httpd.conf
<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost
</Location>
```

```bash
# サービス起動
$sudo service httpd start

# server-statusが取得できることを確認
$curl http://localhost/server-status
```

これでサーバー側の準備ができました。

## ローカルマシンから確認してみる

次にローカルマシンからSSHダイナミックポートフォワードで接続します。
これによってローカル->リモートサーバー間をSSHで接続します。
sshコマンドの`-D [port]`と指定することでダイナミックポートフォワードの有効化とローカルホストのどのポートをリモートサーバーにフォワードさせるか決めます。

```bash
$ssh -v -D 1080 ec2-user@xx.xxx.xxxx.xxx -i ~/.ssh/hoge.pem
・・・
debug1: Local connections to LOCALHOST:1080 forwarded to remote address socks:0
debug1: Local forwarding listening on ::1 port 1080.
debug1: channel 0: new [port listener]
debug1: Local forwarding listening on 127.0.0.1 port 1080.
debug1: channel 1: new [port listener]
debug1: channel 2: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
・・・
```

成功した場合、上記のようにSOCKSプロトコルにより、1080がフォワードされることが確認できます。

なお、バックグラウンドSSHを実行させたい場合には以下のオプションで実行します。

```bash
$ssh  -v -N -f -L ec2-user@xx.xxx.xxxx.xxx -i ~/.ssh/hoge.pem
```

SSHは接続したままで次はローカルマシンからこのSSHで接続された通信を利用してlocalhostからしかアクセスできないサイトに`curl`コマンドでアクセスしてみます。

```bash
$curl --socks5 localhost:10080 http://127.0.0.1/server-status
```

アクセスできました!

ちなみにオプションで以下でもできました。

+ --socks4
+ --socks4a
+ --socks5-hostname

基本的にSOCKSプロトコルであればバージョンはある程度対応できているようですね。

## Firefoxからアクセスしてみる

以下を参考にやってみました。

[特定のネットワーク内からしか見れないウェブページを外から見る方法](https://rcmdnk.github.io/blog/2014/09/04/computer-remote/)

が、環境設定のProxyでSOCKSの設定をやってもうまくいかない。。。
CLIではうまくいっているので設定の問題ではないはず。。

[Firefoxからsshのダイナミック転送を使って非公開サーバへアクセスする](http://d.hatena.ne.jp/tkng/20090621/1245539830)

こちらを見ると設定であるホストへのアクセスの場合にはSOCKSのプロキシを使ってねという設定をJSでしています。
気になったのはFirefoxの設定だとアクセス時に対象のProxyがHTTPプロキシなのかSOCKSプロキシなのか設定するわけではないので、アクセス時に誤ってHTTPプロキシなどとして動作していたら動かないだろうなという予想がつきました。

参考サイトのようにJSでやっても良かったのですが、少し面倒そうだったので良さげなアドオンがあったのでこれを使ってみます。

[Socks Proxy](https://addons.mozilla.org/ja/firefox/addon/socks-proxy/)

まずは設定をします。以下の流れで設定画面を表示させます。

Firefoxの設定(画面の右上の横線三つ)->アドオン->拡張機能->Socks Proxy->設定

以下のように設定(localhostの1080をSOCKS5のプロキシとして利用)

![Screen Shot 2016-04-18 at 8.24.52 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/2810442b-f734-6466-6cd5-8a1dda2de6ba.png "Screen Shot 2016-04-18 at 8.24.52 AM.png")


これで設定は完了です。
Firefoxの画面に戻り、画面右上のソックスのアイコンを押してSOCKSプロキシを有効化させ、アクセスしてみます。

![Screen Shot 2016-04-18 at 8.26.56 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/1b6f95e7-c212-6986-a823-4b7d687f48a9.png "Screen Shot 2016-04-18 at 8.26.56 AM.png")

おお!
localhostからしかアクセスできないページへSSHの接続経由で自身のMacからアクセスできました

FirefoxからSOCKSのProxyを使ってアクセスしたくない場合、ソックスのアイコンを押してdisableにすればOKです

# SSHポートフォワードでWebサイトに固定IPでアクセスする

いよいよ本題です。
実験のため、もう1台Webサーバーを起動しておき、80番ポートは解放しておきます。

SOCKSのProxyを経由せず、自分のPCからブラウザでアクセスすると以下のようになります。

```/var/log/httpd/access_log
xxx.xxx.xxx.xx - - [18/Apr/2016:06:01:06 +0000] "GET / HTTP/1.1" 403 3839 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36"
xxx.xxxx.xxx.xx - - [18/Apr/2016:06:01:06 +0000] "GET /icons/apache_pb2.gif HTTP/1.1" 200 1797 "http://
```

自宅の回線は固定IPではないので、アクセスのタイミングでアクセス元IPアドレスはバラバラになります。

次に先ほどのSSHダイナミックポートフォワード経由でFirefoxからアクセスしてみます。

```/var/log/httpd/access_log
52.193.129.240 - - [18/Apr/2016:06:02:00 +0000] "GET / HTTP/1.1" 403 3839 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0"
52.193.129.240 - - [18/Apr/2016:06:02:00 +0000] "GET /icons/apache_pb2.gif HTTP/1.1" 200 1797 "http://52.68.107.79/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0"
52.193.129.240 - - [18/Apr/2016:06:02:00 +0000] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0"
```

するとSSHでダイナミックポートフォワードしているEC2(グローバルIPが52.193.129.240)からのアクセスとなっています！

おお、やりたい事ができたー。

社内からのProxy経由で固定IPが確定しない時もSSHで固定IPを持ったリモートサーバーへアクセスできればSSHポートフォワードを使ってアクセスの確認ができて便利です。