6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-13

はじめに

プロキシサーバーとして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
6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?