ConoHaのVPSでプロキシサーバー

2021年5月24日

前回までにdockerを動かせるまでになりました。

今回はdockerで試しにプロキシサーバーを立ててみようと思います。

プロキシサーバーとは

プロキシサーバーとは、「クライアントとサーバの間に存在し、情報元のサーバに対してはクライアントの情報を受け取る、クライアントに対してはサーバの働きをする」ものです。

昨今での主な使われ方は、リバースプロキシを除けば、会社などで使用されるフィルタリング目的などが多いかと思います。社内のイントラネットからインターネットへのアクセスはプロキシサーバーを経由したものだけにしておき、プロキシサーバーで有害なサイトを弾くためのサーバーです。

なぜプロキシなのか?

個人的によくスクレイピングをしたりするのですが、調子に乗ってたくさん集めすぎると、攻撃と判断されて、サーバーによってはIPでBANされることがあります。

こんな感じに…

自宅IPでBANされても、プロキシサーバーを中継すれば回避することができる場合があるからです。もっともVPSのIPは容易に判断できるのか、プロキシを中継しても、

こんな画面になるだけのことが多いですけどね。でもhCaptchaを突破すればちゃんと見れるようになるので、「スクレイピングはもういいや、純粋にサイトを見たい!」場合の回避手段として使えることがある、ということです。

プロキシサーバーの選定

老舗はDeleGateSquidだと思ってたのですが、ちゃんと開発が続いてるSquidを今回は選びます。

Squidのdockerイメージの選定

自分で作ってもいいのですが、せっかくならメンテナンスとか期待できるかもしれない、docker-hubのイメージを使いたいわけです。できればofficialがいいのですが、存在せず。。。Googleで「dockerhub squid」検索1位のイメージでも更新が2年前となかなかの低迷っぷりです。

そこでメンテがなくともイメージ容量とかこだわってるやつなら比較的新しいのでは?とGoogleで「dockerhub squid alpine」検索してみました。1位はarmとx86の両方を出しててやる気ありそうだったのですが、どうせメインはarmなんでしょ?と2位を選択。栄えある2位は…

https://hub.docker.com/r/haraldb/alpine-squid

コレになります。ちなみに更新は1年前。。。

Squidの設定

書いたdocker-composeは、

version: "3"

services:
  squid:
    image: haraldb/alpine-squid
    volumes:
      - ./srv/docker/squid/cache:/var/spool/squid
      - ./squid.conf:/etc/squid/squid.conf
    ports:
      - "3128:3128"
    restart: always

こんな感じになります。はい、先のページのConfigurationセクションをdocker-compose.ymlにしただけです。
(volumeはdocker volumeではなくて、ホストのファイルシステムをmountする形にしました)

ここで使用されているsquid.confは以下のようになります。

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

# ここ追加
acl homenet src (自宅IP)

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
# ここ追加
http_access allow homenet

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/cache/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/cache/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

# ここ追加
max_filedesc 1024

「#ここ追加」と書かれた直後の行が元のファイルに追加した部分です。最初の行と2個目の行で、

...
acl homenet src (自宅IP)
...
http_access allow homenet
...

自宅IPからのアクセスを許可しています(デフォルトはローカルからしか許可していません)。

3個目の行は、

max_filedesc 1024

同時に開けるファイル(ソケット)の数で、デフォルトより2桁くらい少なくしています。これがないと、squidプロセスのメモリ消費が160MBくらいになります。入れておけば16MBくらいで動きます。

コンテナ起動方法

$ docker-compose up -d

です。-dを外せばデーモン起動しません。

コンテナ停止方法

$ docker-compose down

です。

元のsquid.confの取り出し方

squidのdockerコンテナを停止させてる状態で、docker-compose.ymlから

      - ./squid.conf:/etc/squid/squid.conf

この行を外して、マウントしないようにしてから、コンテナを起動し、/etc/squid/squid.confをcatさせればOKです。

$ docker-compose up -d
$ docker-compose exec squid cat /etc/squid/squid.conf >squid.conf
$ docker-compose down

後はdocker-compose.ymlを元に戻すだけ。

ブラウザからプロキシを経由して見る

ConoHaの設定

今回の設定ではポート3128を使っているので、VPSのネットワーク設定で、接続許可ポートを「全て許可」にする必要があります。

ConoHaが守ってくれない設定なので、前提として、以前の記事

のfirewallの設定が出来ている必要があります(自宅IP以外からはhttpsしかアクセスできない)。当然ですが、今回のプロキシサーバーは自宅以外からは使えません(squid.confの設定上も)。

ブラウザの設定

お使いのブラウザのプロキシ設定からプロキシサーバーのアドレスを指定する部分にVPSのドメインを記述、ポートには3128を記述します。OSの設定になる場合もあるので、お使いのブラウザのマニュアルやヘルプなどをご確認ください。

常用する場合はURLによって切り替えたいと思うので、ブラウザの拡張機能などを使ってプロキシのON/OFFを自動制御した方が無難です。

確認

ブラウザの開発者ツールなどを使用し、ネットワークのモニタリングをし、プロキシサーバーを使ってアクセスしたページの取得時に、リクエストヘッダで

Remote Address: (VPSのIPアドレス):3128

などとなっていれば成功です。

まとめ

今回はVPSのdockerでプロキシサーバーを動かしてみました。

次回はいよいよhttps用の証明書取得に取り組みます。