Azure上にプロキシサーバーを構築してsquidを設定してみた

Azure VirtualMachine
この記事は約19分で読めます。

Azureの仮想マシンでプロキシサーバーを構築してみました。

OSはUbuntu 22.04 を、ソフトウェアには squid を利用してプロキシを設定してみました。

広告

1.プロキシサーバー用Azure仮想マシンの作成

Azure CLIを利用して作成します。

今回はプロキシの動作確認としてクライアント端末(WindowsOS)も利用するので合わせて作成するとよいです。

以下の記事で仮想マシンのAzure CLIの作成コマンドを記載しているので参考にしてください。
 ※2台作成するコマンドになっているので今回の構成を試すだけであれば楽に作成できると思います。

AzureCLIで仮想マシンを作成する
AzureCLIを利用して仮想マシンを作成してみました。仮想マシン一式を構築する機会が多いので簡単にAzureCLIのコマンドとしてまとめてみました。1.今回の構成今回のコマンドでは仮想マシン含む以下のリソースをAzureCLIで一括作成し...

2.squidの設定

2-1.squidのインストール

sshでUbuntuにログインしたら以下のコマンドを入力してSquidをインストールします。

 # パッケージ一覧を更新
sudo apt update

 # squidをインストール
sudo apt -y install squid

2-2.squid.confの設定

インストールが完了したら、squidの設定を確認します。
設定ファイルは /etc/squid/squid.conf です。

sudo cat /etc/squid/squid.conf | grep -v ^# | grep -v ^$

上記では、コメントアウトや空行を削除してファイルを表示させています。
実行結果としては以下のように表示されるかと思います。

・デフォルトのsquid.confの設定内容

xxxxxx@VM-test-proxy:~$ sudo cat /etc/squid/squid.conf | grep -v ^# | grep -v ^$
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
xxxxxx@VM-test-proxy:~$

デフォルトで配置されている squid.conf ファイルは約8000行あり、変更箇所までたどり着くのが難しいです。
なのでファイルのコピーを取ったうえで、必要な設定内容のみ上書き設定が楽です。

 # 設定ファイルのコピー
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf_old

 # 設定変更(viコマンドを利用)
sudo vi /etc/squid/squid.conf

viコマンドでは、コマンドモードで「:%d」を入力するとファイルの中身を全削除できます。その後、入力モードに移行してコンフィグの修正を行います。

viコマンドについては以下の記事にもまとめていますので参考にしてください。

【Linux】vi コマンドでよく利用するコマンド一覧
vi コマンドは linux 系の OS でファイルを編集するときに利用することが多いコマンドです。vi コマンドの中にもたくさんコマンドがありますが、今回は個人的に良く利用するコマンドをまとめてみました。

今回は、デフォルトの設定に以下の点も修正を加えます。

  • IPv4の設定を優先
  • 80,443以外の通信ポート設定を削除(=ポート80,443以外のhttp通信を拒否)
  • プライベートIPアドレス帯からの通信を許可
  • プライベートIPアドレス帯以外からの通信を拒否
  • プロキシの利用ポートを 8080 に変更
  • キャッシュを利用しない
  • キャッシュを利用しないので「refresh_pattern」設定を削除
  • ホスト名を隠す
  • プロキシの情報を隠す

設定完了後は以下のようになります。

 # IPv4の設定を優先
dns_v4_first on

 # ポート80,443以外のhttp通信を拒否
acl Safe_ports port 80          # http
acl Safe_ports port 443         # https
http_access deny !Safe_ports

 # httpsの場合、443以外のポートの通信を拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

 # プライベートIPアドレス帯の通信を許可
acl localnetwork src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
http_access allow localnetwork

 # プライベートIPアドレス帯以外からの通信を拒否
http_access deny !localnetwork

 # 上記で定義した許可通信以外はすべて拒否
http_access deny all

 # プロキシの利用ポート(デフォルトの値から変更)
http_port 8080

 # キャッシュを利用しない
no_cache deny all

 # コアファイルの格納する場所の指定(デフォルト設定から変更なし)
coredump_dir /var/spool/squid

 # ホスト名を隠す
visible_hostname unknown

 # プロキシ情報を隠す
forwarded_for off
request_header_access User-Agent deny all
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

 # ログフォーマットを変更して時間情報を出力する
logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log daemon:/var/log/squid/access.log timefm

設定変更後は以下のコマンドでsquidサービスを再起動します。

sudo systemctl restart squid

2-3.上記 squid を利用してみる(クライアント端末の設定)

クライアント端末側でプロキシを利用する設定を入れます。

クライアント端末のプロキシ設定画面

今回利用するクライアント端末はwindowsなので、[スタート] > [設定] > [ネットワークとインターネット] > [プロキシ] から上記のキャプチャのようにプロキシを指定します。

その後、ブラウザでyahoo.co.jpに接続して、squidのアクセスログを確認します。
アクセスログは「/var/log/squid/access.log」にありますので、 greptail を利用して、 [yahoo] を含むログの中で最終行10行のみを出力させます。

sudo cat /var/log/squid/access.log | grep yahoo | tail -n 10

・実行結果

xxxxxx@VM-test-proxy:~$ sudo cat /var/log/squid/access.log | grep yahoo | tail -n 10
2024/11/23 12:02:42 1732363362.334   3833 10.1.0.6 TCP_TUNNEL/200 11147 CONNECT apm.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
2024/11/23 12:02:42 1732363362.334   3947 10.1.0.6 TCP_TUNNEL/200 8623 CONNECT pushlist-yjapp.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
2024/11/23 12:02:42 1732363362.334   4655 10.1.0.6 TCP_TUNNEL/200 36266 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
2024/11/23 12:02:42 1732363362.334   3474 10.1.0.6 TCP_TUNNEL/200 8339 CONNECT ipi.yahoo.co.jp:443 - HIER_DIRECT/183.79.249.252 -
2024/11/23 12:02:42 1732363362.335   2437 10.1.0.6 TCP_TUNNEL/200 9217 CONNECT apm.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
2024/11/23 12:02:42 1732363362.335   4042 10.1.0.6 TCP_TUNNEL/200 8701 CONNECT dsb.yahoo.co.jp:443 - HIER_DIRECT/124.83.184.252 -
2024/11/23 12:02:42 1732363362.336   5500 10.1.0.6 TCP_TUNNEL/200 54053 CONNECT www.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
2024/11/23 12:02:42 1732363362.336   4215 10.1.0.6 TCP_TUNNEL/200 57548 CONNECT yads.yjtag.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.252 -
2024/11/23 12:02:42 1732363362.336   3754 10.1.0.6 TCP_TUNNEL/200 8804 CONNECT cksync.yahoo.co.jp:443 - HIER_DIRECT/182.22.31.252 -
2024/11/23 12:02:42 1732363362.336   4064 10.1.0.6 TCP_TUNNEL/200 8983 CONNECT clb.yahoo.co.jp:443 - HIER_DIRECT/124.83.185.252 -
xxxxxx@VM-test-proxy:~$

ログが吐き出されていることが分かり、今回送信元の仮想マシンのIPは [10.1.0.6] なのでその仮想マシンからの通信であることも分かります。

2-4. [参考]Whitelistの設定

次に squid で whitelist 機能を試してみます。

2-4-1. /etc/squid/ に whitelistファイルを追加

まず、/etc/squid/whitelistファイルを追加します。

sudo touch /etc/squid/whitelist

whitelsitファイルには以下の1行を追加します。
viコマンドなどを利用して追加してください。

.yahoo.co.jp

2-4-2. squid.conf ファイルにwhitelistの設定を追加

次に、squid.conf ファイルに以下の行を追加して whitelistの設定を追加します。
今回は yahoo.co.jp への通信のみを許可します。

記載する場所は「http_access deny all」の上に記載します。

 # Whitelist
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist

また、http_access allow localnetwork」があるとうまく動作しないのでコメントアウトして設定を無効化しておきます。

・Whitelist 追加後の squid.conf

 # IPv4の設定を優先
dns_v4_first on

 # ポート80,443以外のhttp通信を拒否
acl Safe_ports port 80          # http
acl Safe_ports port 443         # https
http_access deny !Safe_ports

 # httpsの場合、443以外のポートの通信を拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

 # プライベートIPアドレス帯の通信を許可
acl localnetwork src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
#http_access allow localnetwork  #設定を無効化

 # プライベートIPアドレス帯以外からの通信を拒否
http_access deny !localnetwork

 # Whitelistの設定
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist

 # 上記で定義した許可通信以外はすべて拒否
http_access deny all

 # プロキシの利用ポート(デフォルトの値から変更)
http_port 8080

 # キャッシュを利用しない
no_cache deny all

 # コアファイルの格納する場所の指定(デフォルト設定から変更なし)
coredump_dir /var/spool/squid

 # ホスト名を隠す
visible_hostname unknown

 # プロキシ情報を隠す
forwarded_for off
request_header_access User-Agent deny all
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

 # ログフォーマットを変更して時間情報を出力する
logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log daemon:/var/log/squid/access.log timefm

その後、

sudo systemctl restart squid

でサービスを再起動します。

2-5-3. 疎通確認(クライアント端末)

yahoo.co.jp へは表示が崩れているもののアクセスできていますが、一方で google.com へはアクセスできません。

なので、whitelistが正常に機能していることが確認できます。

yahoo.co.jp はアクセス可能

yahoo.co.jpへのアクセスは可能

google.com はアクセス不可能

google.comへのアクセスは不可能

2-5. [参考]Blacklistの設定

次に squid で blacklist 機能を試してみます。

2-5-1. /etc/squid/ に blacklistファイルを追加

まず、/etc/squid/blacklistファイルを追加します。

sudo touch /etc/squid/blacklist

blacklsitファイルには以下の1行を追加します。
viコマンドなどを利用して追加してください。

.yahoo.co.jp

2-5-2. squid.conf ファイルにblacklistの設定を追加

次に、squid.conf ファイルに以下の行を追加して blacklistの設定を追加します。
今回は yahoo.co.jp への通信のみを拒否します。

記載する場所は whitelist と異なり「http_access allow localnetwork」の上に記載します。
whitelistの設定時にはコメントアウトしていましたが、blacklistではコメントアウトしません。

 # Blacklist
acl blacklist dstdomain "/etc/squid/blacklist"
http_access deny blacklist

・追加後の squid.conf

 # IPv4の設定を優先
dns_v4_first on

 # ポート80,443以外のhttp通信を拒否
acl Safe_ports port 80          # http
acl Safe_ports port 443         # https
http_access deny !Safe_ports

 # httpsの場合、443以外のポートの通信を拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

 # Blacklistの設定
acl blacklist dstdomain "/etc/squid/blacklist"
http_access deny blacklist

 # プライベートIPアドレス帯の通信を許可
acl localnetwork src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
http_access allow localnetwork

 # プライベートIPアドレス帯以外からの通信を拒否
http_access deny !localnetwork

 # 上記で定義した許可通信以外はすべて拒否
http_access deny all

 # プロキシの利用ポート(デフォルトの値から変更)
http_port 8080

 # キャッシュを利用しない
no_cache deny all

 # コアファイルの格納する場所の指定(デフォルト設定から変更なし)
coredump_dir /var/spool/squid

 # ホスト名を隠す
visible_hostname unknown

 # プロキシ情報を隠す
forwarded_for off
request_header_access User-Agent deny all
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

 # ログフォーマットを変更して時間情報を出力する
logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log daemon:/var/log/squid/access.log timefm

その後、

sudo systemctl restart squid

でサービスを再起動します。

2-5-3. 疎通確認(クライアント端末)

yahoo.co.jp へはアクセスできませんが、 google.com へはアクセスでき、blacklistが正常に機能していることが確認できます。

yahoo.co.jp はアクセス不可能

yahoo.co.jpへのアクセスは不可能

google.com はアクセス可能

google.comへのアクセスは可能

3.[参考] IPの制御方法について

上記ではプロキシ内の設定ではプライベートIPアドレス帯からの通信はすべて許可しています。

 # プライベートIPアドレス帯の通信を許可
acl localnetwork src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
http_access allow localnetwork

これはAzure基盤上ではネットワーク セキュリティ グループ(NSG)と呼ばれるACL機能があるため、NSGで管理したほうが、2重管理にならず、Azureポータルから簡単に操作できるからです。

もし、OS内でもIP制御をかけたい場合にはその限りではないと思いますが、個人的にはNSGでの制御で十分なのではないかと思います。