EC2(Amazon Linux 2022)でSquid(v.5.7)を構築する

今回はAmazon Linux2022（以下AL2022）でOSSのWebProxyのSquidを構築します。Amazon Linux2では"yum install squid"で簡単にインストールできますが、AL2022ではリポジトリからSquidパッケージがなくなっているようで自力でコンパイルしないといけません。悲しい...ネットでは簡単にサクサクできます的な感じですがソースDL、コンパイルからやると結構つまずくポイントが多かったので備忘録もかねて記事にします。

Squidとは何ぞやという方はこちら　→[Squidとは？](https://e-words.jp/w/Squid.html)

# 今回のゴール(やりたいこと)
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