プロキシサーバ(squid)の構築


今回はプロキシサーバとしてメジャーなsquidをAmazon Linux2023にインストールしてみます。
squidはオープンソースソフトウェアで無料で使用することのできるプロキシサーバです。
無料で使用できるわりに機能は充実しており、フォワードプロキシとリバースプロキシのどちらの用途でも使用可能です。
実際に企業でも使用されることが多く、十分な機能を持ったソフトウェアです。
squidはオープンソースソフトウェアで無料で使用することのできるプロキシサーバです。
無料で使用できるわりに機能は充実しており、フォワードプロキシとリバースプロキシのどちらの用途でも使用可能です。
実際に企業でも使用されることが多く、十分な機能を持ったソフトウェアです。
作業環境
導入サーバとしてAmazon Linux2023を用意してログインできるようにしておいてください。
また、導入対象のサーバはインターネットアクセスが可能である必要があります。
対象サーバに直接グローバルIPを設定しても良いですし、NATを経由したアクセスでも構いません。
また、導入対象のサーバはインターネットアクセスが可能である必要があります。
対象サーバに直接グローバルIPを設定しても良いですし、NATを経由したアクセスでも構いません。
設計要素
設計項目 | 手順No | 内容 |
---|---|---|
プロキシ使用元のIPアドレス | 構築手順④ |
squidは、利用を許可するIPアドレスレンジを指定できます。 ネットワーク機器による通信設定(ACL)とは別にsquidでもフィルタリング可能ということです。 ここでは、プロキシの使用を許可する利用者のIPアドレスレンジを検討し、設定する必要があります。 セキュリティは多層防御を基本に考えるため、ネットワークによる通信設定とsquidによる許可設定の2つで防御するのがベストですが、企業によってはsquid側はプライベートIP全てを許可して、細かい制御はネットワーク機器でやると割り切っているところもあります。 |
通信を許可するドメイン | 構築手順⑥ |
ホワイトリストに設定したドメインのみ、プロキシを経由してアクセスが可能です。 逆に記載されていないドメインにはアクセスできないため、利用者が危険なサイトにアクセスすることを予防することができます。 どのドメインを許可するのかを検討して、決定する必要があります。 最初は少な目に設定して、利用者から追加の依頼があったら少しずつ追加していく方法がお勧めです。 |
構築手順
①Squid導入対象サーバにログインし、まずは準備として既存パッケージのアップデートをしておきます。

②squidをインストールします。
③インストールが完了すると「Complete!」と表示されます。
④squidで通信元IPと許可するプロトコルの設定を行います。
変更する内容を赤太字で表記します。
⑤同じ設定ファイルを続けて編集し、通信してよいアクセス先の設定を行います。

変更する内容を赤太字で表記します。
⑥アクセスを許可する通信先ドメインのホワイトリストを作成します。
ここに記載したドメインのもののみ、プロキシを経由してアクセスできるようなイメージです。

⑦設定した内容をsquidプロキシに読み込ませてサービスを起動します。
また、サーバの再起動をした時にも自動的に起動してくるように自動起動も設定しています。

以上でプロキシ(squid)のインストール作業は完了です!
# dnf update

②squidをインストールします。
# dnf -y install squid

③インストールが完了すると「Complete!」と表示されます。

④squidで通信元IPと許可するプロトコルの設定を行います。
# vi /etc/squid/squid.conf

変更する内容を赤太字で表記します。
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
#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 localnet src <プロキシの使用元IPアドレス>
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
⑤同じ設定ファイルを続けて編集し、通信してよいアクセス先の設定を行います。

変更する内容を赤太字で表記します。
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# For example, to allow access from your local networks, you may uncomment the
# following rule (and/or add rules that match your definition of "local"):
http_access deny !localnet
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist
⑥アクセスを許可する通信先ドメインのホワイトリストを作成します。
ここに記載したドメインのもののみ、プロキシを経由してアクセスできるようなイメージです。
# vi /etc/squid/whitelist

ポイント!
ホワイトリストのドメインは、完全一致とサブドメインを許可する方法があります。
完全一致だと通信先のドメインと全く一緒のドメインである必要があり、「www.example.com」のような形で書きます。
サブドメインで許可する場合は「.example.com」のように先頭を「.」します。
こうすると、「www.example.com」でも、「test.example.com」でもサブドメインがどんなものでも通信可能になります。
完全一致だと通信先のドメインと全く一緒のドメインである必要があり、「www.example.com」のような形で書きます。
サブドメインで許可する場合は「.example.com」のように先頭を「.」します。
こうすると、「www.example.com」でも、「test.example.com」でもサブドメインがどんなものでも通信可能になります。
⑦設定した内容をsquidプロキシに読み込ませてサービスを起動します。
また、サーバの再起動をした時にも自動的に起動してくるように自動起動も設定しています。
# systemctl status squid
# systemctl enable squid
# systemctl start squid
# systemctl status squid

以上でプロキシ(squid)のインストール作業は完了です!
動作テスト
続いてインストールしたプロキシ(squid)サーバの動作を確認してみましょう。
①別のサーバから許可したドメインに向けて、curlコマンドで通信を開始します。
「HTTP/1.1 200 Connection established」と応答があったので、プロキシを経由してインターネット上のサーバと通信が確立できたという意味になります。

②今度は許可していないドメインに向けて、curlコマンドで通信を開始します。
「HTTP/1.1 403 Forbidden」と応答があったので、想定通りプロキシによって通信が拒否されました。

③squidプロキシサーバに戻って、ログを確認してみます。
許可したドメインの通信は「TCP_TUNNEL/200」とあるので通信が成功したということです。
逆に許可し邸内ドメインの通信は「TCP_DENIED/403」とあるので通信を拒否したということです。

想定どおりに許可したドメインのみアクセスが可能であることが確認できましたね。
これでプロキシ(squid)サーバの動作確認も完了です。
①別のサーバから許可したドメインに向けて、curlコマンドで通信を開始します。
「HTTP/1.1 200 Connection established」と応答があったので、プロキシを経由してインターネット上のサーバと通信が確立できたという意味になります。
# curl -I https://<通信先ドメイン> -x http://<squidプロキシサーバのIP>:3128

②今度は許可していないドメインに向けて、curlコマンドで通信を開始します。
「HTTP/1.1 403 Forbidden」と応答があったので、想定通りプロキシによって通信が拒否されました。
# curl -I https://<通信先ドメイン> -x http://<squidプロキシサーバのIP>:3128

③squidプロキシサーバに戻って、ログを確認してみます。
許可したドメインの通信は「TCP_TUNNEL/200」とあるので通信が成功したということです。
逆に許可し邸内ドメインの通信は「TCP_DENIED/403」とあるので通信を拒否したということです。
# cat /var/log/squid/access.log

想定どおりに許可したドメインのみアクセスが可能であることが確認できましたね。
これでプロキシ(squid)サーバの動作確認も完了です。
まとめ
今回はプロキシの中でも最もメジャーといっても過言ではないsquidの構築方法を紹介しました。
手順を見て思ったかもしれませんが、かなり設定が簡単です。
短い手順でもホワイトリストのフォワードプロキシを設定することができます。
ただ、今回の内容は飽くまでもインストールから初期設定レベルなので、機能を無駄なく使っているわけではありません。
キャッシュの設定や冗長化構成など、まだまだ進化できます。
squidは便利なソフトウェアなので、自分でも構築できるようにしておきましょう。
手順を見て思ったかもしれませんが、かなり設定が簡単です。
短い手順でもホワイトリストのフォワードプロキシを設定することができます。
ただ、今回の内容は飽くまでもインストールから初期設定レベルなので、機能を無駄なく使っているわけではありません。
キャッシュの設定や冗長化構成など、まだまだ進化できます。
squidは便利なソフトウェアなので、自分でも構築できるようにしておきましょう。