サーバOS: Ubuntu 18.04 Server
クライアントOS: Windows 10 Pro version 1903
Squid 4.9
まずはソースコードを取得するところから始める。
$ wget -c http://www.squid-cache.org/Versions/v4/squid-4.9.tar.bz2 $ wget -c http://www.squid-cache.org/Versions/v4/squid-4.9.tar.bz2.asc $ gpg --recv-keys B06884EDB779C89B044E64E3CD6DBF8EF3B17D3E $ gpg --verify squid-4.9.tar.bz2.asc (snip) gpg: Good signature from "Amos Jeffries (Squid Signing Key) <squid3@treenet.co.nz>" [unknown]
libssl-dev
パッケージが不足していると configure: error: library 'crypto' is required for OpenSSL
というエラーメッセージが突き付けられるから予めの導入を要する。
$ sudo apt install libssl-dev $ sudo useradd -s /bin/false squid $ tar jxvf squid-4.9.tar.bz2 $ cd squid-4.9/ $ ./configure --prefix=/usr/local/squid --enable-ssl-crtd --with-openssl --with-default-user=squid $ make all $ sudo make install
次いで自己署名証明書を生成する。これはルート証明書として取り扱うことになる。証明書のセキュリティが侵害されるとMITM攻撃に晒される恐れがあるというから十分に注意を払わねばならない。
$ cd /usr/local/squid/etc/ $ sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem $ sudo openssl x509 -in myCA.pem -outform DER -out myCA.der
作成した自己署名証明書をクライアントの端末へコピーしてインストールする。
実際に証明書がインストールされたか否かを詳らかにするため inetcpl.cpl
を実行してインターネットのプロパティを開く。
squidサーバの設定へ戻り、証明書の所有者とパーミッションを変更してsquidユーザだけが読み取れるようにしておく。
$ sudo chown squid:squid myCA.pem $ sudo chmod 400 myCA.pem $ ls -l myCA.pem -r-------- 1 squid squid 3095 Nov 24 00:05 myCA.pem
設定ファイル squid.conf
の編集に移る。動的に生成された証明書をキャッシュできるメモリやディスクの容量を指定する箇所があるけれども、どの程度が適当かとんと検討がつかぬから思い切って公式サイトの手引きの4倍をセットした。
あと sslcrtd_program
の項目に ssl_crtd
コマンドを指定しているサイトが其処此処に見られたけれども、此れがどうしても見当たらなくてこまった。リリースノートを過去へ遡ってゆくとバージョン4.0.5からは名称が security_file_certgen
へと移り変わった模様である。
$ sudo vi /usr/local/squid/etc/squid.conf #http_port 3128 http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=16MB cert=/usr/local/squid/etc/myCA.pem sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 16MB sslcrtd_children 20 sslproxy_cert_error deny all ssl_bump stare all
動的に生成される証明書をキャッシュしておくディレクトリを用意する為に次のコマンドを実施する。
$ sudo /usr/local/squid/libexec/security_file_certgen -c -s /usr/local/squid/var/cache/squid/ssl_db -M 16MB Initialization SSL db... Done
これで一通りの下拵へは済んだから愈々Squidを起動する。するとパーミッションにまつわるエラーメッセージでまったく起動できない。/usr/local/squid/var/
以下の所有者を一斉に squid
へと差し替えて事なきを得た。
$ sudo /usr/local/squid/sbin/squid WARNING: Cannot write log file: /usr/local/squid/var/logs/cache.log /usr/local/squid/var/logs/cache.log: Permission denied messages will be sent to 'stderr'. $ sudo chown -R squid:squid /usr/local/squid/var/ $ sudo /usr/local/squid/sbin/squid
あとはクライアント端末のProxy設定をよしなに整えてやれば終いである。
ログを流しながらGoogle Chromeで多数のサイトを閲覧した。けれどもちっともキャッシュにヒットせずTCP_MISSばかり発生する。此は如何にと思っていたらどうも先んじてGoogle ChromeのキャッシュにヒットするせいでSquidの出番がなかった模様である。
そこでGoogle Chromeの起動オプションに --disk-cache-size=1
を指定した。実質的にキャッシュを無効にしてから改めて試験を実施するとキャッシュにヒットした証のTCP_MEM_HITが現れるようになった。