はじめに
プロキシサーバーとしてsquidを入れてみます。
version 4.9が最新でした。
環境
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)
--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)
What is the difference between xmalloc and malloc?(stackoverflow.com)
--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の設定 その2(www.mindcircus.jp)
--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)
--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)
--without-mit-krb5, --without-heimdal-krb5
今回は認証不要なので無しにします。
--with-large-files
大きいファイルのやり取りをするために必要なようです。
参考資料
Squid経由でダウンロードすると2GBで止まってしまう(typex2.wordperss.com)
上記をあわせると以下の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)
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)
rockででやろうとするとチューニングが大変そうですので、aufsにします。
ディレクティブ: cache_dir(www.robata.org)
squid 3.5.12-20151128-r13959 失敗編(marm.cocolog-nifty.com)
# ./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)
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)
おまけ
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