Ubuntu 22.04 で Squid を使い、フォワードプロキシを構築する手順です。フォワードプロキシは、内部クライアントが外部へ通信するときの出口を制御する装置です。
この記事では、Squid を単なる通信中継としてではなく、内部ネットワークから外部 HTTP / HTTPS 通信へ出ていく境界として整理します。許可ネットワーク、許可ドメイン、ログ確認、認証を入れる場合の注意点まで扱います。
マスタリング TCP/IP 入門編 第6版
TCP/IP、Ethernet、VLAN、ルーティングなど、ネットワークの基礎を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
関連するプロキシ記事
Squid はフォワードプロキシ、HAProxy はリバースプロキシ / ロードバランサーです。通信の向きと責務を分けて読むと、境界設計を整理しやすくなります。
- Ubuntu 22.04 Squid プロキシサーバー構築
- Ubuntu 22.04 HAProxy ロードバランサー構築
- フォワードプロキシ認証の課題 – LDAP / Basic 認証 / HTTPS プロキシ / SAML・OIDC の整理
Squid の位置づけ
| 項目 | 内容 |
|---|---|
| フォワードプロキシ | 内部クライアントから外部サイトへの通信を中継する |
| リバースプロキシ | 外部クライアントから内部 Web サーバーへの通信を中継する |
| ロードバランサー | 複数の上流サーバーへ通信を分散する |
| WAF | HTTP リクエスト内容を検査して攻撃や誤検知を扱う |
Squid は HAProxy や Apache リバースプロキシとは通信の向きが違います。内部ユーザーや内部サーバーが外部へ出る経路を管理するものとして考えます。
Squid をインストールする
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y squid基本設定を作成する
内部ネットワークからの通信だけを許可し、それ以外は拒否します。ここでは 10.1.0.0/16 を内部ネットワークの例にします。
sudo tee /etc/squid/squid.conf <<'EOF'
acl localnet src 10.1.0.0/16
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
http_port 3128
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
EOF
sudo squid -k parse
sudo systemctl restart squid待ち受けを確認する
systemctl status squid --no-pager
ss -ltnp | grep ':3128'クライアントから利用する
クライアント側で proxy を指定して外部サイトへアクセスします。
curl -x http://proxy.example.local:3128 -I http://example.com/
curl -x http://proxy.example.local:3128 -I https://example.com/許可ドメインをファイルで管理する
接続先を限定したい場合は、許可ドメインリストを使います。完全なセキュリティ制御ではありませんが、出口制御の一部として使えます。
sudo tee /etc/squid/allow_domain.txt <<'EOF'
.example.com
.ubuntu.com
.canonical.com
EOF
sudo tee /etc/squid/squid.conf <<'EOF'
acl localnet src 10.1.0.0/16
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT
acl allow_domains dstdomain /etc/squid/allow_domain.txt
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet allow_domains
http_access deny all
http_port 3128
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
EOF
sudo squid -k parse
sudo systemctl reload squidログを確認する
sudo tail -n 50 /var/log/squid/access.log
sudo tail -n 50 /var/log/squid/cache.logSquid の運用では、許可した通信だけでなく拒否された通信も確認します。deny が増える場合、クライアント側の設定ミスなのか、許可リストの不足なのか、意図しない外部通信なのかを切り分けます。
認証を入れる場合の注意
Squid に Basic 認証や LDAP 認証を組み合わせることはできます。ただし、HTTPS 通信が CONNECT で流れる場合、フォワードプロキシ認証の体験や SSO 連携は簡単ではありません。認証は通信制御の一部であり、すべてを解決する仕組みではありません。
- 認証情報だけに頼らず、送信元ネットワーク制御も使う
- CONNECT では通信内容を直接見られないことを理解する
- ドメイン制御は DoH や直通信で回避される可能性がある
- プロキシを強制するにはネットワーク側の出口制御も必要になる
運用上の注意
- Squid を外部公開しない
- 許可ネットワークを明示する
- 許可ドメイン制御を過信しない
- ログを見て業務通信と不要通信を分ける
- 認証とネットワーク制御を組み合わせる
まとめ
Ubuntu 22.04 の Squid は、内部クライアントから外部への通信を中継するフォワードプロキシです。重要なのは、通信を通すことではなく、どの内部ネットワークから、どの宛先へ、どのように出すのかを設計することです。



