プロキシサーバーとして動作する設定ではあるが、本記事の内容だけでは、パフォーマンス面やセキュリティ面において考慮不足となる事項が多数ある点に注意すること。
Squidのバージョン
今回設定したSquidのバージョンは以下の通り。# squid -v
------------------------------
Squid Cache: Version 3.5.20
設定ファイル「squid.conf
」
Squidの設定ファイルである、/etc/squid/squid.conf
ファイルをコメント付きで以下に記載する。細かな説明は後述する。# cat /etc/squid/squid.conf
------------------------------
# 接続クライアントのネットワークを指定
acl localnet src 192.168.33.0/24
acl localnet src 192.168.11.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
http_access deny !Safe_ports # Safe_portsで指定したポート以外を拒否
http_access deny CONNECT !SSL_ports # 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 # すべてを拒否
# 待ち受けポートを8080に指定
http_port 8080
# キャッシュの設定
cache_mem 256 MB
cache_dir ufs /var/spool/squid 200 16 256
# 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
# エラーページにバージョンを表示させない
httpd_suppress_version_string on
squid.conf
の詳細説明
acl
その名の通りACL (Access Control List)を設定する。ここで作成したACLをhttp_access
文で指定し、アクセス制御を行う。今回は以下を設定している。
- localnet:squidを利用するクライアントのネットワークアドレス
- SSL_ports:httpsで利用するポート
- Safe_ports:httpで利用するポート
- CONNECT:httpsで利用するメソッド
- blacklist:アクセスを拒否するドメインを指定する。/etc/squid/blacklistファイルにテキストで羅列する
http_access
実際のアクセス制御を設定する。今回は以下を設定している。- blacklistに記載されたドメインへのアクセスは拒否
- Safe_ports以外のポートを利用したアクセス要求は拒否
- SSL_ports以外のポートでCONNECTメソッドを利用するアクセス要求は拒否
- キャッシュマネージャー(※)へのアクセスはlocalhostのみ許可
- squidへのアクセスはlocalnetとlocalhostのみ許可
- 上記に該当しない通信はすべて拒否
http_access
は上から順番に評価されていくので、複雑な設定をする際は評価順を考慮すること。http_port
Squidが待ち受けるポート番号を指定する。今回は8080で設定。cache_mem / cache_dir
cache_mem
はキャッシュとして使用するメモリ量を指定する(デフォルト256MB)。cache_dir
は、キャッシュとして使用するディスク量を指定する。cache_dir
文において、「ufs」を指定しているが、ufsとはSquidで使用されるファイルフォーマットとなる。ufsを指定した際の構文は以下の通りとなる。cache_dir ufs Directory-Name Mbytes L1 L2
Mbytesは確保するファイル容量となる。L1、L2はキャッシュディレクトリに作成するディレクトリの分割数を示す。L1=16、L2=256がデフォルトであり、特に変更する必要はないだろう。
なお、Squidのキャッシュディレクトリを作成する際は、以下コマンドを実行する。
# squid -z
coredump_dir
coredumpを出力する際のディレクトリを指定する。refresh_pattern
キャッシュの更新期間に関する設定を行う。構文は以下の通り。refresh_pattern [-i] regex min percent max [options]
今回、squid.confでは以下の通り設定している。
#キャッシュ更新間隔の設定
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
例えば、ftpサイトのキャッシュは、最低1440分(1日)保持、最大10080分(7日)保持される。1日~7日の間は、対象ファイルの「鮮度」を計算して、キャッシュ要否を判断する。鮮度の計算は以下となり、この計算結果が20%を下回った場合はデータはまだ新しいものと判断し、キャッシュされたデータを読み込む動作をする。
鮮度 = キャッシュ経過時間 / 対象ファイルの作成日からの経過時間
httpd_suppress_version_string
Squidのエラーページのフッターにsquidのバージョン表示をさせない設定となる。一般的に使用しているソフトウェアのバージョン情報は利用者に開示しないことがセオリーとなるので、設定しておいた方がよいだろう。▼変更前
Fri, 29 Dec 2017 12:47:20 GMTにt3023ce72 (squid/3.5.20)が生成しました。
▼変更後
Fri, 29 Dec 2017 12:45:04 GMTにt3023ce72 (squid)が生成しました。
Squidのキャッシュを無効化をする方法
近年では、動的に更新されるWebページが多く存在しており、そのようなサイトではキャッシュされた情報が影響して表示がうまくできなくなる場合がある。また、特にインターネット回線速度も十分にあるような環境においては、キャッシュを無効化することも選択肢のひとつとなるだろう。Squidにてキャッシュを無効化するには、
squid.conf
に以下2行を追加すればよい。acl NOCACHE src all
cache deny NOCACHE
設定の反映方法
以下コマンドでSquidをreloadすることで設定が反映される。# systemctl reload squid
参考
・Squid configuration directive cache_dirhttp://www.squid-cache.org/Doc/config/cache_dir/
・Squid configuration directive cache_mem
http://www.squid-cache.org/Doc/config/cache_mem/
・Squid configuration directive refresh_pattern
http://www.squid-cache.org/Doc/config/refresh_pattern/
更新履歴
- 2018/1/4 新規作成
- 2021/1/11 キャッシュ無効化設定を追記。また、全体的に記事を整形
httpd_suppress_version_stringの例は逆ではないでしょうか?
返信削除確かにそうですね。。。修正しました。
返信削除