お金をかけずにサーバーの勉強をしよう

squidインストール

2022年11月11日

メニューへ戻る

Ubuntu Server 22.04.1に プロキシサーバーの squidをインストールしてインターネットプロキシを作ります。

こんにちは。

普段自宅でインターネットを使っている限りではインターネットプロキシなんて無用の長物なんですが、子供が大きくなってくると「インターネットでいかがわしい物を見ていないだろうな」と疑心暗鬼になってきます。

スマホやPCで閲覧制限をかけることはできるかも知れませんが、中々完全にはなりません。

そこでインターネットプロキシを構成して「詳細なアクセスログを取っている」旨を伝えて心理的な牽制を加え、かつ、定期的に実際にサンプリングをして更なる圧迫を…。

前置きが長くなりましたが、古来よりある squid(スクウィッド:いか)でインターネットプロキシサーバーを作ろうと思います。

本家サイトはこちら。
squid-cache.org


1.プロキシサーバーとは

「そもそもプロキシサーバーって何のために使うの?」というのが初心者には普通の感覚かと思いますのでちょっと説明を。

家庭でインターネットを例としてとりますが、ネットワーク的には殆どこんな構成になっていると思います。
各PCや各スマホからインターネットを使い放題状態です。
構成図 1

ですけど、上に書いた例(いかがわしいサイトとか)のように閲覧できる内容に制限をかけたい事があります。

特に企業では、怪しいサイトからウィルスを拾ってくるとか、それによって内部の情報がインターネットに漏れる、そういった事故を防ぎたい思惑があります。

そのため、業務に関係のないサイトにはアクセスさせない対策をとりたいのですね。

ここで利用されるのがプロキシサーバーです。
ネットワーク上ではクライアントとインターネットの間に配置します。
構成図 2

「プロキシ」っていうのは「代理」[代行」って意味です。
以下の仕組みは肝ですので、是非ここでこのコンセプトを覚えておいて欲しいです。

インターネットにアクセスするようでいて、クライアントPCが通信する相手はあくまでプロキシサーバーになります。
その通信を受け取ったプロキシサーバーが「代わりに」インターネットアクセスをして、得た結果をクライアントPCに返してくれるのです。 構成図 3

インターネットにアクセスしている実体はクライアントPCではなくプロキシサーバーである

これを頭に叩き込んでおいてください。

この仕組みのため、ファイアウォール(FW)を使って、このようにネットワークを分断することができるのです。
構成図 4

この結果、クライアントPCから直接インターネットに接続することはできなくなり、セキュリティ面で一つ高い状態を作ることができます。

また全てのインターネットアクセスをプロキシサーバー経由で行うことをクライアントPCに強制することで、閲覧先の制限・検閲ができるようになります。
クライアントPCの利用者には制限がかかる方向なのであまりメリットが無いですが、管理する側には大変大きなメリットとなります。

そういう訳で、企業ではまず導入している仕組みですから、覚えておいて損は無いですね。


2.環境

Ubuntu Server 22.04.1を使います。

Ubuntuでのインストールについてはこちらにあります。
Squid on Ubuntu

2022年11月11日時点で squidの最新バージョンは 5.7 ですが、ソース配布だけでパッケージではありません。

パッケージでインストールしたいので Ubuntuの spanリポジトリ・aptリポジトリにあるものは何か調べてみます。

subro@UbuntuServer2204:~$ snap search squid-gary
Name        Version  Publisher  Notes  Summary
squid-gary  0.3      garywzl77  -      Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more.

subro@UbuntuServer2204:~$ apt search squid
〜〜〜 略 〜〜〜
squid/jammy-updates,jammy-security 5.2-1ubuntu4.2 amd64
  Full featured Web Proxy cache (HTTP proxy GnuTLS flavour)
〜〜〜 略 〜〜〜

snapの [squid-gary] って何者かよく分かりませんね…。
aptの方は 5.2でちょっと古いですが、これを入れますか。

では上の手順にある通りにやっていきましょう。

手順でのインストールには aptの拡張版である aptitudeコマンド(パッケージマネージャの高レベルインタフェース)を使っています。
aptでもインストールできますが手順に従うことにして、これをインストールします。

subro@UbuntuServer2204:~$ sudo apt install -y aptitude
〜〜〜 省略 〜〜〜

特に問題なくインストールできました。

squidをインストールします。

subro@UbuntuServer2204:~$ sudo aptitude install -y squid
以下の新規パッケージがインストールされます:
  libdbi-perl{a} libecap3{a} libtdb1{a} squid squid-common{a} squid-langpack{a} ssl-cert{a}
以下のパッケージが削除されます:
  libflashrom1{u} libftdi1-2{u}

〜〜〜 中略 〜〜〜

No VM guests are running outdated hypervisor (qemu) binaries on this host.

インストールできました。

これで既に squidは立ち上がっているのでプロセスの様子を見てみますと、[root]ユーザーでメインプロセスが動いていて、専用の [proxy]ユーザーで子プロセスが、その子プロセスでロギングプロセスが動いているようです。
負荷が高まってくると、子プロセスが増えていくパターンのソフトかも知れません。

subro@UbuntuServer2204:~$ ps -ef | grep squid
root        3360       1  0 09:38 ?        00:00:00 /usr/sbin/squid --foreground -sYC
proxy       3363    3360  0 09:38 ?        00:00:00 (squid-1) --kid squid-1 --foreground -sYC
proxy       3365    3363  0 09:38 ?        00:00:00 (logfile-daemon) /var/log/squid/access.log
subro       3438    1441  0 09:42 pts/0    00:00:00 grep --color=auto squid

設定ファイルは [/etc/squid/squid.conf]ファイルです。
コメント行で詳細な説明が書いてあって非常に長いので、有効になっている行だけ表示してみました。

subro@UbuntuServer2204:~$ cat /etc/squid/squid.conf | grep -v '^#' | sed -e '/^$/d'
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
include /etc/squid/conf.d/*.conf
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 \/(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

とりあえずこれで動きはします。

ファイル中にはコメント行で細かく書かれていますので、色々制限する場合は、コメントを読んで上の行をコメントアウトすることになるかと思います。


3.WEBブラウザのプロキシ利用設定

どんな WEBブラウザにもこの設定箇所があるはずです。
企業では Windows Active Directory(AD)の機能によって Edgeに自動設定することが多いでしょう。

この実験では私が秘密のアクセスをするための仮想OSである Debian11、そこにある Firefoxを使います。

Firefoxを立ち上げたら、画面右上のハンバーガーメニューをクリックし、出てきたメニューから[設定]を選択します。
Firefoxのプロキシ利用設定 1

一番下までスクロースすると[ネットワーク設定]がありますので、接続設定を押します。
Firefoxのプロキシ利用設定 2

赤枠の中に皆さんの環境に沿って設定をします。
squidのデフォルトポートは [3128/tcp] になります。
Firefoxのプロキシ利用設定 3

設定完了です。

Yahooジャパンにアクセスしてみました。
ちゃんと制限がかかっています。
squid(プロキシ)を使っていますね。
Firefoxのプロキシ利用設定 4


4.squid設定変更(通信許可)

上のテストでは squidによってインターネットアクセスを拒否られてしまいましたので、これを解除します。

再び squidの設定ファイル [/etc/squid/squid.conf] です。

関連の箇所はここで、アクセスがあると上から順々に評価されていきますが、ここで [allow] と定義されている中に、Debian11の仮想OSが入ってないのです。

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
include /etc/squid/conf.d/*.conf
http_access allow localhost
http_access deny all

私の家のネットワークは [192.168.1.0/24] なんで、[/etc/squid/squid.conf]ファイルの上の方の [localnet] というグループ設定に含まれています。

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

ですので [allow] の対象に [localnet] を加えれば良いわけです。
[allow localhost]行 の上に 1行追加します。

http_access allow localhost
  ↓
http_access allow localnet
http_access allow localhost

変更したら squidを再起動します。

subro@UbuntuServer2204:~$ sudo systemctl restart squid

再起動できました。

改めて Yahooジャパンにアクセスすると今度はちゃんと表示されました。
Yahoo

アクセスログを見てみます。
[/var/log/squid/access_log]ファイルですが、[root]ユーザーじゃないと見られません。
プライバシーにも関わるのでこうなってるのですかね。

こんなフォーマットになっています。

1668129867.211      0 192.168.1.106 TCP_DENIED/403 4082 CONNECT contile-images.services.mozilla.com:443 - HIER_NONE/- text/html
1668129867.213      0 192.168.1.106 TCP_DENIED/403 4082 CONNECT contile-images.services.mozilla.com:443 - HIER_NONE/- text/html
1668129879.008      0 192.168.1.106 TCP_DENIED/403 4019 CONNECT www.google.com:443 - HIER_NONE/- text/html
1668129892.705      0 192.168.1.106 TCP_DENIED/403 4227 GET http://www.yahoo.co.jp/ - HIER_NONE/- text/html

多分最初の数字が日時です。
これじゃ分かり辛いので、Apache Httpサーバーのアクセスログに似た形に変えてみます。

squidはデフォルトで [combined] というログフォーマット設定を持っているので、それを [/var/log/squid/access.log]ファイルに適用します。

[/etc/squid/squid.conf]ファイルに以下の 1行を追加します。

access_log /var/log/squid/access.log combined

変更したら squidを再起動します。

subro@UbuntuServer2204:~$ sudo systemctl restart squid

その結果 [access.log]ファイルはこんな風になりました。

192.168.1.106 - - [11/Nov/2022:15:05:59 +0900] "CONNECT www.googletagservices.com:443 HTTP/1.1" 200 39 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0" TCP_TUNNEL:HIER_DIRECT
192.168.1.106 - - [11/Nov/2022:15:06:00 +0900] "POST http://ocsp.pki.goog/gts1c3 HTTP/1.1" 200 851 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0" TCP_MISS:HIER_DIRECT

こちらの方が分かりやすいと思います。

これで怪しげなアクセスがないか分かるようになりました。


5.squid設定変更(通信拒否)

しかし怪しげなアクセスが分かっただけでは意味がないので、これをできないようにしてしまいましょう。

制限手法は大まかに 2通りです。

ブラックリストがやりやすいと思いますので、こちらで。

[/etc/squid/squid.conf]ファイルに設定追加しますが、書く位置には意味がありますので、allowや denyを書いてあるところの一番上(一番最初に評価される)にしておきます。
以下の 1行を追加します。

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
 ↓
acl blacklist dstdomain "/etc/squid/blacklist"
http_access deny blacklist
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

アクセス先が [/etc/squid/blacklist]ファイルに書いてある場合はアクセスを拒否する設定です。

設定を再読み込ませさせます。
(reloadだと上手く行きませんでした)

subro@UbuntuServer2204:~$ sudo systemctl restart squid


さて、アクセスログ [/var/log/squid/access.log]ファイルにこのような行が記録されていたとします。

192.168.1.106 - - [11/Nov/2022:16:02:37 +0900] "CONNECT jp.xhamster.com:443 HTTP/1.1" 403 4022 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0" TCP_DENIED:HIER_NONE

試しにWEBブラウザを使って [p.xhamster.com] に実際にアクセスしてみるとこんな叡智なサイトのようです!!
何とイカガワシイのでしょうか。
xhamster

これは看過できないので、ブラックリスト [/etc/squid/blacklist]ファイルに記載します。

subro@UbuntuServer2204:~$ sudo cat /etc/squid/blacklist
.xhamster.com

ドットで始めるとサブドメインを全て含みます。
どうせ [xhamster.com] 以下は多言語対応で全部カットした方が良いのでしょうから、あまりドメインを細かく具体的に限定しないようにします。

設定を再読み込ませさせます。

subro@UbuntuServer2204:~$ sudo systemctl restart squid

この後から同サイトにアクセスするとこれになりました。
拒否された絵

一方で健全なサイトには相変わらずアクセスできるのでした。
Yahoo


6.ルーターによるインターネットアクセス元IPアドレス制限

インターネットプロキシを置いただけではプロキシを回避してインターネットに繋がれてしまいますので、光ルーターや Wifiルーターで、[80/tcp(http)]・[443/tcp(https)]につき、プロキシサーバーの IPアドレス以外からのアクセスを拒否するようにしましょう。

企業ではファイアウォールの設定になるかも知れません。

我が家の光ルーターにはこんな設定画面があり、ここでやれます。
ルーターの画面

大事なのは大黒柱であるお父さんの PCの IPアドレスまで拒否しないことです。
なお、家族には相当にうっとおしがられると思います。


7.インターネットアクセス制限の思想

家庭での検閲においてはおちゃらけ運用で OKですが、企業ではガチです。

スチャラカ社員が仕事中に何を見ているかが分かりますので懲戒の証拠などに利用しましょう。

概ね以下の 3つをチェックしておけば良いと思いますね。

A.叡智なところ
問答無用でカットで良いと思います。
ただ社員が若く猛っている場合、トラブルになるかも知れません。

B.投資なところ
市場はリアルタイムに動くので、トイレにこもってやっている場合があります。
(まぁ普通は自分のスマホでやりますが。)
ただこれをカットして大損コかせると、恨まれて刺されるかも知れません。

C.転職なところ
カットはせずログを拾って人事に任せるようにした方が良いでしょう。
あからさまに転職サイトをカットしていると、却って辞める気持ちを後押ししてしまうかも知れません。


==========
インターネットプロキシサーバーは比較的簡単に作れる割に、企業ユースのレベルまで自宅で検証できます。

でも昨今では業務にインターネットが必須であり、それはすなわちインターネットプロキシが常時動くのが当たり前なことを意味します。
本気で作る場合は、耐障害性を高めるために冗長化が必須です。

また、多数の社員のインターネットアクセスが集中するサーバーでもあるのでマシンパワーが必要なんですが、まず 1台では賄いきれません。

そこでサーバーをスケールアウト(台数を増やす)してロードバランサーを使うので、実際の構成はもっと複雑になってきます。

全て家で作れますので、大変お勉強になります。
是非チャレンジしてみてください。

squidではここでは紹介しきれない機能が色々ありますので、気に入った方はオフィシャルのドキュメントを参照してみて下さい。


残念ながらプロキシサーバーの本は新しいのが全くと言って良い程ありません。
オフィシャルドキュメントと、他インターネット上の情報を拾っていくしかなさそうです。