Raspberry PiでSquid SSL Bump

# 初めに
Aimingが気に入らない記事は消されるらしいっすよ.
ライジングとエイティングが好きです, エイエムアイはもっと好きです.
いろいろ試行錯誤した結果をノートするだけです. 忘備録, 及び防備録警察でもあります.

私の環境ではWebアクセス, ブラウジングが遅すぎてどうにかできないかなと試した記録です.
キャッシュサーバが間にあれば, ましになるんじゃね? という発想です.

## ハードウェア
ROC-RK3328-CCを使います. Raspberry Pi 3B+で試作したのですがROC-RK3328-CCの方で苦労しました.
タイトル?? 詐欺よ, 引っかかっただろ? ムカついた人はそっ閉じしたらいいよ.
Raspberry Pi 3B+はギガビット詐欺なので, 試作してみていけそうなので, ちゃんとギガビットなつよつよハードウェアを用意してみました.

# Squidのビルド
## aptのソースリポジトリ
レポジトリの方が元の発音に近いって? だったら全てアメリカ語で会話してください.
次のファイルにソースリポジトリを追加, raspbianでもarmbianでも同じと思われる.

```
/etc/apt/sources.list
```

## 依存ライブラリ
情報元を失念. 

```
$sudo apt install devscripts build-essential fakeroot libssl-dev
$sudo apt install libldap2-dev libpam0g-dev libdb-dev cdbs libsasl2-dev
$sudo apt install debhelper libcppunit-dev libkrb5-dev comerr-dev
$sudo apt install libcap-dev libecap3-dev libexpat1-dev libxml2-dev
$sudo apt install libnetfilter-conntrack-dev nettle-dev libgnutls28-dev libltdl-dev ed
```

## ビルド
```
$sudo apt source squid3
```
DEB_CONFIGURE_EXTRA_FLAGSにビルドオプションを追加する.

```
$vim debian/rules
DEB_CONFIGURE_EXTRA_FLAGS
	…
	--with-large-files \
	--with-openssl \
	--enable-ssl \
	--enable-ssl-crtd \
	--with-default-user=proxy
```
ビルドする.

```
$./configure
$sudo debuild -us -uc -b
```
おそらく, パッケージ足りないとエラーが出るので, 都度対応する.

## インストール
親ディレクトリに作成された, *.debファイルをインストールする.

```
$sudo dpkg -i squid*.deb
```
依存パッケージがない場合はエラーになるため, 解決する.

```
$sudo apt --fix-broken install
$sudo dpkg -i squid*.deb
```

## 動作テスト
とりあえず動かしてみましょう. raspbian, armbianともにsystemdでしょうから,

```
$systemctl start squid
$systemctl status squid
```

# SSL証明書
raspbianやarmbianのopenssl.cnfは素のままらしく, 詳しく理解していないとうまく作成できない.
てきとうにCentOSなどでオレオレ証明書を作成する.
証明書の保存ディレクトリは特別なコマンドで作成するらしい.

```
sudo /usr/lib/squid/security_file_certgen -c -s /var/spool/squid/ssl_db -M 4MB
```

オレオレ証明書と秘密鍵はsquidのディレクトリに入れよう.

```
/etc/squid/squidCA.crt
/etc/squid/squidCA.key
```

オレオレ証明書はアクセスしたいコンピュータやブラウザにいれようね.

# キャッシュ用SSD
キャッシュ&ロギング用のストレージを用意する. フラッシュディスクはすぐに壊れるからね, しかたないね.
てきとうにUSB3.0対応のモバイルSSDを購入, これが仇となる.

## パーティションとフォーマット
fdiskとmkfsでext4の領域を作成したけれど, squidの起動で"xhci_hcd"がエラーをはいている.
partedとxfsとか試したりいろいろしたけれど, "xhci_hcd"がエラーでだめらしい.
ROC-RK3328-CCパイセンのUSB3.0は諦めて, USB2.0にディスクつなぐ.
あっさりうまくいく, なんでや!!

# Squidの設定
正直, ぜんぜん理解していない. /etc/squid/squid.confである.
SSL Bumpが必要ない方~~(Gなんとかパイセンのおかげで許されないんだ)~~は, ssl-bumpの設定を削除するといい.
ディスクキャッシュはある程度余裕を持った方がいいらしい, 500GiBのSSDを用意したので300GiB程度割り当てました.

```
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 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

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost manager
http_access deny manager

http_access allow localnet
http_access allow localhost

http_access deny all

http_port 3128 ssl-bump \
  tls-cert=/etc/squid/squidCA.crt \
  tls-key=/etc/squid/squidCA.key \
  generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all

cache_dir ufs /mnt/hdd1/spool/squid/ 307200 16 256

coredump_dir /mnt/hdd1/spool/squid

cache_mem 256 MB
cache_swap_low 90
cache_swap_high 95
maximum_object_size 4 GB
minimum_object_size 0 KB
maximum_object_size_in_memory 128 MB
ipcache_size 2048
ipcache_low 90
ipcache_high 95

refresh_pattern ^ftp:		1440	80%	43200
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern -i play.google.com/.* 1440 90% 259200
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 43200
refresh_pattern -i \.(jpeg|jpg|png|gif|bmp|tiff)$ 1440 90% 43200
refresh_pattern -i \.(mp4|mpeg|wmv|webm|avi|mkv|mpg)$ 1440 90% 259200
refresh_pattern -i \.(mp3|wmv|aac|m4a)$ 1440 90% 259200
refresh_pattern -i \.(iso|zip|lzh|exe|tar|gz|rar|7z|pdf|ppt|doc|rpm|deb)$ 1440 90% 259200
refresh_pattern .		0	40%	4320

request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
reply_header_access X-Forwarded-For deny all
reply_header_access Via deny all
reply_header_access Cache-Control deny all
forwarded_for off
httpd_suppress_version_string on

logfile_rotate 10

logformat custom %{%Y/%m/%d %H:%M:%S}tl %6tr %Ss%03>Hs %<st %rm %ru %[un %Sh/%<a %mt

access_log /mnt/hdd1/log/squid/access.log custom
cache_log /mnt/hdd1/log/squid/cache.log
cache_store_log /mnt/hdd1/log/squid/store.log
coredump_dir /mnt/hdd1/log/squid/core
```

特定ドメインをスルーしたい場合.

```
acl BrokenButTrustedServers dstdomain example.com
sslproxy_cert_error allow BrokenButTrustedServers
sslproxy_cert_error deny all
```

# 結果
体感では爆速になったのですが, access.logを監視した感じだと大してキャッシュヒットしていない気がします. 名前解決の必要がなくなるから? それにしても体感は速くなった. これなら~~Qiitaの閲覧~~エロサイトの閲覧が捗りますね.
趣味なので, しっかりと計測する気がないです. う↑え↑はaccess.log, し↓た↓はhtopです.
![DSC_0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27065/4db97422-50ea-4777-8f10-492192abe255.jpeg)

# まとめ
いかがだったでしょうか? は大嫌い.
私は独り身ですが, ご家庭にキャッシュサーバは必須なのでは? と思いました. これはもうギガの節約になりますね.
USB3.0のドライバが安定しないとは言いませんが, ドライバ関連の相性問題はあるなと痛感しました.
コア単位で制御していると思っていましたが, CPU単位なのですね, 興味深いです.

# 追記
## 2019/12/06
Windows Updateができないという~~嬉しい~~誤算があったのですが, Windowsのプロキシ設定でプロキシ経由から外せばいけました.

```
*.download.windowsupdate.com;*.download.windowsupdate.com;*.download.microsoft.com;*.update.microsoft.com;*.windowsupdate.com;*.windowsupdate.microsoft.com;*.ntservicepack.microsoft.com;*.wustat.windows.com;*.download.windowsupdate.com;*.au.windowsupdate.com;*.tlu.dl.delivery.mp.microsoft.com
```
本当は, Squidの設定でなんとかしたかったのですが上手くいかなかったのです.

## 2019/12/07
Steamも追加しておく.

```
*.steampowered.com;*.steamcommunity.com;*.steamgames.com;*.steamusercontent.com;*.steamcontent.com;*.steamstatic.com;*.akamaihd.net
```

## 2020/05/31
Raspberry Pi 4に更新, 特に問題ないかな.
SDメモリーカードの寿命を延ばすためにいろいろ考えました.

- スワップは削除.

```
sudo apt remove dphys-swapfile
```

- `/tmp`, `/var/tmp`, `/var/log`をRAMに移動.

- squidのログローテーション

設定を追加, squid.confに`logfile_rotate 10`を追加しないと, `squid -k rotate`を実行してもログがローテーションされない.
`logfile_rotate`を追加して, cronに追加しました.