Squidをインストールして設定してみた話

記事タイトルとURLをコピーする

こんにちは! 技術2課、濱岡です。

最近、半熟カレーせんというお菓子にはまってます。

ただでさえ外でないのでちょっと体重が気になるところではありますが、食べてしまします笑

さて、今回はEC2インスタンス上にSquidをインストールして設定をしてみました。

インストールするだけなら簡単なので設定の中身について詳しく書いていこうと思います。

まずはEC2インスタンスを用意

OSはAmazonLinux2でスペックはお好みのものを用意してください笑

EC2はインターネットへ出られるサブネットに立ててくださいね。

セキュリティグループは

  • SSHで接続できるよう許可
  • Squidを利用する接続元の端末からSquidのポートを許可

は設定しておいてくださいね。

インストールしてみる

EC2インスタンスにSSHでログインしてください。 まずはSquidをインストールします。

# yum -y install squid

Completed!ってでてくればOKです。

今回インストールしたバージョンは以下です。

# squid -v
Squid Cache: Version 3.5.20
・・・

自動起動するように設定します

# systemctl enable squid

自動起動設定できているかどうか確認します。

# systemctl status squid 
● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2021-05-15 17:16:28 JST; 10min ago
  Process: 2256 ExecStart=/usr/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)
  Process: 2250 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)
 Main PID: 2275 (squid)
   CGroup: /system.slice/squid.service
           ├─2275 /usr/sbin/squid -f /etc/squid/squid.conf
           ├─2278 (squid-1) -f /etc/squid/squid.conf
           └─2290 (logfile-daemon) /var/log/squid/access.log
・・・

これで起動はOKです

設定ファイルを変更してみる

以下のコマンドで設定ファイルの編集を行います。

vim /etc/squid/squid.conf

全体の設定ファイルを置いておきます。 今回は443番と80番ポートしか利用しない想定で設定ファイルを書いています。(使わない部分についてはコメントアウトしています。) 送信元のIPも制限することもできるのですが、Squidの設定ファイルでは絞らずセキュリィグループで絞ることを想定してます。 そうした方が、送信元のIPを変更したい!という時にサーバーに入らなくてもコンソール画面から変更が可能なので運用が楽になります。

#
# Recommended minimum configuration:
#


# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl whitelist dstdomain "/etc/squid/whitelist"
acl cacheallowlist url_regex "/etc/squid/cacheallowlist"
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines


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


#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports


# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports




# Only allow cachemgr access from localhost
#http_access allow localhost manager
#http_access deny manager


# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost


#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#


# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet whitelist
http_access allow localhost whitelist


# And finally deny all other access to this proxy
http_access deny all


# Squid normally listens to port 3128
http_port 8080


# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256


# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid


#
# Add any of your own refresh_pattern entries above these.
#
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


cache allow cacheallowlist
httpd_suppress_version_string on
visible_hostname unknown
forwarded_for off
logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt %tl

パッとみてもわからないと思うので用途別で解説していきます。

ホワイトリストを使ってアクセスを制限したい

設定部分だけ抜粋したのが以下です。

・・・

acl whitelist dstdomain "/etc/squid/whitelist"

・・・

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet whitelist
http_access allow localhost whitelist


# And finally deny all other access to this proxy
http_access deny all

・・・

acl whitelistで参照するホワイトリストのファイルを設定しています。 今回、ホワイトリストはドメインでの制御を想定してます。 dstdomainを指定するとドメインでの指定が可能となります。 今回だと/etc/squid/whitelistでファイルを作成してそのファイルにアクセスを許可したいドメインを記載してください。

http_access allowの部分でホワイトリストに当てはまれば通信を許可という設定を書いています http_access deny allで上の部分で許可された通信以外は拒否すると設定を書いています。

特定のURLのみキャッシュしたい

設定部分を抜粋してます。

・・・

acl cacheallowlist url_regex "/etc/squid/cacheallowlist"

・・・

cache allow cacheallowlist

・・・

acl whitelistで参照するホワイトリストのファイルを設定しています。 今回は正規表現での制御を想定しています。 url_regexを指定することで正規表現での制御が可能です。 アクセスの制限の設定と同様に/etc/squid/cacheallowlistに正規表現でキャッシュしたいURLを記載します。

Squidのアクセスログのフォーマットをかえたい

ログのフォーマットはデフォルトだと以下になっています。

logformat squid      %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt

ざっと内容を書くとこんな感じですね。

  • %ts:エポック秒
  • %03tu:エポックミリ秒
  • %6tr:応答時間(ミリ秒)
  • %>a:クライアントの送信元IPアドレス
  • %Ss:Squidのリクエストのステータス
  • %03>Hs:クライアントに送信されるHTTPステータスコード
  • %<st:HTTPヘッダを含む送信されたリプライサイズ(応答サイズ)
  • %rm:リクエストメソッド(GET/POSTなど)
  • %ru:クライアントからのリクエストURL
  • %[un:MIMEのレスポンスヘッダ
  • %Sh:Squidの階層のステータス
  • %<a:最後のサーバーまたはピア接続のサーバのIPアドレス
  • %mt:MIMEのコンテンツタイプ

今回は%tl:ローカル時間を追加してみました。

logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt %tl

詳細は以下にありますのでこちらもご確認ください。

www.squid-cache.org

そのほかの設定

待ち受けのポートを変更したい

Squidだとデフォルトが3128になっていますが8080に変更してみます。 以下、設定部分を抜粋しました。

・・・
# Squid normally listens to port 3128
http_port 8080
・・・

http_portの部分に設定したいポート番号を記載すれば問題ないです。

エラーページにSquidのバージョンを表示させないようにしたい

以下を追記します。

httpd_suppress_version_string on

これでURLに接続できなかったときSquidのエラーページがでるのですがそこにSquidのバージョンが表示されないようになります。

ホスト名を非表示にしたい

以下を追記します。

visible_hostname unknown

内部のIPアドレスを隠したい

以下追記します。

forwarded_for off

これで設定は完了

最後にSquidをリスタートして設定は完了です。

# systemctl restart squid

まとめ

いかがでしたでしょうか? 簡単にですがSquidの設定についてまとめてみました。

みなさまの参考になれば幸いです。

はまおか(執筆記事の一覧)

アプリケーションサービス部

プログラムを書くことが好きです