(ssh接続可能な)研究室のネットワークに入って論文をサクサクダウンロードする

## モチベーション

## 家から手元のブラウザでサクサク論文をダウンロードしたい

自宅で作業をしていて、研究室内のネットワークからならダウンロードできるのに・・・というときや、外部には公開していない学内ページ、社内ページに家からアクセスできない・・・というときがある。つまり特定のネットワーク経由でブラウザを使いたいときがある。そんな状況が前提。

### 色々な方法

たとえばVPNサーバーが用意されてるなら（あるいは問題が起きない形で自前で用意できるなら）、VPN につなげばいい。スタンダード。快適。解決。ここで終了。そんなのなのはないけどsshはできるときのお話。

sshできるなら、vnc serverを立てて``ssh``でポートフォワードすればブラウザに限らずなんだってできるけど、単にブラウザで特定のページにアクセスしたいときだと、ちょっとoverkill気味だし画面転送越しにRemote側のブラウザ操作って使い勝手がたいてい悪い。Local側の使い慣れたブラウザでサクサクアクセスしたい。

### 「ブラウザしかつかわない」 x 「sshできる」という状況ならSOCKS

その特定のネットワークに普段``ssh``でアクセスしているならもっとお手軽な方法がある。``ssh``によるSOCKS Proxyを使う方法である。これを行うと、Local側のブラウザが行う通信をsshのポートフォワードでremoteを経由して行うことができる。

## 用意するもの

### sshの環境
アクセスしたいネットワーク内の端末に``ssh``できるようにしよう。UNIX系やmacなら環境は整っているはず。Windowsならたとえば[WSL](https://qiita.com/MERIK/items/ef4ecf7a51f89c403e94 "WSLでwindows上にLinuxのGUI環境を作る")かcygwinがあればよい。

アクセスしたい端末に鍵を登録して、下が通ればOK。

```
$ ssh hogehoge@remote.sam.ple
```


### ブラウザの環境

PROXYを通せればよい。どのブラウザでも問題ないはず。
<font color="LightGrey">windows環境の人でWSLでGUI環境を利用しているからといって、Ubuntu上のブラウザを使う必要はない。通常のwindowsアプリケーションのブラウザを使うことができる。</font>

Chromeを使う場合、[Proxy Helper](https://chrome.google.com/webstore/detail/proxy-helper/mnloefcpaepkpmhaoipjkpikbnkmbnic "Chrome Web Store Proxy Helper")エクステンションを追加するとネットワークの切り替えが楽になる。

Proxyの設定は、server typeをSOCKS5、addressを127.0.0.1、portを1080にすればよい。ここではChromeに[Proxy Helper](https://chrome.google.com/webstore/detail/proxy-helper/mnloefcpaepkpmhaoipjkpikbnkmbnic "Chrome Web Store Proxy Helper")をいれたとして具体的に説明する。
[Proxy Helper](https://chrome.google.com/webstore/detail/proxy-helper/mnloefcpaepkpmhaoipjkpikbnkmbnic "Chrome Web Store Proxy Helper")を導入した人はアイコンを右クリックしてオプションページを開き、SOCKS5にチェックしてSOCKS Proxyを127.0.0.1にしてポートを1080にすればよい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240524/5bd698cc-4dad-7ced-0e9e-10b90a96c666.png)

<font color="LightGrey">なお、127.0.0.1は「自分自身のネットワーク」すなわちlocal hostを意味し、指定した1080はSOCKSが通常利用するポート番号である。ポート番号は開いているなら、1025から65536の間の任意の整数でもOKだけど、普通はアサインされている番号を使う。</font>

# やってみる

### SOCKS serverをたてる。

``-D``オプションをつけて``ssh``すればよい。

```
$ ssh -D localhost:1080 hogehoge@remote.sam.ple
```

``-D``オプションはダイナミックポートフォワーディングするときに用いるオプションでSOCKS5をサポートしており、このssh接続がSOCKS serverの役割を担う。

``localhost:1080``はブラウザに設定した127.0.0.1とポート番号1080に対応している。

### SOCKSプロキシを通してブラウザを使う
あとはSOCKS proxyを用いてブラウザを使えば``hogehoge@remote.sam.ple``のネットワーク経由でブラウザを利用できる。[Proxy Helper](https://chrome.google.com/webstore/detail/proxy-helper/mnloefcpaepkpmhaoipjkpikbnkmbnic "Chrome Web Store Proxy Helper")を導入した人はアイコンを左クリックしてSOCKS PROXYを選べばよい(戻すにはDIRECTにすればよい)。

### うまくできているかのチェック
動作をチェックするために自分のglobal ipを調べてみる。ブラウザからなら[ifconfig.ip](http://ifconfig.io/ "ifconfig.io")や[CMAN](https://www.cman.jp/network/support/go_access.cgi "アクセス情報【使用中のIPアドレス】")などにアクセスすれば簡単に調べられる。そういうサイトを使うのが嫌な場合はコマンドラインから、``dig +short myip.opendns.com @resolver1.opendns.com``を**そのまま**打てばよい。
SOCKSがうまくいっているならプロキシを通す前後で出力されるアドレスが変わるはずである。

## 補足

``ssh``のダイレクトフォワーディングにおいて``-C``オプションを付けるとremoteとの通信を圧縮できる。また、``ssh``をバックグラウンドにしたい場合は``-f``と``-N``をつけて``ssh -D 1080 -fCN hogehoge@remote.sam.ple``とすればよい。

## 注意点

SOCKSプロキシを通しているときは``ssh``しているサーバーごしに通信することになるので、必要な作業が終わったらプロキシを外すかsshを切るのをお忘れなく。

## 参考

[How To Route Web Traffic Securely Without a VPN Using a SOCKS Tunnel](https://www.digitalocean.com/community/tutorials/how-to-route-web-traffic-securely-without-a-vpn-using-a-socks-tunnel "How To Route Web Traffic Securely Without a VPN Using a SOCKS Tunnel")