手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Squid フォワードプロキシ – 出口制御と許可ネットワークの設計

Ubuntu 22.04 で Squid を使い、フォワードプロキシを構築する手順です。フォワードプロキシは、内部クライアントが外部へ通信するときの出口を制御する装置です。

この記事では、Squid を単なる通信中継としてではなく、内部ネットワークから外部 HTTP / HTTPS 通信へ出ていく境界として整理します。許可ネットワーク、許可ドメイン、ログ確認、認証を入れる場合の注意点まで扱います。

参考書籍
参考書籍

マスタリング TCP/IP 入門編 第6版

TCP/IP、Ethernet、VLAN、ルーティングなど、ネットワークの基礎を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連するプロキシ記事

Squid はフォワードプロキシ、HAProxy はリバースプロキシ / ロードバランサーです。通信の向きと責務を分けて読むと、境界設計を整理しやすくなります。

Squid の位置づけ

項目内容
フォワードプロキシ内部クライアントから外部サイトへの通信を中継する
リバースプロキシ外部クライアントから内部 Web サーバーへの通信を中継する
ロードバランサー複数の上流サーバーへ通信を分散する
WAFHTTP リクエスト内容を検査して攻撃や誤検知を扱う

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.log

Squid の運用では、許可した通信だけでなく拒否された通信も確認します。deny が増える場合、クライアント側の設定ミスなのか、許可リストの不足なのか、意図しない外部通信なのかを切り分けます。

認証を入れる場合の注意

Squid に Basic 認証や LDAP 認証を組み合わせることはできます。ただし、HTTPS 通信が CONNECT で流れる場合、フォワードプロキシ認証の体験や SSO 連携は簡単ではありません。認証は通信制御の一部であり、すべてを解決する仕組みではありません。

  • 認証情報だけに頼らず、送信元ネットワーク制御も使う
  • CONNECT では通信内容を直接見られないことを理解する
  • ドメイン制御は DoH や直通信で回避される可能性がある
  • プロキシを強制するにはネットワーク側の出口制御も必要になる

運用上の注意

  • Squid を外部公開しない
  • 許可ネットワークを明示する
  • 許可ドメイン制御を過信しない
  • ログを見て業務通信と不要通信を分ける
  • 認証とネットワーク制御を組み合わせる

まとめ

Ubuntu 22.04 の Squid は、内部クライアントから外部への通信を中継するフォワードプロキシです。重要なのは、通信を通すことではなく、どの内部ネットワークから、どの宛先へ、どのように出すのかを設計することです。

Ubuntu 22.04 Squid フォワードプロキシ – 出口制御と許可ネットワークの設計

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る