R筋

プログラミングと時々育児

raspberry pi にHTTP/HTTPSプロキシサーバを構築する

三台目を購入

自粛のため、家でネットショッピングばかりしており、勢い余ってraspberry pi 4 model Bを買ってしまった。

これで今家にあるラズパイは全部で3台となった。一応、過去のラズパイはIOT機器として、毎日ちゃんと稼働しているので、決して無駄な買い物ではない。
1台目:
anpontan382.hatenablog.com

2台目:
anpontan382.hatenablog.com

今回は、今までのraspberry pi zeroと比べるとメモリで言えば、8倍(512MB→4GB)というハイスペックマイコンであるため、もう少し高度な使い方をしてみたい。
ということで、とりあえず勉強も兼ねて、プロキシサーバとして稼働させることにした。
家庭で(というか僕の環境で)プロキシを利用するメリットは以下が挙げられるだろう。

・ネット通信量の削減
前述の通り、最近は自粛や在宅勤務といった事情で、自宅に籠もりネットばかりしているため、wimax環境の僕はすぐに10GB/3日の制限に達し、低速インターネッツを余儀なくされている。そのため、プロキシサーバの持つキャッシュ機能により、一度みたことのあるページはわざわざ再度、同じ通信をせずとも表示させることができる。

アクセスログから、妻のネット通信を覗き見る
我が家は、私のPC・スマホ、妻のPC・スマホ、の4台がwifiに接続されている。これらをすべてプロキシ経由にすることで、すべてのネット接続はプロキシ経由になるためaccess.logにいつ誰がどのページにアクセスしていたのか丸見えとなり、弱みを握ることが可能となる。

・勉強になる
以前DNSサーバを作ったときにも書いたが、プロキシサーバを作るということは、それはその道程において、普段のネット接続で意識することのないプロキシサーバに感謝するという行為である。
anpontan382.hatenablog.com

そういうわけで、raspberry pi 4にsquidを入れて、設定を行ってみることにする。

サーバ設定

プロキシサーバソフトsquidをインストールする。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install squid -y

プロキシサーバの設定をする

基本的にすべての設定は「/etc/squid/squid.conf」で行う。
今回最小限の必要な変更のみだが、squid.confのデフォルト設定に従って
変更した箇所の変更前↔変更後を記述する。

①ローカルネットワークの定義

#デフォルト
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
#カスタマイズ
#自分が使っているLANのネットワーク範囲を記載する。
#僕の家はLAN内部が192.168.100.XXXである。
acl localnet src 192.168.100.0/24

②許可ポートの定義

#デフォルト
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
#カスタマイズ
#ホワイトリストプロキシの場合、接続を許可するポートを記載する。
#いらなそうなものはコメントアウトした。
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 1025-65535	# unregistered ports
#SSL通信時のCONNECTメソッドはトンネル化して通す
acl CONNECT method CONNECT

③許可ポートに対する制御

#デフォルト
http_access deny !Safe_ports
#カスタマイズ
#Safe_portsで定義したポート以外のアクセスを拒否する定義
#変更無し
http_access deny !Safe_ports

④許可メソッドに対する定義

#デフォルト
http_access deny CONNECT !SSL_ports
#カスタマイズ
#SSL_portsで定義したポート以外のコネクト接続を拒否する定義
#変更無し
http_access deny !Safe_ports

⑤キャッシュマネージャ関連

#デフォルト
http_access allow localhost manager
http_access deny manager
#カスタマイズ
#キャッシュマネージャ(squidの統計情報をCGIで見れる機能)へは
#ローカルホストのみがアクセスできるという設定
#使わないので削除
#http_access allow localhost manager
#http_access deny manager

⑥接続元の制御、その他の制御

#デフォルト
include /etc/squid/conf.d/*
http_access allow localhost
http_access deny all
#カスタマイズ
#追加でオリジナルルールを追加するときは、以下に記載する
#今は何もなし
include /etc/squid/conf.d/*
#ローカルホスト、localnetからのHTTPアクセスを許可する
http_access allow localhost
http_access allow localnet
#ここまで、どの定義にも該当しなかった通信はすべて拒否する
http_access deny all

⑦プロキシとの通信ポート

#デフォルト
http_port 3128
#カスタマイズ
#クライアント↔プロキシサーバ間の通信を行うポート
#8080などもよく使われるが、セキュリティ的には変更したほうが良い
http_port 3129

⑧キャッシュの保存量に関する定義

#デフォルト
# cache_dir ufs /var/spool/squid 100 16 256
# cache_mem 256 MB
# maximum_object_size_in_memory 512 KB
#カスタマイズ
#キャッシュサーバと利用するときに、キャッシュデータを置く場所
#数字は、左からキャッシュで使用する容量(MB)、ディレクトリを分割するサブディレクトリ数、サブディレクトリを分割する数
cache_dir ufs /var/spool/squid 100 16 256
#キャッシュのメモリサイズを指定
cache_mem 256 MB
#メモリ内に保存できるキャッシュの最大を指定
maximum_object_size_in_memory 512 KB

⑨X-Forwarded-Forヘッダーのセキュリティ対策

#デフォルト
# forwarded_for on
#カスタマイズ
#接続元のIPアドレスの情報をHTTPヘッダ上で隠す
forwarded_for off

⑩コアダンプ関連

#デフォルト
coredump_dir /var/spool/squid
#カスタマイズ
#コアダンプファイルの出力先
#変更なし
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 .		0	20%	4320
#カスタマイズ
#キャッシュの保存期間
#基本はデフォルトのままにしておく、gopherはいらなそうなので削除した
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

⑫再起動

sudo systemctl restart squid

クライアント設定

・windows10のプロキシ設定
「プロキシの設定を変更する」→「プロキシサーバを使う」
アドレス:raspberry pi IPアドレスを記載
ポート:squid.confのhttp_portで指定したポート番号を記載
f:id:anpontan382:20200422000745j:plain

・InternetExplorerの設定
IE→設定→インターネットオプション→接続→「LANの設定」
→「LANにプロキシサーバを使用する」→上記と同様にアドレス・ポートを指定
f:id:anpontan382:20200422000856j:plain

確認

・この状態で普通にWEBサイトが見れるなら、とりあえず動いている。

・「/var/log/squid/access.log」を開いてみると、時間、アクセス先、ポート、メソッドがわかる。

1587304260.711   5780 192.168.100.XXX TCP_TUNNEL/200 15658 CONNECT anpontan382.hatenablog.com:443 - HIER_DIRECT/13.230.115.161

・キャッシュが取れているかを調べるには、squidclientというsquidの挙動を確認するソフトを使う。

sudo apt install squidclient
squidclient -h localhost -p 3129 mgr:client_list
squidclient -h localhost -p 3129 mgr:info

のコマンドにより、キャッシュの利用料、利用率等様々なステータスが確認できる。

・X-Forwarded-Forヘッダーの隠蔽ができているかは、以下にアクセスするとわかる。
tools.up2a.info
unknownが表示されている。
f:id:anpontan382:20200422000808j:plain