Contents
Overview
Squid を使用してプロキシサーバーを構築します。Squid プロキシサーバーは、Web コンテンツのキャッシュとアクセス制御を行うためのプロキシサーバーソフトウェアです。主に HTTP や HTTPS などのプロトコルで動作し、次のような機能を提供します。
- キャッシュ機能: 頻繁にアクセスされる Web ページをローカルに保存することで、再度のアクセス時にインターネットを経由せず、キャッシュされたページを提供し、レスポンスを高速化し、帯域幅の節約に貢献します。
- アクセス制御: IP アドレスやドメイン名、ポート番号に基づいてアクセスの許可やブロックを設定でき、企業や学校でのインターネット利用を制限するのに役立ちます。
- コンテンツフィルタリング: 特定の Web サイトやコンテンツに対するアクセスを制限することで、セキュリティや業務効率向上を目的としたフィルタリングが可能です。
- 匿名性向上: ユーザーの IP アドレスを隠すことができ、ユーザーのプライバシーを保護したり、アクセス元を特定できないようにすることができます。
また、プロキシサーバーには大きくフォワードプロキシ、リバースプロキシがあり、前者はユーザーが不特定多数のサイトにアクセスする場合の代理アクセスとして使用され、後者はフロントエンドとしてバックエンドサーバーの代わりにクライアントからのアクセスを受け付け、負荷分散や SSL オフロードとしても使用されます。これは一般的にロードバランサーが使われますし、CDN もこの類です。この記事ではフォワードプロキシを構築する方法を紹介しています。
フォワードプロキシの用途における考え方の違い
単にユーザーインターネットにアクセスするためのプロキシサーバーは、特に企業では URL フィルタリングと併用され、特定のカテゴリに対するアクセスはブラックリストとしてアクセスできないように設定されています。これはユーザーが様々なインターネット上にサイトにアクセスするため、ブラックリスト方式の方が管理的に都合が良いためです。一方で、ユーザーではなく、システムが自発的に通信するもののアクセスをホワイトリスト的に制御する場合もあります。この通信はユーザーのように不特定多数のサイトへのアクセスではなく、システムが自律的にパッチをダウンロードしたり、何らかのシステム的なチェックをしたりします。このような挙動ではアクセス先の URL は基本的に固定となるため、ホワイトリスト的に明示的に FQDN を指定した方が良いわけです。この記事では後者の目的でまとめています。
前提条件
- こちらを参考に基本設定が完了していること。
インストール
squid をインストールします。
sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install squid
/etc/squid/squid.conf
/etc/squid/squid.conf を編集します。
デフォルト値
デフォルト値は下記の通りです。
grep -v -e '^\s*#' -e '^\s*$' /etc/squid/squid.conf | sed 's/#.*//' | sed 's/[[:space:]]*$//' | expand | tr -s [:space:] | sed 's/^\s/ /g'
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
include /etc/squid/conf.d/*.conf
http_access deny all
http_port 3128
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 \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern . 0 20% 4320
設定値
設定値は下記の通りです。
sudo cp -ai /etc/squid/squid.conf{,.orig}
全体的に必要最小限の設定とし、セキュリティを強化しています。
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fd00::/8
acl allow_domain dstdomain "/etc/squid/allow_domain.txt"
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
# Safe_ports で指定した宛先ポート 80, 443 以外でのプロキシの利用を拒否
http_access deny !Safe_ports
# SSL_ports で指定した宛先ポート 443 以外の CONNECT メソッドを拒否
http_access deny CONNECT !SSL_ports
# localhost からのプロキシの利用を許可
http_access allow localhost
# プロキシを経由して localhost にアクセスするリクエストを拒否
http_access deny to_localhost
# プロキシを経由して linklocal (169.254.0.0/16, fe80::/10) にアクセスするリクエストを拒否
http_access deny to_linklocal
# localnet に含まれるアドレスからプロキシの利用を許可し、且つ、allow_domain で指定したドメインにのみアクセスを許可
http_access allow localnet allow_domain
# 上記以外を拒否
http_access deny all
include /etc/squid/conf.d/*.conf
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern . 0 10% 1440
# X-Forwarded-For ヘッダーを削除 し、クライアントの元の IP アドレスを隠蔽
request_header_access X-Forwarded-For deny all
# Via ヘッダーを削除 し、リクエストがプロキシ経由であることを隠蔽
request_header_access Via deny all
# Referer ヘッダーを削除 し、リクエストの発生元 URL を隠蔽
request_header_access Referer deny all
# User-Agent ヘッダーを削除 し、クライアントのブラウザ情報を隠蔽
request_header_access User-Agent deny all
# X-Forwarded-For ヘッダーを付与しない
forwarded_for off
# ログをカスタマイズして apache のログに近い状態にする
logformat apache "%>a - - [%tl] \"%rm %ru HTTP/%rv\" %Hs %<st \"%{Referer}>h\" \"%{User-Agent}>h\""
access_log /var/log/squid/access.log apache
/etc/squid/allow_domain.txt
/etc/squid/allow_domain.txt は、宛先ドメインを限定しています。以下は APT, SNAP を利用可能な設定となります。必要に応じて追加してください。
esm.ubuntu.com
jp.archive.ubuntu.com
security.ubuntu.com
api.snapcraft.io
設定の有効化
設定を有効化します。
sudo systemctl restart squid.service && systemctl status squid.service