pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


AWS の海外リージョンに HTTP proxy を建てる (SSH ポートフォワーディング 利用)

ウェブサイトによっては接続元 IP アドレスの国情報に基づいてコンテンツの出し分けを行っている場合があります。そのようなサイトに日本からアクセスする方法として VPN サービスを利用するという方法が知られているようですが、率直なところ、信頼してよいかどうかわからない回線にデータを流すのはリスクが高すぎると感じます。

このため、AWS の海外リージョンで HTTP proxy を建ててみることにしました。

接続方法

HTTP proxy を建てる場合の接続方法には、次の 3 種類が挙げられると思います。

  1. HTTP proxy に対して HTTP 接続する
  2. HTTP proxy に対して VPN トンネルで接続する
  3. HTTP proxy に対して SSH ポートフォワーディングで接続する

1.は HTTP 通信は平文のままで送受信されます。HTTPS 通信エンドツーエンドで暗号化されたままで扱われるので、プロキシを経由しない通信と同等の安全性です。ただしプロキシサーバーのポートがインターネット側に開いているのは第三者による悪用のリスクがあるので、できれば接続元 IP アドレス制限はかけるべきだし、IP アドレス制限を行わない場合は HTTP 認証をつけるべきです。

  1. は、VPN を導入する時点で構築しなければならない要素が増えており、しかも VPN トンネルを張れるなら HTTP proxy を使う必要性が減るので一旦除外します。

  2. は 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 を消す、消さないということについてはさまざまな判断があると思いますが、今回の設定ではこの削除までは行っていません。