Ubuntu
squid

Ubuntuでsquidを使って個人プロキシサーバーを作る

様々なネットワークからリクエストを送る時に、相手先には常に一位のホストからリクエストが来ているように見せたいので個人プロキシを構築する。無料プロキシに比べて高速かつ信頼できカスタマイズ性があります。設定するホストはVPSでも自宅サーバーでもなんでもよいです。

構築方法

インストール

sudo apt install squid

今回設定するバージョン

$ squid -v
Squid Cache: Version 3.5.12
Service Name: squid
Ubuntu linux

squidの設定ファイルを編集する

sudo vi /etc/squid/squid.conf

コメントが膨大なのでコメントを消す

:%s/^#.*$//g
:g/^$/d

結果的に下記のような設定になった。

squid.conf
# SSL接続時に443ポート以外のCONNECTを拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

# 匿名化
forwarded_for off
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
# request_header_access Referer deny all

# 接続先ポートのホワイトリスト (とりあえず最低限)
acl Safe_ports port 80  # http
acl Safe_ports port 443 # https
http_access deny !Safe_ports

# 許可するIP
acl office src 69.69.69.69
acl home src 46.49.46.49
http_access allow localhost
http_access allow office
http_access allow home

# 上記のルールに一致しない場合は拒否
http_access deny all

# squidのポート
http_port 3128

# core出力場所
coredump_dir /var/spool/squid

# キャッシュ設定を無効
no_cache deny all

構文チェック

起動時に中身に問題があっても何も言われないのでわからない。まずは構文チェック。問題があれば丁寧に教えてくれます。

sudo squid -k parse

squidの起動

squidを起動する

sudo systemctl start squid

内部から疎通確認 (正しく起動したか確認するため)

curl -sS localhost:3128

外部から疎通確認 (ufwで遮断されていないか確認するため)

curl -sS proxy-host:3128

PHPでプロキシを経由してコンテンツへアクセスする適当なコードを実行して確認する。この場合はhoge.phpとかいう名前で下記のファイルを保存してphp hoge.phpとかすれば良い。中のproxy-hostは自分のプロキシのIPアドレスとかにすると良い。

<?php
$targetUrl = "http://yahoo.co.jp";
$contents = file_get_contents($targetUrl, false, stream_context_create([
  "http" => [
    "method" => "GET",
    "proxy" => "tcp://proxy-host:3128",
    "request_fulluri" => true
  ]
]));

参考