脱獄!社内プロキシ環境から自由にインターネットをする方法

比較的に大きな会社では、NAT で直接インターネットに抜けるのではなく、ブラウザに社内の HTTP Proxyサーバー(以降 プロキシ)を設定してWebにのみアクセスさせる場合が多いと思います。この場合、社内のProxyの設定によってはフィルター機能(ブラックリスト)により、検索エンジンの検索結果に問題を解決できそうなサイトがあったとしても、アクセス禁止画面表示されたりすることがあります。

私も過去何度も悔しい思いをしました。その場合、スマホで調べなおして当然コピペができないので、スマホ画面を見ながら手打ちするなど間抜けな状態になります。社外秘を外に出さないためなのか Google 翻訳が自由に使えないなんてこともあります。また、LINE や Discord などのコミュニケーションツールのサーバーにアクセスが許可されていない場合もあると思います。

会社内でも、自由に Web を閲覧し、自由にコミュニケーションツールを利用できたらもっと効率よく作業ができるのに!といった問題を解決する方法を紹介します。

場合によっては懲戒の対象になります。会社の規定を違反していることを自覚し、個人情報や社外秘の情報の取り扱いには十分注意してください。
当サイトは一切責任を取りません。すべて自己責任でお願いします。
スポンサーリンク

SSHポートフォワードを利用する

いきなり答えを言いますが、社内のプロキシ環境から、自由にインターネットをするために、SSHポートフォワードを利用します。この記事では、プロキシ経由でSSHポートフォワードを利用し、社内のPCから自宅のPCへリモート接続を行い、自宅のPCから自由なインターネットへ抜ける方法を紹介します。

SSHポートフォワードに関して詳しく知りたい方は、以下の過去記事も参考にしてください。

SSHのポートフォワード(トンネリング)に関してはほかのサイトでもたくさん紹介されています。しかし、Windows で TeraTerm や PuTTY などの GUI を用い...

前提条件(今回詳しく説明をしないもの)

SSHポートフォワードを利用して、インターネットに抜ける方法はいくつかやり方がありますが、今回は一般の人でも比較的にハードルが低いと思われる方法を紹介します。今回詳しく説明しない前提条件は以下です。以下を詳しく聞きたい方がいれば、コメントしてください。随時質問には答えますし、多ければ追加記事を書きます。

  1. 自宅に電源を入れっぱなしのマシン(RDP 接続や VNC 接続可能)がある。
  2. 自宅に電源を入れっぱなしの SSHサーバーがある。(1.のマシンと兼用でもよい)
  3. 自宅のルータにSSHサーバーに対して、ポートフォワード設定がされている。
  4. 自宅のルータに割り振られている WAN側の IPアドレスを把握している。

図で書くと以下のようになります。

補足しておくと、

1:WindowsならPro版でリモートデスクトップが利用できます。自宅のPCがPro版ではないなら、VNCをインストールしましょう。Linux、MACの方はお好きなようにどうぞ(VNCを入れたり、RDPサーバーを持ってきます)。IPアドレスを固定で設定し、リモート接続用のポート番号を覚えておきます(最後で必要です)。例では、IPアドレス:192.168.156.10/ポート:3389 とします。

2:1と同じマシン内設置してもよいです。別マシンや VM でもよいです。IPアドレスを固定で設定し、SSHサーバーのポート番号(デフォルト22)を覚えておきます(4に必要です)。例では、IPアドレス:192.168.156.20/ポート:22 とします。

3:自宅のルータの管理画面にアクセスして「ポートフォワード」「ポート変換」「ポート開放」などの項目を設定してください。設定の仕方は、利用しているルータの説明書を見てください。自宅のSSHサーバーにインターネットから接続できるように設定すればよいです。例では、ルータのWAN側の443ポートに来たアクセスを、192.168.156.20 の 22ポートへ転送する ように設定しています。

HTTP Proxy を経由するので、WAN側のポートは 443ポート(HTTPS)がおすすめです。自宅サーバーで 443を利用しているなどの特殊な理由がない限りは、443を利用しましょう。

参考:
https://www.buffalo.jp/support/faq/detail/15794.html

4:プロバイダと固定IPの契約していない場合、自宅のルータの管理画面にアクセスして「ステータス」「インターネット接続状況」などから、WAN側に割り振られたIPアドレスを確認します。例では、WAN側のIPアドレスは xx.xx.xx.xx とします。

インターネットの切断 ⇔ 再接続により、IPアドレスは変更される場合があり、その場合再度確認が必要です。

社内PC から 自宅PCへ接続

前提条件がそろっていれば、あとは社内のPCから自宅のルータ(SSHサーバー)へ、SSHポートフォワードの接続を行うだけです。Windows PC の場合は、標準のSSHを利用する場合、Proxy を経由するための connect コマンドが Windows のコマンドに無いため、Cygwin を利用するのが楽です。

Cygwinのインストール

社内の PC に Cygwin をインストールします(社内でMACやLinuxを利用している方は不要です。コマンド実行に進んでください)。Cygwinインストール時に connect-proxy をインストールするようにしてください。他は、デフォルトで構いません。

Cygwin のダウンロード:
https://www.cygwin.com/

コマンド実行

Cygwin を起動し、以下のコマンドを実行します(linuxの場合は、coonect-proxyの代わりにconnect コマンドを利用します)。以下では、Windows 標準の リモートデスクトップを利用します。3389 を適宜利用するリモート接続のポートに読み替えてください。

ssh -o ProxyCommand='connect-proxy -H 社内プロキシのIPアドレス:社内プロキシのポート %h %p' sshユーザ名@自宅ルータのWAN側IPアドレス -p 443 -L 13389:自宅のPCのIPアドレス(ローカル):リモート接続用ポート

ちょっとわかりにくいので以下の図の例でコマンドを書くと以下の様になります(社内のプロキシのIPアドレスは、10.75.123.1 , SSH ログインユーザを sshfw としています)。

ssh -o ProxyCommand='connect-proxy -H 10.75.123.1:8080 %h %p' sshfw@xx.xx.xx.xx -p 443 -L 13389:192.168.56.10:3389

これで社内プロキシを経由して、社内PCと自宅PCとの間で SSH ポートフォワード(SSHトンネル) が完成しました。

あとは、社内のPCから自宅のPCへリモートデスクトップ接続を行います。以下の例では、Windows 標準のリモートデスクトップを接続します。

キーボードのwindows+R で mstsc を入力しエンターキーで確定します。

出てきた画面に、127.0.0.1:13389 または、localhost:13389 と入力します。

一連の接続イメージは以下の様になります。

HTTP プロキシを経由可能な理由

ネットワークについて少し知識を持っている人だと、HTTP プロキシ を経由して SSH 接続ができることが不思議に思われる方もおられると思います。

その理由は、HTTP プロキシで SSL(TSL) 通信を行う場合、クライアントからプロキシへの要求には GET メソッドを利用しません。代わりに CONNECT メソッドが利用されます(これは通常の HTTPS 通信と同じです)。

通信を行っている 2 端末以外には通信の内容がわからないようにするのが SSL(TSL)通信の目的であり、これはプロキシを経由した場合も同じです。そのため、SSL(TSL)通信を行う場合、CONNECT メソッドが利用され Webサーバーとクライアントが接続された後は、プロキシは暗号化されたデータをひたすら中継し続けるのみです。

この仕組みを利用するために、ssh のコマンドに -o ProxyCommand=’connect-proxy・・・’ のオプションを設定します。これは、CONNECT メソッドをプロキシに対して発行するためのオプションです。このオプションによりプロキシに対し、CONNECT メソッドで SSH サーバーへの接続を依頼します。

このために connect-proxy をインストールしました。linuxの場合は、connect コマンドが利用可能です。適宜置き換えて実施してください。

ssh の man 抜粋

-o option
Can be used to give options in the format used in the configuration file. This is useful for specifying
options for which there is no separate command-line flag. For full details of the options listed below,
and their possible values, see ssh_config(5).

ssh_config の man 抜粋

ProxyCommand
Specifies the command to use to connect to the server. The command string extends to the end of the
line, and is executed using the user's shell ‘exec’ directive to avoid a lingering shell process.

Arguments to ProxyCommand accept the tokens described in the TOKENS section. The command can be basi‐
cally anything, and should read from its standard input and write to its standard output. It should
eventually connect an sshd(8) server running on some machine, or execute sshd -i somewhere. Host key
management will be done using the HostName of the host being connected (defaulting to the name typed by
the user). Setting the command to none disables this option entirely. Note that CheckHostIP is not
available for connects with a proxy command.

This directive is useful in conjunction with nc(1) and its proxy support. For example, the following
directive would connect via an HTTP proxy at 192.0.2.0:

ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p

会社にバレないの?

前述の通り暗号化されたデータであるため、プロキシを監視してもどのような通信を行っているかは分かりません。すぐわかるのは「接続元IPアドレス」、「接続元ポート」、「接続先IPアドレス」、「接続先ポート」です。少し頑張って「接続の継続した時間」、「送受信データ量」がわかります。このような情報から判断できるのは、「外部の(同じ)IPアドレスに対してデータを送受信している社内PCがある」ということだけです。

データ量が小さければ(一日数件のWebサイト閲覧なら)、HTTPS通信で何かをダウンロードした程度にしか見えないので、まずバレません

しかし、ネットワーク管理者や導入されているツールにもよりますが、「頻繁」に「長時間」接続続けていると、怪しまれ調査対象になる可能性はあります。当然ですが、あくまで私的利用ではなく業務利用に必要な最小限の範囲にとどめて作業しましょう。

何かあっても当サイトは責任は取りませんので、自己責任でお願いします。