Squidの設定



●概要

 Squid(スクウィッド)はプロキシ (Proxy) サーバ、ウェブキャッシュサーバなどに利用されるフリーソフトウェア。Squidの用途は重複しているリクエストに対したキャッシュ応答によるウェブサーバの高速動作や、ネットワーク資源を共有する人々が行うWorld Wide WebやDNSなどの様々なネットワーククエリのキャッシュなど多岐にわたります。
 下記URLを参照。
 Squid cache

●インストールと設定

 参照URL:squid の設定
 参照URL:squid入門

 インストールと初期設定は下記のとおりです。
# dnf install squid -y
# vi /etc/squid/squid.conf
# アクセス元となるネットワークを追記
acl localnet src 192.168.220.0/24

# 許可するポートを指定
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

# /etc/squid/blacklistファイルに拒否するドメインを記載
acl blacklist dstdomain "/etc/squid/blacklist"
http_access deny blacklist

# Safe_portsで指定したポート以外を拒否
http_access deny !Safe_ports
# SSL_portsで指定したポート以外を拒否
http_access deny CONNECT !SSL_ports

# キャッシュマネージャーへのアクセスはlocalhostのみ許可
http_access allow localhost manager
http_access deny manager

# 接続クライアントの許可設定
http_access allow localnet       ← localnetで指定したネットワークを許可
http_access allow localhost      ← localhostを許可
http_access deny all             ← すべてを拒否

# 待受ポート番号の変更
http_port 8080
注:Firewallを利用している場合は該当ポートを開放すること

# キャッシュの設定
cache_mem 256 MB
cache_dir ufs /var/spool/squid 200 16 256

# Squidのキャッシュディレクトリを作成する際は、以下コマンドを実行します。
# squid -z ← Rocky Linux 9ではサービスを起動すると自動的に作成された。

# coredump出力先を設定
coredump_dir /var/spool/squid

#キャッシュ更新間隔の設定
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320


# 匿名サーバ化の設定を追記
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

# ホスト名を追記
visible_hostname proxy.bigbang.mydns.jp

# IP非表示の設定追記
forwarded_for off

# アクセスログの時刻を見やすい表示に
logformat squid %tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log /var/log/squid/access.log timefm
 squidの起動と自動起動を設定します。
# systemctl start squid
# systemctl enable squid


●基本認証設定

 アクセスを許可していないホストからでもユーザ名・パスワードによる認証を許可することにより、プロキシサーバーを利用できるようにします。
 ユーザ名・パスワードはWebdavの設定で作成したユーザ名・パスワードを利用することとします。
# vi /etc/squid/squid.conf
#auth_param basic program <uncomment and complete this line>
auth_param basic program /usr/lib/squid/ncsa_auth /var/www/.htpasswd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
acl CONNECT method CONNECT
acl password proxy_auth REQUIRED
http_access allow password
http_access deny all
# systemctl start squid
# systemctl enable squid


●コマンドによるSquidの確認

 参照URL:squidの起動と動作確認

 squidの起動後、下記コマンドにより動作確認します。
 今回はhttps://www.google.com/?hl=jaのコンテンツを取得できるかを確認しました。
$ squidclient --host localhost --port proxy-port https://www.google.com/?hl=ja
HTTP/1.1 200 OK Link: </?hl=ja>;rel="canonical" Date: Wed, 28 Dec 2022 13:12:37 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
Cross-Origin-Opener-Policy-Report-Only: same-origin-allow-popups; report-to="gws"
Report-To: {"group":"gws","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/gws/other"}]}
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2022-12-28-13; expires=Fri, 27-Jan-2023 13:12:37 GMT; path=/; domain=.google.com; Secure
Set-Cookie: AEC=AakniGMADUeSbANXDW-B-bX_Eu_qNecP1jgSICOylLWFEL6OCm-LSgCpmQ; expires=Mon, 26-Jun-2023 13:12:37 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
Set-Cookie: NID=511=J2OMfpmohFif4s3PD8HJp8a3PN0BZtAul4TYw6B-ryX3ukXMbiI6sQJDU74Z1pxjs3vjFQ7sUbib1QmYSAUpNB_8k6sCqYvNeVsWofvBbxmfHTAq0L_sujRQv4K4TDWW4V7Jwp0DH2YoqeX5xp_ar7JcjoH9hdqoeTBTfSlPpws; expires=Thu, 29-Jun-2023 13:12:37 GMT; path=/; domain=.google.com; HttpOnly
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Accept-Ranges: none
Vary: Accept-Encoding
X-Cache: MISS from proxy.bigbang.mydns.jp
X-Cache-Lookup: MISS from proxy.bigbang.mydns.jp:3128
Via: 1.1 proxy.bigbang.mydns.jp (squid/4.15)
Connection: close

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="・・・・・・・・

 「HTTP/1.1 200 OK」とあれば、正常に動作しています。

●Squidの確認

 Webブラウザ(Internet Explorer)設定を設定します。
 Internet Explorerのメニューで、

 ツール
  → インターネットオプション
   → 「接続」タブ
    → 「LANの設定」ボタン押下
     → 「LANにプロキシサーバーを使用する」をチェック
      → 「詳細設定」ボタン押下
       → 「種類」HTTP及びSecureの「使用するプロキシのアドレス」にサーバーのIPアドレス、「ポート」に8888と入力して
        注:Secureでも設定しない場合、https://・・・/でのアクセス時にblacklistで定義されたドメインやURLにヒットしなくなります。
        → OKボタンを押下

 診断くんにアクセスして、プロキシサーバーの確認をします。

 総合評価:?(A 以上 or 生 IP。下記参照)

 と表示されれば正常に動作しています。

 参照URL:SquidでWebアクセスをフィルタリングする

 ホワイトリスト方式とブラックリスト方式がありますが、どっちを設定するかによって設定方法が異なりますので注意が必要です。

●squidGuardのインストールと設定

 2022年1月11日からhttp://www.shallalist.de/Downloads/shallalist.tar.gzに接続できなくなっています。
 Rocky Linux 9ではquidGuardをインストール出来なくなっています。

 squidGuardをインストールし、設定します。
# yum -y install squidGuard
# cd /usr/local/src
# git clone https://github.com/soimort/translate-shell
# cd translate-shell/
# make && make install
# rm -rf translate-shell/
# cd
 Shalla's Blacklistsで提供されるブラックリストを使用して、ブラックリストを作成します。
 Shalla's Blacklistsのブラックリストを使用し不要なため、squidGuardと一緒にインストールされるサンプルブラックリスト削除します。
# rm -f /var/squidGuard/blacklists.tar.gz
 ブラックリスト日次更新スクリプトの作成
# vi /etc/cron.daily/squidGuard-blacklists-udate

#!/bin/sh
cd /var/squidGuard/

# ブラックリストダウンロード
wget http://www.shallalist.de/Downloads/shallalist.tar.gz > /dev/null 2>&1
[ $? -ne 0 ] && echo "$(basename ${0}) aborted!" | mail -s "$(basename ${0}) aborted!" root && exit

# ブラックリスト展開
tar zxvf shallalist.tar.gz > /dev/null 2>&1
[ $? -ne 0 ] && echo "$(basename ${0}) aborted!" | mail -s "$(basename ${0}) aborted!" root && exit
rm -f shallalist.tar.gz

# squidGuard設定ファイル(ブラックリスト定義)作成
rm -f /etc/squid/squidGuard-blacklist.conf
cat BL/global_usage | while read line
do
    echo ${line} | grep "^NAME:" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        NAME=`echo ${line} | awk '{print $2}'` 
    fi
    echo ${line} | grep "^DESC EN:" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        DESC=`echo ${line} | sed -e 's/DESC EN: \(.*\)/\1/p' -e d | /usr/local/bin/trans -b --no-auto :ja` 
    fi
    echo ${line} | grep "^NAME EN:" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        NAME_FULL=`echo ${line} | sed -e 's/NAME EN: \(.*\)/\1/p' -e d` 
        echo "# ${NAME_FULL}" >> /etc/squid/squidGuard-blacklist.conf
        echo "# ${DESC}" >> /etc/squid/squidGuard-blacklist.conf
        echo "dest ${NAME} {" >> /etc/squid/squidGuard-blacklist.conf
        echo "        domainlist BL/${NAME}/domains" >> /etc/squid/squidGuard-blacklist.conf
        echo "        urllist    BL/${NAME}/urls" >> /etc/squid/squidGuard-blacklist.conf
        echo "        redirect http://www.bigbang.mydns.jp/cgi-bin/squidGuard-simple.cgi?\
clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u" >> /etc/squid/squidGuard-blacklist.conf
        echo "        log anonymous block.log" >> /etc/squid/squidGuard-blacklist.conf
        echo "}" >> /etc/squid/squidGuard-blacklist.conf
        echo >> /etc/squid/squidGuard-blacklist.conf
    fi
done

if [ ${#} -eq 0 ]; then
    # squidGuard設定ファイル生成
    cat /etc/squid/squidGuard-common.conf \
        /etc/squid/squidGuard-src.conf \
        /etc/squid/squidGuard-blacklist.conf \
        /etc/squid/squidGuard-acl.conf > /etc/squid/squidGuard.conf
    # ブラックリストDB化
    squidGuard -C all
    chown -R squid.squid /var/squidGuard/
    chown -R squid.squid /var/log/squidGuard/
    # Squid再読み込み
    squid -k reconfigure
fi
 ブラックリスト日次更新スクリプトに実行権限の付加
# chmod +x /etc/cron.daily/squidGuard-blacklists-udate
 ブラックリスト日次更新スクリプト実行(squidGuard設定ファイル(ブラックリスト定義)作成)。作成に少し時間を要します。
# /etc/cron.daily/squidGuard-blacklists-udate 1
 squidGuard設定ファイル(基本)を作成します。
# vi /etc/squid/squidGuard-common.conf
dbhome /var/squidGuard
logdir /var/log/squidGuard
 squidGuard設定ファイル(IPアドレス定義)を作成します。
 注:IPアドレスによる定義のため固定IPアドレスを割り当てておくこと。
# vi /etc/squid/squidGuard-src.conf
# IPアドレス定義(管理者)
src admin {
        ip              192.168.100.1
}
# IPアドレス定義(端末A)
src terminalA {
        ip              192.168.100.2
}
# IPアドレス定義(端末B、C)
src other_terminal {
        ip              192.168.100.3
        ip              192.168.100.4
}
 当ファイルを更新した場合、下記コマンドを実行しsquidGuard設定ファイルを生成し直す必要があります。

 squidGuard設定ファイル(アクセス制御定義)を作成します。
# vi /etc/squid/squidGuard-acl.conf
# アクセス制御定義
acl {
        
        # アクセス制御定義(管理者)
        admin {
                # 無制限
                pass     any
        }
        # アクセス制御定義(端末A)
        terminalA {
                # 無制限
                pass     any
        }
        # アクセス制御定義(その他)
        default {
                # ブラックリストの下記カテゴリ以外アクセス許可
                # ※各カテゴリの意味はsquidGuard設定ファイル(ブラックリスト定義)参照
                pass !aggressive !costtraps !dating !drugs !gamble !hacking !porn !religion \
                     !sex/lingerie !sex/education !spyware !violence !warez !weapons all
        }
}
 当ファイルを更新した場合、下記コマンドを実行しsquidGuard設定ファイルを生成し直す必要があります。

 squidGuard設定ファイルを生成します。
# cat /etc/squid/squidGuard-common.conf /etc/squid/squidGuard-src.conf \
    /etc/squid/squidGuard-blacklist.conf /etc/squid/squidGuard-acl.conf > /etc/squid/squidGuard.conf
# squidGuard -d -C all ← ブラックリストDB化
・
・
・
2018-03-19 14:52:09 [19585] squidGuard 1.4 started (1521438713.550)
2018-03-19 14:52:09 [19585] db update done
2018-03-19 14:52:09 [19585] squidGuard stopped (1521438729.625)
 DBディレクトリ所有者変更
# chown -R squid.squid /var/squidGuard/
 ログディレクトリ所有者変更
# chown -R squid.squid /var/log/squidGuard/
 Squid設定ファイル編集
# vi /etc/squid/squid.conf

※以下を追加
# squidGuard連携設定
url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
 squidGuard-simple.cgi編集
# vi /var/www/cgi-bin/squidGuard-simple.cgi
# Email Adresse des Proxy Administrators:
# Edit to your requirements. Make sure to keep the @ escaped.
管理者メールアドレス変更
my $PROXYEMAIL = "webmaster\@mail.bigbang.mydns.jp";

squidGuardロゴURL変更(3ヶ所)
    print "      <A HREF=\"http://www.squidguard.org/\"><IMG SRC=\"http://www.squidguard.org/Logos/squidGuard.gif\"\n";

    print "      <A HREF=\"http://www.squidguard.org/\"><IMG SRC=\"http://www.squidguard.org/Logos/squidGuard.gif\"\n";

    print "      <A HREF=\"http://www.squidguard.org/\"><IMG SRC=\"http://www.squidguard.org/Logos/squidGuard.gif\"\n";
 squid再読み込み。
# systemctl reload squid
 アクセスブロック時に実行されるCGIスクリプトへ内部からのみアクセスできるよう制限します。

 Apache用squidGuard設定ファイル作成
# vi /etc/httpd/conf.d/squidGuard.conf
<Files "squidGuard-simple.cgi">
    <IfModule mod_authz_core.c>
        # Apache 2.4
        Require ip 127.0.0.1
        Require ip 10.0.0.0/8
        Require ip 172.16.0.0/12
        Require ip 192.168.0.0/16
    </IfModule>
    <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order allow,deny
        Allow from 127.0.0.1
        Allow from 10.0.0.0/8
        Allow from 172.16.0.0/12
        Allow from 192.168.0.0/16
    </IfModule>
</Files>
 apache再読み込み。
# systemctl reload httpd
 使用しないCGIスクリプトの削除
# rm -f /var/www/cgi-bin/squidGuard-simple-de.cgi
# rm -f /var/www/cgi-bin/squidGuard.cgi


●キャッシュの削除

 動作試験が終了したらキャッシュを削除するようにしましょう。
# systemctl stop squid
# rm -rf /var/spool/squid/*
# systemctl start squid
 また、ブラウザ側のキャッシュも削除しないと、自分でかけたコンテンツフィルターに引っかかったままになりますので注意が必要です。

●squidGuard-blacklists-udate aborted!

 2022年1月11日からhttp://www.shallalist.de/Downloads/shallalist.tar.gzに接続できなくなっています。

 root宛に「squidGuard-blacklists-udate aborted!」というメールが送信されるようになりました。
 動作を確認すると
# bash -x /etc/cron.daily/squidGuard-blacklists-udate 1
+ cd /var/squidGuard/
+ wget http://www.shallalist.de/Downloads/shallalist.tar.gz
+ '[' 0 -ne 0 ']'
+ tar zxvf shallalist.tar.gz
+ '[' 2 -ne 0 ']'
++ basename /etc/cron.daily/squidGuard-blacklists-udate
++ basename /etc/cron.daily/squidGuard-blacklists-udate
+ mail -s 'squidGuard-blacklists-udate aborted!' root
+ echo 'squidGuard-blacklists-udate aborted!'
+ exit
 異常終了しました。
 
# ls -l /var/squidGuard/
合計 109528
drwxr-x--- 59 squid squid    4096  7月 27  2020 BL
-rw-r--r--  1 squid squid 3700995  1月 20 16:25 shallalist.tar.gz
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.1
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.2
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.3
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.4
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.5
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.6
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.7
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.8
-rw-r--r--  1 squid squid 9856619  1月  1 09:01 shallalist.tar.gz.9
 残骸らしきものがありました。
# rm -f /var/squidGuard/shallalist.tar.gz*
 shallalist.tar.gzという名前が付いているファイルを全て削除し、再実行したところ正常に処理されました。