2025-03-07

二つの困ったを回避するために Squid を活用してみた

Squid は Proxy サーバーのことですが、コイツを使ってみました。

困っていた内容 

一つは Firefox がせっかく溜め込んだキャッシュをドカッと消してしまう不具合です。まだバグ修正されないので何かしらの回避策が必要な状況です。

もう一つは何かで気づいたのですが、「艦これ」の起動中に analytics.tiktok.com へアクセスしているのをブロックしたいのです。

一つ目の不具合は Firefox の about:config で「privacy.bounceTrackingProtection.hasMigratedUserActivationData = false」 「privacy.bounceTrackingProtection.mode = 3」を指定すれば回避できるのですが、Firefox を起動し直すたびにリセットされてしまうので、毎回に手動で再設定しています。

二つ目も回避策として /etc/hosts に 127.0.0.1 とか定義してあげるとブロックできるのですが、ブロックしたいホスト名をフルで定義しないといけないのでちょっと面倒です。

おや? こんな時は Squid のキャッシュ機能とアクセス制御機能を使えば両方を回避できるのでは?


試してみた

まずは Squid のインストールからです。Debian 12 ベースの LMDE 6 ですが、Squid のパッケージは「squid」と「squid-openssl」の 2 種類が存在しており、前者は GnuTLS でのパッケージング、後者は OpenSSL でのパッケージングとなっているようです。

どっちがいいのか判断がつきませんでしたが、なんとなく OpenSSL バージョンを選択してみました。

Squid には 2 種類のパッケージがある

apt でインストールすると、すぐさま Squid が常駐し始めます。

$ systemctl status squid
● squid.service - Squid Web Proxy Server
     Loaded: loaded (/lib/systemd/system/squid.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-03-06 15:03:14 JST; 6h ago
       Docs: man:squid(8)
    Process: 1310 ExecStartPre=/usr/sbin/squid --foreground -z (code=exited, status=0/SUCCESS)
   Main PID: 1358 (squid)
      Tasks: 4 (limit: 28504)
     Memory: 51.9M
        CPU: 25.346s
     CGroup: /system.slice/squid.service
             ├─1358 /usr/sbin/squid --foreground -sYC
             ├─1367 "(squid-1)" --kid squid-1 --foreground -sYC
             ├─1371 "(logfile-daemon)" /var/log/squid/access.log
             └─1372 "(pinger)"

 3月 06 17:07:25 squid[1367]: NETDB state saved; 297 entries, 0 msec
 3月 06 18:09:18 squid[1367]: Logfile: opening log stdio:/var/spool/squid/netdb.state
 3月 06 18:09:18 squid[1367]: Logfile: closing log stdio:/var/spool/squid/netdb.state
 3月 06 18:09:18 squid[1367]: NETDB state saved; 357 entries, 0 msec
 3月 06 19:29:01 squid[1367]: Logfile: opening log stdio:/var/spool/squid/netdb.state
 3月 06 19:29:01 squid[1367]: Logfile: closing log stdio:/var/spool/squid/netdb.state
 3月 06 19:29:01 squid[1367]: NETDB state saved; 363 entries, 0 msec
 3月 06 20:47:44 squid[1367]: Logfile: opening log stdio:/var/spool/squid/netdb.state
 3月 06 20:47:44 squid[1367]: Logfile: closing log stdio:/var/spool/squid/netdb.state
 3月 06 20:47:44 squid[1367]: NETDB state saved; 389 entries, 0 msec

この状態で Firefox なりの Proxy 設定を変更してあげれば、すべてデフォルト値ですが Squid 経由でインターネットにアクセスするようになります。

すでにカスタマイズ済みの状態の結果ですが、「$ squid -k parse」というコマンドで現在に反映されている各種設定を確認することができて便利です。

デフォルトの状態ではキャッシュはメモリー上に 256MB だけ保管するような設定になっており、ディスクキャッシュは無効になっています。

$ squid -k parse
2025/03/06 21:54:02| Startup: Initializing Authentication Schemes ...
2025/03/06 21:54:02| Startup: Initialized Authentication Scheme 'basic'
2025/03/06 21:54:02| Startup: Initialized Authentication Scheme 'digest'
2025/03/06 21:54:02| Startup: Initialized Authentication Scheme 'negotiate'
2025/03/06 21:54:02| Startup: Initialized Authentication Scheme 'ntlm'
2025/03/06 21:54:02| Startup: Initialized Authentication.
2025/03/06 21:54:02| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2025/03/06 21:54:02| Processing: acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
2025/03/06 21:54:02| Processing: acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
2025/03/06 21:54:02| Processing: acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
2025/03/06 21:54:02| Processing: acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
2025/03/06 21:54:02| Processing: acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
2025/03/06 21:54:02| Processing: acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
2025/03/06 21:54:02| Processing: acl localnet src fc00::/7       	# RFC 4193 local private network range
2025/03/06 21:54:02| Processing: acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
2025/03/06 21:54:02| Processing: acl SSL_ports port 443
2025/03/06 21:54:02| Processing: acl Safe_ports port 80		# http
2025/03/06 21:54:02| Processing: acl Safe_ports port 21		# ftp
2025/03/06 21:54:02| Processing: acl Safe_ports port 443		# https
2025/03/06 21:54:02| Processing: acl Safe_ports port 70		# gopher
2025/03/06 21:54:02| Processing: acl Safe_ports port 210		# wais
2025/03/06 21:54:02| Processing: acl Safe_ports port 1025-65535	# unregistered ports
2025/03/06 21:54:02| Processing: acl Safe_ports port 280		# http-mgmt
2025/03/06 21:54:02| Processing: acl Safe_ports port 488		# gss-http
2025/03/06 21:54:02| Processing: acl Safe_ports port 591		# filemaker
2025/03/06 21:54:02| Processing: acl Safe_ports port 777		# multiling http
2025/03/06 21:54:02| Processing: http_access deny !Safe_ports
2025/03/06 21:54:02| Processing: http_access deny CONNECT !SSL_ports
2025/03/06 21:54:02| Processing: http_access allow localhost manager
2025/03/06 21:54:02| Processing: http_access deny manager
2025/03/06 21:54:02| Processing: include /etc/squid/conf.d/*.conf
2025/03/06 21:54:02| Processing Configuration File: /etc/squid/conf.d/debian.conf (depth 1)
2025/03/06 21:54:02| Processing: logfile_rotate 0
2025/03/06 21:54:02| Processing Configuration File: /etc/squid/conf.d/my-squid.conf (depth 1)
2025/03/06 21:54:02| Processing: acl my-blacklist dstdomain "/etc/squid/my-blacklist.txt"
2025/03/06 21:54:02| Processing: http_access deny my-blacklist
2025/03/06 21:54:02| Processing: access_log daemon:/var/log/squid/access.log combined
2025/03/06 21:54:02| Processing: no_cache deny all
2025/03/06 21:54:02| Processing: http_access allow localhost
2025/03/06 21:54:02| Processing: http_access deny all
2025/03/06 21:54:02| Processing: http_port 3128
2025/03/06 21:54:02| Processing: coredump_dir /var/spool/squid
2025/03/06 21:54:02| Processing: refresh_pattern ^ftp:		1440	20%	10080
2025/03/06 21:54:02| Processing: refresh_pattern ^gopher:	1440	0%	1440
2025/03/06 21:54:02| Processing: refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
2025/03/06 21:54:02| Processing: refresh_pattern .		0	20%	4320
2025/03/06 21:54:02| Initializing https:// proxy context
2025/03/06 21:54:02| Requiring client certificates.

Squid の設定ファイルは /etc/squid 配下にあります。

/etc/squid$ ls
conf.d  errorpage.css  my-blacklist.txt  squid.conf

また、/etc/squid/conf.d にも配置できます。

/etc/squid/conf.d$ ls
debian.conf  my-squid.conf

myblacklist.txt と my-squid.conf はワタシのカスタマイズ用に追加したファイルで、他のファイルは元々に存在していたものになります。

こちらは my-squid.conf の内容です。

$ cat my-squid.conf 
#cache_dir diskd /var/spool/squid 4000 16 256 Q1=64 Q2=74
acl my-blacklist dstdomain "/etc/squid/my-blacklist.txt"
http_access deny my-blacklist
access_log daemon:/var/log/squid/access.log combined
no_cache deny all

そしてこちらは my-blacklist.txt の内容です。

$ cat my-blacklist.txt 
.tiktok.com
.microad.jp
.smartnews-ads.com
.focas.jp

conf の一行目はコメントアウトして無効化していますが、ディスクキャッシュを使うための設定になります。ufs というキャッシュ管理形式は古いものらしく、今回は diskd を指定してみました。rock という形式もあるようです。

acl は定義するだけで、http_access でその定義を使う、というようなセットな関係です。

今回は dstdomain という定義属性を使用して、アクセスをブロックしたいドメインを指定しています。

access_log はまさにアクセスログの出力を制御するパタメーターですが、末尾の「combined」を指定したいために追記しました。デフォルトは「squid」なのですが、アクセスログに記録されるタイムスタンプの形式が人間の目で見てもよくわからないので「combined」に変更しました。デフォルトに比べてログ出力量が増えそうです。

no_cache は Squid のキャッシュ機能を無効にする指定です。当初は Squid のディスクキャッシュにたっぷりとキャッシュデータを溜め込んでおき、Firefox が突然にキャッシュデータを削除してしまってもインターネット上のサーバーに再度アクセスすることなく Squid が応答してくれることを期待していたのですが、思っていたよりもキャッシュヒットしない感じです。また、時代が HTTPS 通信に変化していることも影響しているのかもしれません。

ちなみに squidclient というパッケージをインストールすると「squidclient -h localhost -p 3128 mgr:info」のようなコマンドで Squid のキャッシュヒット率を確認できます。これも便利です。

Squid にキャッシュさせると Firefox の通信がちょっと変な場合もあり、キャッシュ機能は無効化してしまいました。

 

アクセスログは楽しい

Squid のアクセスログは中身を確認していると無限に時間が消費されそうなくらい面白いです。

$ ls -lh /var/log/squid/
合計 4.7M
-rw-r----- 1 proxy proxy 1.1M  3月  7 21:07 access.log
-rw-r----- 1 proxy proxy 3.6M  3月  6 22:09 access.log.1
-rw-r----- 1 proxy proxy  46K  3月  5 22:08 access.log.2.gz
-rw-r----- 1 proxy proxy 3.9K  3月  7 20:47 cache.log
-rw-r----- 1 proxy proxy 4.9K  3月  7 06:35 cache.log.1
-rw-r----- 1 proxy proxy 1.1K  3月  6 06:12 cache.log.2.gz

ログファイルのローテーションは OS 側で実施してくれているようです。ログ出力量も数 MB 程度なのでそれほど気にしなくて良さそうです。

grep CONNECT /var/log/squid/access.log なんて感じでログレコードを抽出すると最高です。

::1 - - [07/Mar/2025:06:39:36 +0900] "CONNECT log-netgame.dmm.com:443 HTTP/1.1" 200 3888 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:36 +0900] "CONNECT platform.twitter.com:443 HTTP/1.1" 200 39 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT cdn.microad.jp:443 HTTP/1.1" 403 3958 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_DENIED:HIER_NONE
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT googleads.g.doubleclick.net:443 HTTP/1.1" 200 9042 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT googleads.g.doubleclick.net:443 HTTP/1.1" 200 9036 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT googleads.g.doubleclick.net:443 HTTP/1.1" 200 9049 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT googleads.g.doubleclick.net:443 HTTP/1.1" 200 9050 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT googleads.g.doubleclick.net:443 HTTP/1.1" 200 9003 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT safebrowsing.googleapis.com:443 HTTP/1.1" 200 2567 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT safebrowsing.googleapis.com:443 HTTP/1.1" 200 6848 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:37 +0900] "CONNECT b99.yahoo.co.jp:443 HTTP/1.1" 200 4970 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT
::1 - - [07/Mar/2025:06:39:38 +0900] "CONNECT analytics.tiktok.com:443 HTTP/1.1" 403 3976 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_DENIED:HIER_NONE
::1 - - [07/Mar/2025:06:39:38 +0900] "CONNECT b99.yahoo.co.jp:443 HTTP/1.1" 200 1396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0" TCP_TUNNEL:HIER_DIRECT

Squid がアクセスをブロックしてくれてもアクセスログには記録されていて、HTTP レスポンスとして 403 が応答されていることを確認できます。

dstdomain 用の my-blacklist.txt を編集した際は Squid を再起動して反映させる必要があるようです。

というわけで、Squid によるキャッシュの再利用は残念な結果になりましたが、アクセス制御機能はいい感じでした。