【学習メモ】CentOS8にSquidをソースインストール

# はじめに
プロキシサーバーとしてsquidを入れてみます。

version 4.9が最新でした。

http://www.squid-cache.org/Versions/
# 環境
CentOS 8.0.1905 (Core)
Squid 4.9
#手続き
## ダウンロード
```
# cd /usr/local/src
#wget http://www.squid-cache.org/Versions/v4/squid-4.9.tar.gz
# tar xf squid-4.9.tar.gz
# chown -R root. squid-4.9
# cd squid-4.9
```
## 展開した中身の確認
```
# ls
CONTRIBUTORS  ChangeLog    Makefile.in  RELEASENOTES.html  aclocal.m4    compat        contrib  icons    libltdl    src
COPYING       INSTALL      QUICKSTART   SPONSORS           bootstrap.sh  configure     doc      include  po4a.conf  test-suite
CREDITS       Makefile.am  README       acinclude          cfgaux        configure.ac  errors   lib      scripts    tools
```
## コンフィグの確認

```
# ./configure --help
```
オプションがたくさんあります。
ざっと読んでいくと以下が目にとまります。

### --prefix=PREFIX
インストール先の指定。
### --enable-dependency-tracking
遅い依存関係をrejectしないそうです。
依存関係は大事なので指定しておきます。
### --enable-delay-pools
帯域制限ができるようになるそうです。
### --enable-ssl-crtd
CA証明書とかいろいろ入れると、Squidで一度SSLの暗号化を解けるらしいです。
今回クライアント側への作業はしないのでスキップします。
参考資料
[SSL/HTTPS対応の透過型プロキシを立てる（SSL Bump）(webnetforce.net)](https://webnetforce.net/squid-ssl-bump/)
### --enable-cache-digests
キャッシュを使って速くするそうです。
### --enable-stacktraces
致命的なエラーの自動コールバックトレースを有効にする(google翻訳、Dec.13, 2019)
致命的なエラーのときに自動で動く…というのは挙動をわかっていないと使いづらいですが、
なにか動かすようなものではなさそうなので入れてみます。
### --enable-xmalloc-statistics
``` Show malloc statistics in status page ```
xmallocはmallocのラッパー関数とのことです。
とりあえずsquidだけで使うのでxmallocを使ってみます。
参考資料
[Cでのエラーハンドリング方法(khondalit.hatenablog.com)](http://khondalit.hatenablog.com/entry/2014/11/02/075506)
[What is the difference between xmalloc and malloc?(stackoverflow.com)](https://stackoverflow.com/questions/7590254/what-is-the-difference-between-xmalloc-and-malloc)
### --enable-disk-io="list of modules"
ディスクアクセスのモジュール。
Set without a value or omitted, all available modules will be built.
設定しなくても利用可能なものをすべて使ってくれるみたいです。
### --enable-storeio="list of modules"
キャッシュを書くファイルシステムらしいです。
参考資料だと、afs、ufs、diskedのうちaufsが最も速いらしいです。
dockerだとoverlay2というものがあったような気がします。
とりあえず~~overlayfsで指定してみます。~~ 結果使えませんでした。
参考資料
[Squid Proxy Serverの設定 その２(www.mindcircus.jp)](https://www.mindcircus.jp/archives/4242)
### --enable-icmp
PINGで生きてるか確認したいときに必要です。
### --enable-x-accelerator-vary
UserAgentと関連するVaryヘッダを処理してくれるそうです。
### --disable-ipv6
現状ipv6だけで必要なものはないので無効化しておきます。
### --enable-translation
ローカライズされたエラーページが出るそうです。
日本語言語設定であれば日本語出でるんでしょうか。有効にします。
### --with-included-ltdl
libtoolsというライブラリでsquidに入っている?んでしょうか。
ライブラリが見つからないのは困るので指定しておきます。
参考資料
[10. libltdlの使用(web.sfc.wide.ad.jp)](http://web.sfc.wide.ad.jp/~sagawa/gnujdoc/libtool-1.4.2/libtool-ja_10.html)
### --with-openssl=PATH
TLS1.3のサイトにアクセスするときに必要でしょうか。
t2.microあたりでTLS1.3しかアクセスできないapacheを建ててあとで検証します。
参考資料
[Squid with custom openssl path is using the openssl installed in default path(squid-web-proxy-cache.1019090.n4.nabble.com)](http://squid-web-proxy-cache.1019090.n4.nabble.com/Squid-with-custom-openssl-path-is-using-the-openssl-installed-in-default-path-td4687484.html)
###   --without-mit-krb5, --without-heimdal-krb5
今回は認証不要なので無しにします。
### --with-large-files
大きいファイルのやり取りをするために必要なようです。
参考資料
[Squid経由でダウンロードすると2GBで止まってしまう(typex2.wordperss.com)](https://typex2.wordpress.com/2009/05/31/squid%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%81%A82gb%E3%81%A7%E6%AD%A2%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86/)

上記をあわせると以下のConfigになります。

```
./configure \
--prefix=/usr/local/squid-4.9 \
--enable-dependency-tracking \
--enable-cache-digests \
--enable-stacktraces \
--enable-xmalloc-statistics \
--enable-disk-io \
--enable-storeio="overlayfs" \
--enable-icmp \
--enable-delay-pools \
--enable-x-accelerator-vary \
--disable-ipv6 \
--with-included-ltdl \
--with-openssl=/usr/local/openssl \
--without-mit-krb5 \
--without-heimdal-krb5 \
--with-large-files
```
まずはOpenssl1.1.1dを入れます。

```
dnf install make gcc perl git expat-devel pcre-devel zlib-devel
dnf install lksctp-tools lksctp-tools-devel  
dnf install kernel-modules-extra
modprobe sctp 
checksctp

wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar xf openssl-1.1.1d.tar.gz
chown -R root. openssl-1.1.1d
cd openssl-1.1.1d
./config --prefix=/usr/local/openssl-1.1.1d --openssldir=/usr/local/openssl-1.1.1d/shared enable-md2 enable-rc5 sctp zlib -fPIC
make
make test
```
```
./config --prefix=/usr/local/openssl-1.1.1d --openssldir=/usr/local/openssl-1.1.1d/shared enable-md2 enable-rc5 sctp zlib -fPIC
```
```
../test/recipes/20-test_enc.t ...................... Dubious, test returned 1 (wstat 256, 0x100) Failed 1/172 subtests
```
バグなようなので無視します。
https://github.com/openssl/openssl/issues/9866

```
../test/recipes/80-test_ssl_new.t .................. Dubious, test returned 6 (wstat 1536, 0x600) Failed 6/29 subtests
```
sctpが有効ではないと出てくるそうです。
[Red Hat Bugzilla – Bug 1020674(bugzilla.redhat.com)](https://bugzilla.redhat.com/show_bug.cgi?id=1020674)
sctpを有効にしておきます。(↑のconfigや手順では有効になっています)

```
dnf install lksctp-tools lksctp-tools-devel  
dnf install kernel-modules-extra
modprobe sctp 
```
インストールしていきます。

```
make install

cd /usr/local
ln -s openssl-1.1.1d openssl

echo -e "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl-1.1.1d.conf

echo -e 'OPENSSL_111D_PATH=/usr/local/openssl/bin\nPATH=$OPENSSL_111D_PATH:$PATH\nexport PATH' > /etc/profile.d/openssl-1.1.1d.sh
source /etc/profile.d/openssl-1.1.1d.sh

ldconfig
```
```
# openssl version -a
OpenSSL 1.1.1d  10 Sep 2019
built on: Fri Dec 13 06:47:27 2019 UTC
platform: linux-x86_64
options:  bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -fPIC -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/openssl-1.1.1d/shared"
ENGINESDIR: "/usr/local/openssl-1.1.1d/lib/engines-1.1"
Seeding source: os-specific
```
~~Oracle Linux8で出ていたエラーが出ていません。不思議ですね。~~
2019-12-16 追記
/usr/bin/opensslで出ました。Opensslのconfigureオプションを変更しました。


squidをインストールしていきます。


```
# ./configure \
--prefix=/usr/local/squid-4.9 \
--enable-dependency-tracking \
--enable-cache-digests \
--enable-stacktraces \
--enable-xmalloc-statistics \
--enable-disk-io \
--enable-storeio="overlayfs" \
--enable-icmp \
--enable-delay-pools \
--enable-x-accelerator-vary \
--disable-ipv6 \
--with-included-ltdl \
--with-default-user=squid \
--with-openssl=/usr/local/openssl \
--without-mit-krb5 \
--without-heimdal-krb5 \
--with-large-files

(中略)
configure: error: overlayfs not found in ./src/fs
```

ファイルシステムのところでエラーがでました。
./src/fsの中にあるファイルシステムなら使えたようです。

```
# ls ./src/fs
Makefile.am  Makefile.in  Module.cc  Module.h  aufs  diskd  rock  ufs
```
overlayfsはないようです。
全部入れることもできるようです。
[squid 3.5.12-20151128-r13959 解説編Ⅱ（ビルド）(marm.cocolog-nifty.com)](http://marm.cocolog-nifty.com/jokanaan/2015/12/squid-3512-20-2.html)

rockででやろうとするとチューニングが大変そうですので、aufsにします。
[ディレクティブ: cache_dir(www.robata.org)](https://www.robata.org/docs/squid/Reference/squid3.4.0.3/cache_dir.html)
[squid 3.5.12-20151128-r13959 失敗編(marm.cocolog-nifty.com)](http://marm.cocolog-nifty.com/jokanaan/2015/12/squid-3512-20-3.html)

```
# ./configure \
--prefix=/usr/local/squid-4.9 \
--enable-dependency-tracking \
--enable-cache-digests \
--enable-stacktraces \
--enable-xmalloc-statistics \
--enable-disk-io \
--enable-storeio="aufs" \
--enable-icmp \
--enable-delay-pools \
--enable-x-accelerator-vary \
--disable-ipv6 \
--with-included-ltdl \
--with-default-user=squid \
--with-openssl=/usr/local/openssl \
--without-mit-krb5 \
--without-heimdal-krb5 \
--with-large-files

(中略)
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands

# echo $?
0
```

configureが通りました。

makeします。(2Cで20分くらいかかりました)

```
# make -j4

(中略)

make[1]: 'all-am' に対して行うべき事はありません.
make[1]: ディレクトリ '/usr/local/src/squid-4.9' から出ます

# echo $?
0
```
インストールします。

```
# make install
(中略)
make[2]: 'install-exec-am' に対して行うべき事はありません.
make[2]: 'install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ '/usr/local/src/squid-4.9' から出ます
make[1]: ディレクトリ '/usr/local/src/squid-4.9' から出ます

# echo $?
0
```
無事インストールされました。

起動スクリプトを探します。

```
# ls -la /etc/init.d/ | grep squid
# ls -la /usr/lib/systemd/system/ | grep squid
# ls -la /etc/systemd/system | grep squid
```
ありません。

似たような記事がありました。rpmから拝借します。
[Squid 3.5をインストールする（ソースからコンパイル） for CentOS7.3(qiita.com/shadowhat)](https://qiita.com/shadowhat/items/f595d564498bbccb46d5)

```
vim /usr/lib/systemd/system/squid-4.9.service

[Unit]
Description=Squid caching proxy
After=syslog.target network.target nss-lookup.target

[Service]
Type=forking
LimitNOFILE=16384
Environment="SQUID_CONF=/usr/local/squid-4.9/etc/squid.conf"
ExecStartPre=/usr/local/squid-4.9/libexec/cache_swap.sh
ExecStart=/usr/local/squid-4.9/sbin/squid $SQUID_OPTS -f $SQUID_CONF
ExecReload=/usr/local/squid-4.9/sbin/squid $SQUID_OPTS -k reconfigure -f $SQUID_CONF
ExecStop=/usr/local/squid-4.9/sbin/squid -k shutdown -f $SQUID_CONF
TimeoutSec=0

[Install]
WantedBy=multi-user.target
```

cache_swap.shもあるようなので作成します。

```
vi /usr/local/squid-4.9/libexec/cache_swap.sh

#!/bin/bash
ulimit -HSn 8192
if [ -f /etc/sysconfig/squid ]; then
        . /etc/sysconfig/squid
fi

SQUID_CONF=${SQUID_CONF:-"/usr/local/squid-4.9/etc/squid.conf"}

CACHE_SWAP=`sed -e 's/#.*//g' $SQUID_CONF | \
        grep cache_dir | awk '{ print $3 }'`

for adir in $CACHE_SWAP; do
        if [ ! -d $adir/00 ]; then
                echo -n "init_cache_dir $adir... "
                /usr/local/squid-4.9/sbin/squid -N -z -F -f $SQUID_CONF >> /usr/local/squid-4.9/var/logs/squid.out 2>&1
        fi
done
```
開けるファイル数が少ないとパフォーマンスに影響が出るようなのでlimitを増やしておきます。

```
# chmod +x /usr/local/squid-4.9/libexec/cache_swap.sh
```

起動してみます。

```
# systemctl status squid-4.9.service
● squid-4.9.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid-4.9.service; disabled; vendor preset: disabled)
   Active: activating (start) since Fri 2019-12-13 18:54:22 JST; 12s ago
  Process: 12104 ExecStartPre=/usr/local/squid-4.9/libexec/cache_swap.sh (code=exited, status=0/SUCCESS)
Cntrl PID: 12110 (squid)
    Tasks: 1 (limit: 23632)
   Memory: 2.5M
   CGroup: /system.slice/squid-4.9.service
           └─12110 /usr/local/squid-4.9/sbin/squid -f /usr/local/squid-4.9/etc/squid.conf

12月 13 18:54:22 proxy systemd[1]: Starting Squid caching proxy ...
12月 13 18:54:22 proxy squid[12110]: 2019/12/13 18:54:22| WARNING: BCP 177 violation. Detected non-functional IPv6 loopback.
```
ipv6を無効にしてコンパイルしているのにどうしてipv6を見に行くのか…
同じ記事を参考に0.0.0.0をつけてみます。

ついでにポートを8080に変更します。

```
before
http_port 3128

after
http_port 0.0.0.0:8080
```

別のマシンからつなげてみます。

```
# curl abehiroshi.la.coocan.jp -x http://192.168.0.12:8080/
curl: (7) Failed to connect to 192.168.0.12 port 8080: Connection refused
```
おや?アクセスできません。

squidが落ちてしまっているようです。

/var/log/messagesを見ると

```
 WARNING: Cannot write log file: /usr/local/squid-4.9/var/logs/cache.log
```
どうやら権限が足りないようです。

```
# chown -R squid. /usr/local/squid-4.9/var/logs
# systemctl start squid-4.9
```
configureで指定したsquidユーザーをオーナーにします。

気を取りなおしてアクセスします。

```
# curl abehiroshi.la.coocan.jp -x http://192.168.0.12:8080/
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
<title></title>
</head>
<frameset cols=18,82>
  <frame src=menu.htm marginheight=0 marginwidth=0 scrolling=auto name=left>
  <frame src=top.htm marginheight=0 marginwidth=0 scrolling=auto name=right>
</frameset><noframes></noframes>
```
はやい。見えました。

httpsのサイトも確認します。

```
# curl https://www.centos.org -x http://192.168.0.12:8080/
(中略)
          <p class="text-muted credit">© 2019 The CentOS Project | <a href="/legal/">Legal</a> | <a href="/legal/privacy/">Privacy</a></p>
        </div>
      </div>
    </div>
  </body>
</html>
```
大丈夫なようです。

チューニングやTLS1.3の検証はまたのちほど。

なおlimitsは以下の方法で確認できます。
[ファイルディスクリプタ数を拡張する方法(qiita.com/SkyLaptor)](https://qiita.com/SkyLaptor/items/7e57d98d8540296d6143)
## おまけ
CentOS8にしたらcockpitを有効にしましょうが面倒で、
cockpitをアンインストールしようとしましたが依存関係でいろいろアンインストールされてしまうので、
メッセージを非表示にしました。

```
Active the web console with: systemctl enable --now cockpit.socket

# ls -la /etc/motd.d/cockpit
lrwxrwxrwx. 1 root root 17 Jul  2 00:40 /etc/motd.d/cockpit -> /run/cockpit/motd
# unlink /etc/motd.d/cockpit
```