VPNを使用せずにSOCKSトンネルを使ってウェブトラフィックを安全にルーティングする方法
著者は、Write for DOnationsプログラムの一環として寄付を受けるために、COVID-19救済基金を選択しました。
紹介
ある時点で、あなたは安全でないネットワークや過度に制限されたファイアウォールの上にいることに気づくかもしれません。そして、あなたのトラフィックを誰も見ていないことを確認したいと思うでしょう。一つの解決策は、Ubuntu 22.04/20.04/18.04にVPNを設定することですが、多くのVPNはあなたの機械に特別なクライアントソフトウェアを必要とし、インストールする権利がない場合があります。しかし、もしあなたが保護する必要があるのがウェブブラウジングだけであれば、迅速で無料で便利な代替手段があります。それはSOCKS 5プロキシトンネルです。
SOCKSプロキシはSSH暗号化トンネルで、設定されたアプリケーションがそのトラフィックを送信し、サーバー側でプロキシがそのトラフィックを一般のインターネットに転送します。VPNとは異なり、SOCKSプロキシはクライアントマシンでアプリごとに設定する必要がありますが、アプリがSOCKSプロキシを使用できる限り、特別なクライアントソフトウェアなしでアプリを設定できます。サーバー側では、SSHを設定するだけで済みます。
このチュートリアルでは、Ubuntu 22.04を実行しているサーバー(SSHを介してアクセスできる任意のLinuxディストリビューションでも動作します)と、クライアントアプリケーションとしてFirefoxウェブブラウザを使用します。このチュートリアルの終わりには、暗号化されたSSHトンネルを通じて安全にウェブサイトを閲覧できるようになります。
前提条件
Ubuntuのバージョン16.04以下を使用している場合は、これらのバージョンのサポートが終了したため、最新のバージョンにアップグレードすることをお勧めします。このガイドのコレクションは、Ubuntuのバージョンアップに役立ちます。
- SSHアクセスと
sudoユーザーを持つUbuntuを実行しているLinuxサーバー(他のディストリビューションも動作します)。これらの設定方法についての案内を希望する場合は、このリストからご自身のディストリビューションを選択し、私たちの初期サーバーセットアップガイドに従ってください。
ここに行って、DigitalOcean Droplet上にトンネルを構築してください。
FirefoxウェブブラウザのようなSOCKSプロキシを設定するためのアプリケーションです。
Windowsユーザーの場合、PuTTYツールまたはWindows Subsystem for Linux(WSL)が必要です。
PuTTYはWindowsユーザーのためにプロキシトンネルを設定するのに使用されます。macOSやLinuxのユーザーは、トンネルを設定するためのツールが事前にインストールされています。
VPNを使用せずにSOCKSトンネルを使ってウェブトラフィックを安全にルーティングする手順
- トンネルを設定する - MacOS/Linux または Windows
- トンネルを使用するようにFirefoxを設定する
- Firefoxでプロキシを元に戻す
- 繰り返し使用するためのショートカットを作成する(MacOS/Linux)
ステップ 1 (macOS/Linux) — トンネルの設定
ローカルコンピュータでSSHキーを作成します。すでにDropletを作成する際にキーを作成していない場合は、ここで作成します。キーが作成されたら、公開側がSSH Dropletの「authorized_keys」ファイルに追加されていることを確認してください。その後、ターミナルアプリケーションを開いて、SOCKSプロキシが有効なSSHトンネルを作成します。
このコマンドでトンネルを設定してください:
- ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
引数の説明
接続するホストに使用するSSHキーへのパス
-D: SSHに指定したポート番号でSOCKSトンネルを作成したいことを伝えます(
1025から65536の間の任意の番号を選べます)-
-f: プロセスをバックグラウンドにフォークします -C: 送信する前にデータを圧縮します-q: サイレントモードを使用します-N: SSHにトンネルが確立した後、コマンドは送信されないことを伝えます
sammy@your_domainをあなたのsudoユーザー名とサーバーのIPアドレス/ドメイン名に置き換えてください。
コマンドを入力すると、成功も失敗も示されることなく再びコマンドプロンプトに戻ります。それは正常です。
このコマンドでトンネルが実行中であることを確認してください:
- ps aux | grep ssh
出力にこのような行が表示されます:
sammy 14345 0.0 0.0 2462228 452 ?? Ss 6:43AM 0:00.00 ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
ターミナルアプリケーションを終了しても、トンネルは維持されます。それは、SSHセッションをバックグラウンドに置くために、-f引数を使用したからです:
注: トンネルを終了するには、psを使ってPIDを取得する必要があります。私たちの例では、PIDは14345です。次に、kill 14345というコマンドを使用します。終了処理はステップ3で説明します。
ステップ1(Windows) — トンネルの設定
PuTTYを開きます。
まだインストールしていない場合は、PuTTYをダウンロードして好きな場所に保存してください。PuTTYはインストールに管理者権限を必要としません;ただ.exeをダウンロードして実行するだけです。
トンネルを設定するために以下の手順を完了してください:
セッションセクションから、サーバーのホスト名(またはIPアドレス)とSSHポート(通常22)を追加してください。
左側で、次のように移動します: 接続 > SSH > トンネル
任意のソースポート番号を
1025から65536の間で入力してください。例えば、1337のように。動的ラジオボタンを選択してください
追加ボタンをクリックしてください
左のセッションに戻る
保存されたセッションの下に名前を追加し、保存ボタンをクリックしてください。
今、接続するためにオープンボタンをクリックしてください。
ログインするには、
sudoユーザー名とサーバーパスワードを入力してください
今、PuTTYウィンドウを最小化できますが、閉じないでください。SSH接続は開いたままにしておく必要があります:
注意: このセッションのために、sudo ユーザー名 (sammy) と SSH キーを PuTTY SSH キーの手順に従って保存できます。これにより、接続を開くたびにユーザー名とパスワードを入力する必要がなくなります。
ステップ2 — トンネルを使用するためのFirefoxの設定
SSHトンネルが作成されたので、次はFirefoxをそのトンネルを使うように設定する時です。SOCKS 5トンネルが機能するためには、トンネルを実装できるローカルアプリケーションを使用する必要があることを忘れないでください。Firefoxにはこの機能があります。
このステップはWindows、macOS、およびLinuxで同じです。
SSH コマンドで使用したポート番号を必ず確認してください。私たちの例では 1337 を使用しました。
(以下の手順はFirefoxバージョン80で実行されましたが、他のバージョンでも機能するはずですが、オプションの場所が異なる場合があります。)
Firefoxを開いてください。
右上隅のハンバーガーアイコンをクリックして、Firefoxのメニューにアクセスします。
設定またはオプションメニュー項目をクリックしてください。
ページの下までスクロールし、ネットワーク設定の下にある設定...ボタンを選択します。
「インターネットへのプロキシアクセスを構成する」見出しの下で、手動プロキシ設定を選択してください。
SOCKSホストには
localhostまたは127.0.0.1を入力し、ポートにはトンネルで指定されたカスタムポート1337を使用してください。下の方で、「SOCKS v5 使用時にプロキシ DNS を使用する」にチェックを入れてください。
設定を保存して閉じるには、OKボタンをクリックしてください。
さあ、Firefoxで別のタブを開いてウェブを閲覧し始めましょう。SSHトンネルを通じて安全にブラウジングする準備は整いました。ウェブサイトから戻ってくるデータは暗号化されています。さらに、プロキシDNSオプションを選択したため、DNSルックアップも暗号化されているので、あなたのISPはあなたが見ているものやどこに行ったのかを見ることができません。
プロキシを使用していることを確認するには、Firefoxのネットワーク設定に戻り、異なるポート番号を入力して設定を保存します。これでウェブをブラウジングしようとすると、「プロキシサーバーが接続を拒否しています」というエラーメッセージが表示されるはずです。これは、Firefoxがプロキシを使用していて、デフォルトの接続ではないことを証明します。もしくは、ipecho.netのようなパブリックIPサイトにアクセスすると、返されるIPはあなたのSSH DropletのIPになるはずです。なぜなら、今それがあなたのプロキシとして機能しているからです。
ステップ3 — Firefoxでプロキシを元に戻す
SSHトンネルのプライバシーが不要になったら、Firefoxのネットワークプロキシ設定に戻ります。『システムプロキシ設定を使用する』のラジオボタンをクリックし、OKをクリックします。これでFirefoxがSOCKSトンネルを使用していないので、それも終了できます。トンネルを開いたままにしておけば、Firefoxでプロキシのオン/オフを自由に切り替えることができますが、トンネルを長時間アイドル状態にしておくと、自動的に閉じてしまうことがあります。
トンネルを閉じる (macOS/Linux)
私たちがローカルマシンで作成したトンネルはバックグラウンドに送られたため、トンネルを開くために使用したターミナルウィンドウを閉じても、それは終了しません。トンネルを終了させるためには、ps コマンドを使用してプロセスID(PID)を特定し、その後 kill コマンドを使用してプロセスを終了させる必要があります。
私たちのマシン上で全てのアクティブな ssh プロセスを探しましょう:
- ps aux |grep ssh
以前にトンネルを作成するために入力したコマンドのような行を見つけてください。こちらがサンプル出力です:
sammy 14345 0.0 0.0 2462228 452 ?? Ss 6:43AM 0:00.00 ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
行の最初の方に、最初の2つの列のいずれかに、3〜5桁の数字があります。これがPIDです。サンプルPIDの14345がここに強調表示されています。
PIDが何であるかを理解したので、killコマンドを使用してトンネルを停止できます。プロセスを終了させるときは、自分のPIDを使用してください:
- kill 14345
トンネルを閉じる (Windows)
トンネルを作成するために使用したPuTTYウィンドウを閉じてください。それでおしまいです。
ステップ4(macOS/Linux) — 繰り返し使用するためのショートカットを作成する
macOSまたはLinuxシステムの場合、エイリアスを作成するか、スクリプトを作成してトンネルを迅速に作成できます。以下はトンネルプロセスを自動化する2つの方法です。
これらのショートカット方法は、どちらもサーバーへのパスワードなし/パスフレーズなしのSSHキー認証を必要とします。
クリック可能なBASHスクリプト
トンネルを開始するためにクリックするとアイコンが出るようにしたい場合は、その作業を行う小さなBASHスクリプトを作成できます。このスクリプトはトンネルを設定し、その後にFirefoxを起動しますが、最初にFirefoxでプロキシ設定を手動で追加する必要があります。
macOSでは、コマンドラインから起動できるFirefoxのバイナリはFirefox.appの中にあります。アプリがApplicationsフォルダにあると仮定すると、バイナリは/Applications/Firefox.app/Contents/MacOS/firefoxに見つかります。
Linuxシステムでは、リポジトリを通じてFirefoxをインストールした場合、またはプリインストールされている場合、その場所は/usr/bin/firefoxであるはずです。標準の場所にない場合は、which firefoxというコマンドを使用して、システム上のFirefoxの位置を確認することができます。
このスクリプトでは、Firefoxのパスをあなたのシステムに適したものに置き換えてください。また、トンネルを立ち上げるために以前使用した成功したコマンドを反映させるために、SSHの行を調整する必要があるかもしれません。
nanoのようなテキストエディタを使用して、新しいファイルを作成します:
- nano ~/socks.sh
次の行を追加してください:
#!/bin/bash -e
ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@`your_domain`
/Applications/Firefox.app/Contents/MacOS/firefox &
1337を希望するポート番号に置き換えてください(Firefoxに入力したものと一致する必要があります)サミー@your_domainをあなたのSSHユーザー@あなたのホスト名またはIPに置き換えてくださいシステムに合わせて
/Applications/Firefox.app/Contents/MacOS/firefoxをFirefoxのバイナリへのパスに置き換えてください。
スクリプトを保存します。nanoの場合は、CONTROL + o と入力し、終了するには CONTROL + x と入力します。
スクリプトを実行可能にしてください。ダブルクリックすると実行されるようになります。コマンドラインから、chmod コマンドを使用して実行権限を追加します:
- chmod +x /path/to/socks.sh
macOSでは、.shファイルをプログラムのように実行すべきであり、エディタで開くべきではないことをmacOSに伝えるために、追加の手順が必要になることがあります。これを行うには、socks.shファイルを右クリックし、「情報を見る」を選択します。
「Open with:」のセクションを見つけ、開示三角形が下を向いていない場合は、それをクリックしてドロップダウンメニューを表示します。Xcodeがデフォルトアプリとして設定されている可能性があります。
Terminal.appに変更します。もしTerminal.appがリストにない場合は、「その他」を選択し、次に「アプリケーション」>「ユーティリティ」>「Terminal.app」を選択します(ドロップダウンメニューの「有効」を「推奨アプリケーション」から「すべてのアプリケーション」に設定する必要があるかもしれません)。
今すぐSOCKSプロキシを開くには、socks.shファイルをダブルクリックしてください。このスクリプトはターミナルウィンドウを開き、SSH接続を開始し、Firefoxを起動します。この時点でターミナルウィンドウを閉じても構いません。Firefoxのプロキシ設定を保持していれば、安全な接続を介してブラウジングを開始できます。
このスクリプトを使うことでプロキシを素早く立ち上げることができるが、作業が完了したときにsshプロセスを見つけてそれを終了させるために、上記の手動ステップを実行する必要がある。
コマンドラインエイリアス
コマンドラインを頻繁に使う場合は、トンネルを起動するためのコマンドラインエイリアスを作成できます。
エイリアスを作成する最も難しい部分は、エイリアスコマンドをどこに保存するかを決めることです。
異なるLinuxディストリビューションやmacOSリリースは、エイリアスを異なる場所に保存します。最善の方法は、以下のファイルのいずれかを探し、aliasを検索して、他のエイリアスが現在どこに保存されているかを確認することです。可能性としては次のものがあります:
~/.bashrc
~/.zshrc
~/.bash_aliases
~/.bash_profile
~/.profile
正しいファイルを見つけたら、既存のものの下やファイルの最後に、以下のエイリアスを追加してください。以下の例では、エイリアス「firesox」を使用してSOCKSトンネルを開くために使っていますが、使用するエイリアスは任意の言葉にすることができます:
alias firesox='ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain && /Applications/Firefox.app/Contents/MacOS/firefox &'
1337を希望するポート番号に置き換えてください(Firefoxに入力したものと一致する必要があります)sammy@your_domainをSSHユーザー@ホスト名またはIPに置き換えてくださいFirefoxのバイナリへのパスで
/Applications/Firefox.app/Contents/MacOS/firefoxを置き換えてください。
あなたのエイリアスは新しいシェルを起動したときにのみ読み込まれるので、ターミナルセッションを閉じて新しいものを開始してください。今、あなたがタイプするとき:
- firesox
このエイリアスはトンネルを設定し、その後Firefoxを起動してコマンドプロンプトに戻ります。Firefoxがプロキシを使用するように設定されていることを確認してください。これで安全にブラウジングできます。
ステップ5(オプション) — トラブルシューティング:ファイアウォールを通過する
接続が正常に動作している場合は、もう読む必要はありません。しかし、もし制限のあるファイアウォールのためにSSH接続ができないことに気づいた場合、トンネルを作成するために必要なポート22がブロックされている可能性が高いです。プロキシサーバーのSSH設定を制御できる場合(DigitalOcean Dropletにルートアクセスがあれば、これを行うことができます)、SSHをポート22以外でリッスンするように設定することができます。
どのポートがブロックされていないか使えますか?
一般的に開いているポートには、80(一般的なウェブトラフィック)や443(TLS、セキュアウェブトラフィック)があります。
SSHサーバーがウェブコンテンツを提供していない場合、SSHにデフォルトのポート22ではなく、これらのウェブポートのいずれかを使用して通信するように指示できます。443は、このポートで暗号化されたトラフィックが存在することが期待されるため、最良の選択です。そして、私たちのSSHトラフィックも暗号化されます。
ファイアウォールのない場所から、プロキシ用に使用しているDigitalOcean DropletにSSHで接続するか、Digital Oceanのコントロールパネルから内蔵コンソールを使用します。
サーバーのSSH設定を編集する:
- sudo nano /etc/ssh/sshd_config
「ポート22」という行を探してください。
‘22’ を完全に置き換えるか、SSH がリッスンするための第 2 のポートを追加できます。複数のポートで SSH がリッスンするように設定することにしますので、Port 22 の下に Port 443 と記載された新しい行を追加します。以下はその例です:
. . .
Port 22
Port 443
. . .
SSHを再起動して、編集したばかりのSSH設定を再読み込みします。使用しているディストリビューションによっては、SSHサーバーデーモンの名前が異なる場合がありますが、おそらくsshまたはsshdです。どちらかが機能しない場合は、もう一方を試してください。
- sudo service ssh restart
新しいSSHポートが機能するか確認するために、新しいシェルを開いてください(万が一自分をロックアウトしてしまった場合に備えて、現在のシェルはまだ閉じないでください)そして、新しいポートを使用してSSH接続します:
- ssh sammy@your_domain -p 443
成功した場合は、両方のシェルからログアウトし、新しいポートを使用してSSHトンネルを開くことができます:
- ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain -p 443
Firefoxの設定は、SSHポートに依存せず、トンネルポート(上記の1337)のみを考慮するため、同じです。
結論
現代において、カフェの公衆Wi-Fiのような潜在的に危険なネットワークに接続している時に、安全にブラウジングする方法は多数あります。ほとんどの場合、トラフィック全体を安全に保護するためにVPNを使用できるなら、VPNの使用が推奨されます。しかし、VPNを使用できない場合や信頼できない場合には、SOCKSトンネルを利用することで、ウェブブラウジング中の必要なセキュリティを提供することができます。SOCKSトンネルは、瞬時に設定して使用することができ、完全に制御できます。安全なブラウジングのための優れた選択肢です。



