SSHダイナミックポート転送で内部専用Webページにアクセスする

(2020.3.18)

学内に学外からSSHでログインできるグローバルIPアドレスをもったマシンがあるとする。すると,SSHのダイナミックポート転送とブラウザのSOCKS PROXY設定を使って,学外のマシンでそのグローバルIPアドレスのブラウザからアクセスしたようにWeb閲覧することができる。例えば,学内のアドレスからしかアクセスできない学内専用サイトを,学外のマシンから閲覧できるようになる。 (このやり方は,同僚のT先生からきいたもので,以下はやり方を忘れないためのメモ)

ダイナミックポート転送

SSHコマンド

ssh -D 1080 ユーザー名@ホスト名

と打つと,ポート番号1080でダイナミック転送が確立される。sshを切断するまで,この状態は維持される。1080は,使われてないポート番号なら何でもよい。

Tera Term

Tera Termでは,sshで接続後,[設定]-[SSH転送]-[追加]で[ダイナミックポート]を選び,1080を入力して,[リッスン]は空欄のままにして[OK]。もう一度[OK]でダイナミックポート転送が開始される。この設定は[設定]-[設定の保存]で保存でき,次回からはSSH接続後,[設定]-[SSH転送]-[OK]だけでダイナミックポート転送が開始される。

省力化: batファイル (Windows 10)

毎回,接続の度にコマンドを打ったり,teratermを立ち上げるのは面倒なので,sshコマンド1行のスクリプトを書いておくと便利。 Windows 10の場合は,

ssh -D 1080 ユーザー名@ホスト名

をバッチ・ファイル(拡張子がbatのファイル)に書いておけば,このファイルをダブルクリックしてパスワードを入れるだけでダイナミックポート転送が確立する。なお,ssh公開鍵認証の場合は,

ssh -D 1080 ユーザー名@ホスト名 -i c:\users\ユーザ名\.ssh\秘密鍵ファイル名

とすれば,パスワード入力もない。(秘密鍵は.sshフォルダに入れとかないとパーミッションエラーになるので注意。)

SOCKS PROXY

ブラウザのプロクシをlocalhostの1080ポートのSOCKSに設定してやると,ダイナミックポート転送された1080ポートを通じてブラウズが行われる。

Windowsで設定するには*

  • [スタート]-[Windowsシステムツール]-[コントロールパネル]をクリックする。

  • [ネットワークとインターネット]-[インターネットオプション]-[接続]-[LANの設定]で[LANにプロキシサーバーを使用する]をチェックする。

  • [詳細設定]をクリックする。

  • [すべてのプロトコルに同じプロキシサーバーを使用する]チェックを外し,[Socks]にlocalhostと1080と入れ,その他は空欄にし,[OK]。

  • [OK]をクリックしてLANの設定をぬける。

この設定はダイナミックポート転送する時だけ必要で,転送が不要になったら,[LANにプロキシサーバーを使用する]のチェックをはずして通常の設定に戻す。sshはexitコマンドで終了する。

Proxy Helper for Chrome

ブラウザにはプロキシ設定を切り替えるアドオンがあることが多い。Chromeブラウザの場合,Proxy Helperというアドオンを入れるとよい。Proxy Helperを入れるとOptionsという画面が現れる。そこに,

SOCKS PROXY: localhost PORT: 1080

と入れる(太字部分)。このOptions画面は,ChromeのURL欄の横あたりにあるProxy Helperのアイコンを右クリックして[オプション]を選べば出てくる。

設定できたら,Proxy Helperのアイコンをクリックして[SOCKS PROXY]を選ぶと,ブラウザのプロクシが設定され,以後,ブラウザでのアクセスは1080をダイナミックポート転送したマシンのIPアドレスから,となる。

転送が不要になったら,Proxy Helperのアイコンから[SYSTEM]を選んでプロクシの設定を元に戻し,sshをexitコマンドで終了する。

自動化

毎回,接続の度にコマンドを打ったり,プロキシを設定したりするのは煩わしい。 以下のバッチファイルは,ダブルクリックでプロキシ設定とダイナミックポート転送開始をおこない,ctrl+Dで転送終了とプロキシ設定の解除をおこなう(Windows 10の場合)。

@echo off

chcp 65001


reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1 > nul

inetrefresh.exe

echo プロキシをonにしました。

echo.

echo 終了するにはctrl+Dと打ってから,ctrl+Cを2回打って下さい。

echo.

ssh -D 1080 ユーザー名@ホスト名 2> nul

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 0 > nul

inetrefresh.exe

echo プロキシをoffにしました。

pause

(注:このbatファイルの文字コードはUTF-8にしてください)

なお,このbatファイルには,プロキシ設定変更を反映する実行フィルinetrefresh.exeが必要。inetrefreshはここからソース

#include <iostream>

#pragma comment(lib,"wininet")

#include <windows.h>

#include <wininet.h>


int main()

{

std::cout << "refresh internet option\n";

BOOL bResult1 = InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0);

BOOL bResult2 = InternetSetOption(0, INTERNET_OPTION_REFRESH, 0, 0);

return bResult1 && bResult2;

}

をコピーしてVisual Studio 2019でコンパイルしたもの。

inetrefresh.exeは,各自でコンパイルするか,[researchmap]からダウンロードして,上記バッチファイルと同じフォルダにコピーして使って下さい。