今回はAmazon Linux2022(以下AL2022)でOSSのWebProxyのSquidを構築します。Amazon Linux2では"yum install squid"で簡単にインストールできますが、AL2022ではリポジトリからSquidパッケージがなくなっているようで自力でコンパイルしないといけません。悲しい...ネットでは簡単にサクサクできます的な感じですがソースDL、コンパイルからやると結構つまずくポイントが多かったので備忘録もかねて記事にします。
Squidとは何ぞやという方はこちら →Squidとは?
今回のゴール(やりたいこと)
AL2022をデプロイして
・Squid公式サイトからソースDLし、コンパイルして設定、構築する
・"systemctl squid start/stop"でサービス起動と停止ができるようにする
・Squid経由でデータDLできることを確認する
前提環境
以下の環境を前提として構築していきます。
・デプロイするEC2のOSはAL2022
・デプロイするEC2からインターネットへのアクセスは可能
・Squidのバージョンは5.x(今回はv5.7を構築しています)
構築の流れ
① VPC/EC2のデプロイ
② AL2022の初期設定、構築に必要なパッケージ、ツールのインストール
③ SquidソースデータのDL、コンパイル
④ サービス登録
⑤ 動作確認
実際にやってみた
①VPC/EC2のデプロイですがいつも通り他に詳しい記事があるので割愛します。とりあえずパブリックサブネットにAL2022がデプロイできればOKです。
続いて②ですがSSHでログイン、管理者モードに昇格して以下設定を行います。
#モジュールアップデート
yum -y update
#日本語化
localectl set-locale LANG=ja_JP.UTF-8
#タイムゾーンの設定
timedatectl set-timezone Asia/Tokyo
#ホスト名設定
hostnamectl set-hostname test-squid
いったんこれで設定反映させるため再起動をします
reboot
再起動後に以下パッケージ、ツールのインストール
#構築に必要なパッケージ、ツールのインストール
yum -y install vim
yum -y install gcc-c++
yum -y install wget
yum -y install perl
これで準備はOKなので、ここから③SquidソースデータのDL、コンパイルを行います。
まずソースデータをDLする予定のディレクトリに移動します。
#/usr/local/srcにソースデータをDLする予定
cd /usr/local/src
#データをDL (DLするバージョンはhttp://www.squid-cache.org/Versions/v5/で確認) ※今回はv5.7
wget http://www.squid-cache.org/Versions/v5/squid-5.7.tar.gz
ls -lすると"squid-5.7.tar.gz"がDLされていると思います。
DLした"squid-5.7.tar.gz"を解凍します。
tar fxzv squid-5.7.tar.gz
これでgzファイルが解凍されて、"squid-5.7"というディレクトリが作成されていると思います。
squid-5.7に移動
cd squid-5.7
次にディレクトリを指定してconfigureの実行を行います ※10分程度かかります。
./configure --prefix=/usr/local/squid/
makeを実行した際にエラー判定されないように変数を設定
export CFLAGS="-w"
export CXXFLAGS="-w"
makeの実行 ※20分程度かかります
make
make installの実行
make install
これでSquidソースデータのDL、コンパイルは完了です。続いてsystemctl start squid でサービス起動・停止できるように起動スクリプトを作成します。
# 起動スクリプト記述
[Unit]
Description=Squid caching proxy
After=syslog.target network.target nss-lookup.target
[Service]
Type=forking
LimitNOFILE=16384
EnvironmentFile=/usr/local/squid/etc/squid.conf
Environment="SQUID_CONF=/usr/local/squid/etc/squid.conf"
ExecStartPre=/usr/local/squid/libexec/cache_swap.sh
ExecStart=/usr/local/squid/sbin/squid $SQUID_OPTS -f $SQUID_CONF
ExecReload=/usr/local/squid/sbin/squid $SQUID_OPTS -k reconfigure -f $SQUID_CONF
ExecStop=/usr/local/squid/sbin/squid -k shutdown -f $SQUID_CONF
TimeoutSec=0
[Install]
WantedBy=multi-user.target
起動スクリプトはこれでOKです。他に必要なファイルや権限を設定していきます。
# cache_swap.shを作成
vi /usr/local/squid/libexec/cache_swap.sh
以下を記述 ※インデントがずれることがあるので注意
#!/bin/bash
if [ -f /etc/sysconfig/squid ]; then
. /etc/sysconfig/squid
fi
SQUID_CONF=${SQUID_CONF:-"/usr/local/squid/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... "
squid -N -z -F -f $SQUID_CONF >> /usr/local/squid/var/logs/squid.out 2>&1
fi
done
# 設定読込
systemctl daemon-reload
# 実行権限を付与
chmod +x /usr/local/squid/libexec/cache_swap.sh
#キャッシュディレクトリの所有者を変更
chown nobody:nobody /usr/local/squid/var/cache/squid
chown nobody:nobody /usr/local/squid/var/logs
# キャッシュディレクトリの権限を変更
chmod -R 777 /usr/local/squid/var/cache/squid
これで設定は完了です。systemctl start squid でサービスが起動するか確認しましょう。
# squidサービス起動
systemctl start squid
# サービス状態の確認
systemctl status squid
以下のように「Active」となっていればOKです。
● squid.service - Squid caching proxy
Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2023-01-30 16:17:34 JST; 6s ago
Process: 2116 ExecStartPre=/usr/local/squid/libexec/cache_swap.sh (code=exited, status=0/SUCCESS)
Process: 2121 ExecStart=/usr/local/squid/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)
Main PID: 2122 (squid)
Tasks: 3 (limit: 9386)
Memory: 15.8M
CPU: 61ms
CGroup: /system.slice/squid.service
├─ 2122 /usr/local/squid/sbin/squid -f /usr/local/squid/etc/squid.conf
├─ 2124 "(squid-1)" --kid squid-1 -f /usr/local/squid/etc/squid.conf
└─ 2125 "(logfile-daemon)" /usr/local/squid/var/logs/access.log
あとは動作確認していきます。
まずちゃんとSquidで利用するポート(デフォルトだと3128)が開放されているかを確認します。
# Portの空きを確認
lsof -i:3128
以下のように表示されればOKです。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
squid 2124 nobody 11u IPv6 16517 0t0 TCP *:squid (LISTEN)
※port番号設定などはsquid.confで記述されています
Squid経由でデータのDLができるかどうかを確認します。
# Proxy経由の通信テスト
curl -O -L "https://www.redhat.com/index.html" -x "localhost:3128"
curlコマンドで、Proxy=localhostのポート3128経由でhttps://www.redhat.com/index.htmlをDLしてみます。
DLしたディレクトリでls -lを実行して"index.html"があればOKです。
ついでにProxyのログを確認します。
# ログのディレクトリまで移動
cd /usr/local/squid/var/logs/
#ログファイル(access.log)を表示
cat access.log
以下のようにログが出ていればOKです。
1675063537.720 478 127.0.0.1 TCP_TUNNEL/200 162598 CONNECT www.redhat.com:443 - HIER_DIRECT/23.194.65.134 -
ログの時間表示ですがデフォルトだとUTC標記ですらないのでわかりにくいです。ログをわかりやすく表示させたい場合がsquid.confでログのフォーマットを定義してやりましょう。
yum installでインストールした場合とのちがい
Amazon Linux2やRedhat8であれば”yum install squid”で簡単にインストールできます。ただSquidのバージョンはv3.5となります。3.6以降のバージョンを利用したい場合はソースデータからコンパイルすることになります。yumでインストールすると勝手にサービス登録してくれるので、起動スクリプトなどの手動作成が必要ないので便利です。また各種ディレクトリのパスもyum利用とソースからコンパイルした場合で変わります。今回はコンパイル時に"./configure --prefix=/usr/local/squid/"としていますので、squidの各種設定ファイルやログは”/usr/local/squid/”の下にあります。
例)
squid.confの場所は「/usr/local/squid/etc」
ログファイルの場所は「/usr/local/squid/var/logs」
おわりに
squid.confの設定については以前に記事にしたものがありますので、ご参考までに。
https://qiita.com/u-bayashi/items/26daf29f874135b452af
参考にしたサイト
https://www.unknownengineer.net/entry/2017/07/11/233058
https://qiita.com/shadowhat/items/f595d564498bbccb46d5