rcmdnk's blog
Last update

Proxy: An Avalon Novella (HarperTeen Impulse)

サイトへのアクセスが特定のネットワーク内だけに限られていたり、 また、ローカルのマシンの設定などを見たいためにプライベートIPに 接続して見たりしたいときに そのネットワーク内の端末を踏み台にしてウェブページを見る方法のまとめ。

Sponsored Links

ポートフォワード

特定のネットワーク内からしか見れないウェブページを見るためには、 そのネットワーク内にある端末のポートを使って プロキシサーバーに使ってアクセスします。

そのためにまずはダイナミックポートフォワードを行う必要があります。

ターミナルから行う

$ ssh -N -f -D 10080 user@example.com
  • -N: リモートでコマンドを実行しない。
  • -f: コマンド実行前にバックグラウンドへ移行。
  • -D [<bind_address:>]<port>: ダイナミックポートフォワード。 <bind_address:>を指定しない場合はlocalhostの<port>番号がSOCKSプロキシになります。

ダイナミックポートフォワードの設定は~/.ssh/configに書いておくことも出来て、

~/.ssh/config
1
2
3
4
Host tunnel
  HostName example.com
  User user
  DynamicForward 10080

と書いておいて、

$ ssh -N -f tunnel

とすれば上のコマンドと同じ結果になります。

他にexample.comを普通にsshで使う様な場合には

~/.ssh/config
1
2
3
4
5
Host example tunnel
  HostName example.com
  User user
Host tunnel
  DynamicForward 10080

のように、接続設定は通常の接続(example)と同時に行って、 tunnel部分だけDynamicForwardを足す、ということも出来ます。 (最初の方にIdentifyfile等の設定を加えても勿論OK。)

-f-Nconfigでは設定できない様なので、 面倒だったら

alias tunnel="ssh -f -N tunnel"

の様な物を.bashrcに書いておいてtunnelコマンドで出来るようにするとか。

この方法だとバックグラウンドで実行されるので、 後々消すにはps -A|grep ssh|grep tunnel などとしてPIDを調べてkill <pid>したりしないといけません。 (kkコマンドを使うと簡単に絞り込めて消せるので便利。)

もし、それ程長く使用しないできちんと消したい場合には -fを外して

$ ssh -N -D tunnel

としておけばターミナル上では実行されたままの状態になるので、 Ctrl-cを押すと停止することが出来ます。

Cygwinなんかだとターミナルを落とせば全てのプロセスが落ちるので 自動的に切れますが。

これらの設定は直接アクセスできないような端末を多段sshを使って踏み台にすることも出来ます。

~/.ssh/config
1
2
3
4
5
6
7
8
9
Host server
  HostName server.example.com
  user_at_server
Host example tunnel
  HostName example.com
  User user
  ProxyCommand ssh server -W %h:%p
Host tunnel
  DynamicForward 10080

みたいなのを書いておけばssh exampleとするとserverを踏み台にして example.comに通常ssh接続出来るようになり、 ssh -N -f tunnelとすればserverを踏み台にしてexapleに接続し SOCKSプロキシを作ることが出来ます。

多段ssh設定のまとめ

ルータ越しでポート指定なども出来ない場合にもSSHで接続出来るようにする

PuTTY

新しいセッションを 踏み台にしたいHost NameとPort 22で作り、 ConnectionData Auto-login username にユーザー名を入力します。

ポートフォワードの設定は ConnectionSSH Tunnels を開いて、

  • Source port: 10080
  • Destination: 空白のママ
  • Dynamicをチェック
  • Autoをチェックしたまま

の状態にしてAddボタンを押します。

putty

これで接続すれば

$ ssh -D 10080 user@example.com

したのと同じ状態になります。 ターミナルを消せば接続が終わります。

プロキシ設定

Mac全体での設定

システム環境設定からネットワーク を選ぶか、メニューバーのリンゴマークから ネットワーク環境ネットワーク環境設定 を選んでネットワークの設定を表示させます。

出てきた画面で使用しているネットワークを選択した上で 右下の詳細をクリック。

出てきた画面で プロキシタブを選んで、 構成するプロトコルを選択の一覧から SOCKSプロキシを選択してチェックを入れ、 右上に出てくるSOCKSプロキシサーバーlocalhost:10080となるように入力します。

macsetting

Windows全体での設定

コントロールパネルから ネットワークとインターネット インターネットオプションインターネットのプロパティ が開かれるので、そこで 接続タブへ行き、下にあるLANの設定を開きます。

winsetting0

出てきた画面でLANにプロキシサーバーを使用する にチェックを入れ、 詳細設定を開きます。

この画面でMac同様Socksのアドレスの欄にlocalhost、 その右のポートの欄に10080を入力してOKして閉じます。

winsetting1

Google ChromeやIE,Safariその他メールソフトなどでの設定

Google Chromeの設定画面でネットワークのプロキシ設定の変更を選んでもこれらのOSの 設定画面が出てきます。

IEやSafariの設定もOSの設定のものになります。

またメールソフトなどの設定も基本的に全てOSの全体の設定に従います。

なので、設定後にポートフォワードをやめてしまうと 基本的にブラウザやメールソフトなど全て使えなくなってしまうので、 きちんと戻しておかないといけません。

特にChromeとかだとChromeの中から設定を開くので Chromeだけの設定っぽく見えてしまうこともありますが、 OS全体の設定なので注意です。 (Chromeではプロキシを使って、Safariでは使わず、みたいなことは出来ません。 一方、下に書くようにFirefoxは独自の設定を行うのでFirefoxだけ違う設定を使うことは出来ます。)

Firefoxでの設定

FirefoxではFirefoxだけの設定も行えます。

  • Mac: ファイル環境設定
  • Windows: ツールオプション

で設定画面を開いて詳細へ行き、ネットワークタブを開きます。

さらに接続設定を開きます。

firefoxsetting0

出てきた接続設定(プロキシの設定)画面で、 手動でプロキシを設定するを選択し、 SOCKSホストの欄にlocalhost、 右のポートに上で設定した10080を入力します。

firefoxsetting0

で、OK。

上の接続設定の画面で、 システムのプロキシ設定を使用する にチェックしておくと上で行ったMacやWindows全体の設定と同じものを 使うようになります。

自動プロキシ構成スクリプトを使って自動でプロキシを変更する

プロキシの設定をいちいち変更するのは面倒ですが、 決まったURLに対してだけプロキシを使うように設定しておくことも出来ます。

上のMac/Windows/Firefoxそれぞれの場合で プロキシを設定する画面で 自動プロキシ構成/ 自動構成スクリプトを使用する/ 自動プロキシ設定スクリプトURL を選択すると自動スクリプトのURLを記入出来る様になります。

ここで、この様なPACファイルを作っておいて その場所を指定してあげます。

~/.proxy.pac
1
2
3
4
5
6
7
function FindProxyForURL(url, host){
  if (dnsDomainIs(host, "remote.example.com")
      || shExpMatch(host, "192.168.001.*")){
    return "SOCKS5 localhost:10080; DIRECT";
  }
  return "DIRECT";
}

このファイルでやってることは 開いたページのドメインが”remote.example.com”であるか もしくは”192.168.001.”で始まる場合に はlocalhost:10080を使い、 もしこれが使用できない場合は通常の直接接続を行います。 それ以外のURLの場合には通常の直接接続を最初から行います。

もっと簡潔に

~/.proxy.pac
1
2
3
function FindProxyForURL(url, host){
  return "SOCKS5 localhost:10080; DIRECT";
}

とすれば全てのページについて localhost:10080が使える場合にはそれを使って 使えない場合には直接接続を行う様にも出来ます。 (速度的な問題がなさそうなので今はこちらを使用中)

この辺のチェックの仕方については下記のページや FindProxyForUrl で検索すると色々出てきます。

付録 B : 自動プロキシ構成スクリプトの例

Netscape Proxy Autoconfig

このファイルを自動プロキシ設定スクリプトのURLの指定の所に書いてあげればOK。

ローカルにあるファイルであれば

file:///Users/user/proxy.pac

みたいに最初にfile://をPATH付けて書けばOK。

Windowsの場合には

file:///C:/Users/user/proxy.pac

の様に最初にC:も加えて、 WindowsですがPATHの区切りは/になります。

勿論通常のhttpでアクセス出来るものでも良くて

https://raw.githubusercontent.com/rcmdnk/dotfiles/master/.proxy.pac

こんな感じでGitHubに置いておいて、これをそのままURLとして書き込めば ネットに置いてあるものを使うことも出来ます。

追記: 2014/10/06

Sophosの様なウィルス対策ソフトを入れると プロキシの設定があると はじいてページを表示できなくなることがあるので ウィルス対策ソフト側で設定を行う必要があることがあります。

Macでウィルス対策ソフトSophosを入れてみた, Proxyを使ったりする際の注意点

追記ここまで

Sponsored Links
Sponsored Links

« GitHubでWeb上で縦分けdiffが出来るようになった pow+xip.ioでOctopressのローカルプレビューを他の端末から見る »