Ubuntu 22.04 で Squid をフォワードプロキシとして使う場合、単に通信を中継できればよいわけではありません。内部ネットワークから外部へ出る経路として、許可する送信元、許可する宛先、ログで確認する範囲を決めておく必要があります。
この記事は、Ubuntu 22.04 の既存環境で Squid の設定を読み直すための記事です。新規構築では Ubuntu 26.04 側の記事を優先しつつ、22.04 環境の設定確認や古い構築記録の読み替えに使ってください。
- Squid をフォワードプロキシとして置く位置
- 内部ネットワークだけを許可する基本設定
- 許可ドメインをファイルで管理する考え方
- クライアント側のプロキシ指定とログ確認
- 認証やドメイン制御を過信しないための注意点
書籍
マスタリング TCP/IP 入門編 第6版
TCP/IP、Ethernet、VLAN、ルーティングなど、ネットワークの基礎を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
Squid の位置づけ
Squid は、内部クライアントから外部サイトへの通信を中継するフォワードプロキシです。外部から内部 Web サーバーへ入る通信を受けるリバースプロキシや、複数の上流サーバーへ振り分けるロードバランサーとは役割が違います。
| 項目 | 主な役割 |
|---|---|
| フォワードプロキシ | 内部クライアントから外部への通信を中継する |
| リバースプロキシ | 外部クライアントから内部 Web サーバーへの通信を受ける |
| ロードバランサー | 複数の上流サーバーへ通信を分散する |
| WAF | HTTP リクエスト内容を検査する |
Squid を置くときは、通信を通す装置ではなく、外部通信の境界として考えます。許可ネットワークを明示し、必要に応じて宛先制御やログ確認を組み合わせます。
Squid をインストールする
Ubuntu 22.04 の標準リポジトリから Squid をインストールします。
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y squid内部ネットワークだけを許可する
最初は、内部ネットワークからの HTTP / HTTPS 通信だけを許可する設定にします。ここでは 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 squidhttp_access deny all を最後に置き、許可していない通信を通さない形にします。Squid を外部へ開けたままにすると、意図しない中継点として使われる危険があります。
待ち受けを確認する
サービス状態と 3128/tcp の待ち受けを確認します。
systemctl status squid --no-pager
ss -ltnp | grep ':3128'待ち受け先を限定したい場合は、http_port に待ち受けアドレスを含めます。複数インターフェイスを持つサーバーでは、管理用、内部用、外部用のどこで待ち受けるかを確認します。
クライアントから利用する
クライアント側では、プロキシとして Squid のアドレスとポートを指定します。
curl -x http://proxy.example.local:3128 -I http://example.com/
curl -x http://proxy.example.local:3128 -I https://example.com/HTTPS の場合、Squid は通常 CONNECT メソッドでトンネルを作ります。暗号化された通信内容をそのまま検査できるわけではないため、ドメイン制御や認証の限界を理解して使います。
許可ドメインをファイルで管理する
接続先を限定したい場合は、許可ドメインリストを使います。これは出口制御の一部であり、ネットワーク側の直通信防止や DNS 設計と合わせて考える項目です。
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許可ドメインをファイルに分けると、設定ファイル本体と宛先リストを分けて管理できます。ただし、ドメイン制御だけで全ての外部通信を制御できるわけではありません。
ログを確認する
Squid の運用では、許可された通信だけでなく、拒否された通信も確認します。
sudo tail -n 50 /var/log/squid/access.log
sudo tail -n 50 /var/log/squid/cache.log拒否ログが増える場合は、クライアント側のプロキシ指定ミス、許可リスト不足、意図しない外部通信のどれかを分けて見ます。サーバーの自動更新や GPG 鍵取得も、プロキシ経由にするか直通信を許すかを決めておく必要があります。
認証を入れる場合の注意
Squid に Basic 認証や LDAP 認証を組み合わせることはできます。ただし、フォワードプロキシ認証はブラウザ、CLI ツール、OS 更新、アプリケーションごとに対応が異なります。
- 認証情報だけに頼らず、送信元ネットワーク制御も使う
CONNECTでは通信内容を直接見られないことを理解する- ドメイン制御は DoH や直通信で回避される可能性がある
- プロキシを強制するにはネットワーク側の出口制御も必要になる
- 認証が必要な端末とサーバー自動処理を分けて考える
運用上の注意
Squid は便利ですが、境界に置くサービスです。外部公開、許可ネットワークの広げすぎ、ログを見ない運用は避けます。
- Squid を外部公開しない
- 許可ネットワークを明示する
- 許可ドメイン制御を過信しない
- ログを見て必要な通信と不要な通信を分ける
- 認証とネットワーク制御を組み合わせる
まとめ
Ubuntu 22.04 の Squid は、内部クライアントから外部への通信を中継するフォワードプロキシです。重要なのは、通信を通すことだけではなく、どの内部ネットワークから、どの宛先へ、どのように出すかを決めることです。
22.04 の既存環境では、設定ファイルの中身、許可ネットワーク、許可ドメイン、ログの見方を確認します。新しい環境へ移す場合は、プロキシを使う対象と使わない対象、認証の要否、直通信を防ぐネットワーク側の制御まで合わせて見直します。

