Azureの仮想マシンでプロキシサーバーを構築してみました。
今回は Ubuntu 18.04 と squid を利用して構築しました。
Azure仮想マシンの作成
Azure CLIを利用して作成します。
以下の記事で仮想マシンに必要となるリソース含めたAzure CLIの作成コマンドを記載しているので参考にしてください。
squidの設定
squidのインストール
sshでUbuntuにログインしたら以下のコマンドを入力してSquidをインストールします。
#パッケージ一覧を更新
sudo apt update
#squidをインストール
sudo apt -y install squid
squid.confの設定
インストールが完了したら、squidの設定を確認します。
設定ファイルは /etc/squid/squid.conf です。
sudo cat /etc/squid/squid.conf | grep -v ^# | grep -v ^$
上記では、コメントアウトや空行を削除してファイルを表示させています。
実行結果としては以下のように表示されるかと思います。
●デフォルトの設定
xxxxxx@VM-test-proxy:~$ sudo cat /etc/squid/squid.conf | grep -v ^# | grep -v ^$
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
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
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 (Release|Packages(.gz)*)$ 0 20% 2880
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コマンドについては以下の記事にもまとめていますので参考にしてください。
今回は、デフォルトの設定に以下の点も修正を加えます。
- 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
設定変更後は以下のコマンドでsquidサービスを再起動します。
sudo systemctl restart squid
上記 squid を利用してみる
上記の設定のプロキシを利用させます。
今回は異なる仮想ネットワーク上にある仮想マシン(クライアント端末)からピアリングして、このプロキシを指定して通信をさせます。
今回利用するクライアント端末はwindowsなので、設定からプロキシを指定します。
その後、ブラウザでyahoo.co.jpに接続して、squidのアクセスログを確認します。
アクセスログは「/var/log/squid/access.log」にありますので、 grep と tail を利用して、 [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
1676862883.898 121300 10.1.0.6 TCP_TUNNEL/200 28061 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/182.22.28.252 -
1676862884.058 120391 10.1.0.6 TCP_TUNNEL/200 727 CONNECT b95.yahoo.co.jp:443 - HIER_DIRECT/183.79.249.124 -
1676862884.541 120948 10.1.0.6 TCP_TUNNEL/200 1058 CONNECT pushlist-yjapp.yahoo.co.jp:443 - HIER_DIRECT/183.79.217.124 -
1676862886.238 122306 10.1.0.6 TCP_TUNNEL/200 1453 CONNECT pm.yahoo.co.jp:443 - HIER_DIRECT/182.22.24.252 -
1676862886.286 122664 10.1.0.6 TCP_TUNNEL/200 64489 CONNECT yads.yjtag.yahoo.co.jp:443 - HIER_DIRECT/182.22.24.124 -
1676862886.611 123464 10.1.0.6 TCP_TUNNEL/200 937 CONNECT dsb.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
1676862887.338 124203 10.1.0.6 TCP_TUNNEL/200 1178 CONNECT clb.yahoo.co.jp:443 - HIER_DIRECT/183.79.250.123 -
1676865900.087 228526 10.1.0.6 TCP_TUNNEL/200 9542 CONNECT dsb.yahoo.co.jp:443 - HIER_DIRECT/183.79.250.251 -
1676865925.383 1961 10.1.0.6 TCP_TUNNEL/200 8002 CONNECT logql.yahoo.co.jp:443 - HIER_DIRECT/183.79.217.124 -
1676865925.688 2265 10.1.0.6 TCP_TUNNEL/200 8002 CONNECT ybx-test.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.124 -
xxxxxx@VM-test-proxy:~$
ログが吐き出されていることが分かり、今回送信元の仮想マシンのIPは [10.1.0.6] なのでその仮想マシンからの通信であることも分かります。
Whitelistの設定
次に squid で whitelist 機能を試してみます。
/etc/squid/ に whitelistファイルを追加
まず、/etc/squid/ に whitelistファイルを追加します。
sudo touch /etc/squid/whitelist
whitelsitファイルには以下の1行を追加します。
viコマンドなどを利用して追加してください。
.yahoo.co.jp
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
その後、「sudo systemctl restart squid」でサービスを再起動します。
疎通確認
yahoo.co.jp へは表示が崩れているもののアクセスできていますが、一方で google.com へはアクセスできません。
なので、whitelistが正常に機能していることが確認できます。
・yahoo.co.jp はアクセス可能
・google.com はアクセス不可能
Blacklistの設定
次に squid で blacklist 機能を試してみます。
/etc/squid/ に blacklistファイルを追加
まず、/etc/squid/ に blacklistファイルを追加します。
sudo touch /etc/squid/blacklist
blacklsitファイルには以下の1行を追加します。
viコマンドなどを利用して追加してください。
.yahoo.co.jp
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
その後、「sudo systemctl restart squid」でサービスを再起動します。
疎通確認
yahoo.co.jp へはアクセスできませんが、 google.com へはアクセスでき、blacklistが正常に機能していることが確認できます。
・yahoo.co.jp はアクセス不可能
・google.com はアクセス可能
[参考] 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での制御で十分なのではないかと思います。