ウェブサイトによっては接続元 IP アドレスの国情報に基づいてコンテンツの出し分けを行っている場合があります。そのようなサイトに日本からアクセスする方法として VPN サービスを利用するという方法が知られているようですが、率直なところ、信頼してよいかどうかわからない回線にデータを流すのはリスクが高すぎると感じます。
このため、AWS の海外リージョンで HTTP proxy を建ててみることにしました。
接続方法
HTTP proxy を建てる場合の接続方法には、次の 3 種類が挙げられると思います。
1.は HTTP 通信は平文のままで送受信されます。HTTPS 通信エンドツーエンドで暗号化されたままで扱われるので、プロキシを経由しない通信と同等の安全性です。ただしプロキシサーバーのポートがインターネット側に開いているのは第三者による悪用のリスクがあるので、できれば接続元 IP アドレス制限はかけるべきだし、IP アドレス制限を行わない場合は HTTP 認証をつけるべきです。
は、VPN を導入する時点で構築しなければならない要素が増えており、しかも VPN トンネルを張れるなら HTTP proxy を使う必要性が減るので一旦除外します。
は Proxy サーバのポートをインターネット向けに開く必要がないので第三者に利用されてしまうリスクが大幅に減ります。ただしスマートフォンやタブレットからは利用できないという制限を伴います。
このように提供形態によって制約がありますが、今回は SSH ポートフォワーディングを用いることにします。
■ Squid のインストールと設定
EC2 インスタンスまたは Lightsail でインスタンスを作ります。費用的には Lightsail のほうがコストがかからないのではないでしょうか。
インスタンスには次のように接続します。これは SSH 接続元 機材の 3128/TCP に対するリクエストを、SSH 接続先の localhost:3128 に転送する設定を含んでいます。
ssh -L 3128:localhost:3128 ec2-user@IPアドレス
インスタンスには squid と nc (netcat) をインストールします。netcat は Proxy サーバが Web サイトにアクセスする際に用いるリクエストヘッダを簡易的に検証する際に使用します。
sudo yum install squid nc
squid の設定ファイルには、少なくとも次の設定を入れます。
# ログをリアルタイム出力させる(処理数の多いサーバーでは非推奨) buffered_logs off # X-Forwarded-For を付けない(接続先 Web サーバに対して HTTP Proxy 経由のアクセスの痕跡を見せない) forwarded_for delete # Via ヘッダを付けない(接続先 Web サーバに対して HTTP Proxy 経由のアクセスの痕跡を見せない) request_header_access Via deny all
設定完了したら squid を起動します。
sudo systemctl start squid.service
squid のステータスは次のように取得できます。
sudo systemctl status squid.service ● squid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled) Active: active (running) since 日 2021-09-05 07:24:38 UTC; 54s ago Process: 4834 ExecStart=/usr/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS) Process: 4829 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS) Main PID: 4837 (squid) CGroup: /system.slice/squid.service ├─4837 /usr/sbin/squid -f /etc/squid/squid.conf ├─4839 (squid-1) -f /etc/squid/squid.conf └─4840 (logfile-daemon) /var/log/squid/access.log 9月 05 07:24:38 ip-172-26-7-17.us-west-2.compute.internal systemd[1]: Starting Squid caching proxy... 9月 05 07:24:38 ip-172-26-7-17.us-west-2.compute.internal systemd[1]: Started Squid caching proxy. 9月 05 07:24:38 ip-172-26-7-17.us-west-2.compute.internal squid[4837]: Squid Parent: will start 1 kids 9月 05 07:24:38 ip-172-26-7-17.us-west-2.compute.internal squid[4837]: Squid Parent: (squid-1) process 4839 started $
■動作確認
インスタンス側で netcat を次のように実行します。
sudo nc -l 80
この状態でブラウザから http://インスタンスのIPアドレス/ にアクセスしてみます。そうすると次のリクエストヘッダがブラウザから送出されていることがわかります。
$ sudo nc -l 80 GET / HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate DNT: 1 Upgrade-Insecure-Requests: 1 Host: インスタンスのIPアドレス Cache-Control: max-age=259200 Connection: keep-alive
squid.conf では X-Forwarded-For や Via を削除するように設定しているので HTTP プロキシを経由しているような通信には見えづらいと思います。Cache-Control を消す、消さないということについてはさまざまな判断があると思いますが、今回の設定ではこの削除までは行っていません。