🏫

学校のWebフィルタリングの仕組みとその解除方法

2023/10/22に公開

こんにちは。
学校のWebフィルタリングの仕組みと、その解除方法について説明しようと思います。

なにを説明するか

ここでの「Webフィルタリング」とは、自動プロキシ構成ファイルproxy.pacを用いたフィルタリングのことを指します。
また、iPadを用いています。

ここに書いてあることが当てはまらない場合もあります。

対象読者

  • 学校のフィルタリングの仕組みが気になる人
  • 学校のフィルタリングを解除してみたい人
  • 学校のフィルタリングが解除されないように対策したい人

また、以下の知識があるとわかりやすいと思います。

  • プロキシ自動設定ファイル
  • プロキシ
  • DNS
  • Linux
  • IP

フィルタリングの仕組み

フィルタリングの仕組みを解説します。

プロキシで排除する

一般的なWebフィルタリングは、フィルタリング運営のプロキシを通すことで排除しています。

以下の図がわかりやすいと思います。(わかりやすく作ったので)
図

通常時には、普通にiPadとウェブサイトがインターネットを通じて直接通信します。

  • ユーザー「https://abunai-site.com/の内容ください!」
  • iPad(https://abunai-site.com/にアクセスします...)
  • ウェブサイト「はいよ、htmlどうぞ」

って感じです。

フィルタリング時には、「フィルタリングプロキシ(仮称)」を通してアクセスします。
直接ではなく、フィルタリングプロキシという代行屋さんを通します。

  • ユーザー「https://abunai-site.com/の内容ください!」
  • iPad(フィルタリングプロキシ、filter.com:443https://abunai-site.com/に代わりにアクセスしてもらおう!)
  • フィルタリングプロキシ「ふむむ。https://abunai-site.com/にアクセスしてほしいのか。
    なるほど。アクセスしてやろう... ん?
    https://abunai-site.com/は有害なサイトだ!ブロックしなければ!
    かわりに代行結果としてブロックページをiPadに渡すぞ!」
  • iPad(何も知らずに「ブロックされました」ページを渡す)
  • ユーザー「わー、ブロックされちゃったー」

って感じです。プロキシは「代行屋」です。代わりにウェブサイトにアクセスしてあげます。
この場合、プロキシはURLを判断して、有害なサイトならブロックする、有害でなければ正常に代行してあげます。

このような仕組みで成り立っています。

プロキシはどうやって設定するの?

プロキシは、プロキシ自動設定ファイル(*.pac)によって構成されることがほとんどです。

プロキシ自動設定ファイルは、プロキシを自動で設定するプログラムを基準するファイルです。

以下の感じに通信しています。(さっきの図の詳細版的なのです)
図2

プロキシ自動設定ファイルには、プロキシのリンクが含まれています。そのリンクにそって、フィルタリングプロキシを設定していくのです。
この例の場合、iPadに標準でhttp://school-filter.com/proxy.pacを使えと指示されているのです。

逆に言えば、このproxy.pacを偽造すればフィルタリングが解除できちゃう、というわけなのです。

Tips: proxy.pacの探し方(iPad)

設定から、一般を開き、VPNとデバイス管理を押します、
IMG_1935
そこにある、モバイルデバイス管理の一項目を開きます。

その中からいろいろ見て探してください。

私の場合は、その中の学校の標準Wifiの箇所にありました。

フィルタリングを解除する

さあ、多分待ち望んでいたであろうことを解説します。

「プロキシはどうやって設定するの?」で解説したとおり、proxy.pacを偽造すればいいのです。
できるの?って思うかもしれません。それができるんです!

方法

方法としては、DNSサーバーをたてます。
DNSサーバーをたてて、上の例でのフィルタリング自動設定ファイルのドメインschool-filter.comのIPアドレスを変えるのです。

正常時には、以下の図のようにproxy.pacを取得しています。
無題の図形描画 3

偽造すると、以下の図のようになります。
無題の図形描画 4

このように、偽造したproxy.pacをiPadに送信して読み込ませることによってフィルタリングを解除します。

proxy.pacにはもちろんフィルタリングプロキシを通さない設定をしています。

環境

ここでは、以下の環境を用いています。しかし、他の環境でも動くかもしれません。

  • DNSサーバー用
    • Raspberry Pi 400
    • Raspberry Pi OS

DNSサーバーをたてる

DNSサーバーのツールとして、dnsmasqを使います。
まず、インストールしましょう。

sudo apt install dnsmasq

いつもの感じですね。

すると、/etc/dnsmasq.confにコンフィグファイルができるはずなので、編集しましょう。
まず、念のためバックアップをとっておきましょう。

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.back

では、編集します。

以下の内容に書き換えましょう。

# 自分でもよくわかってない
domain-needed
bogus-priv

# サーバーが解決できなかった時に頼る親DNSサーバ
# ここではGoogle DNS
server=8.8.8.8
server=8.8.4.4

# 名前解決
local=/school-filter.com/ # proxy.pacがあるドメイン
address=/school-filter.com/192.168.2.133 # サーバのアドレス(偽造先)

のようにします。ここでは、school-filter.comにアクセスしたときに192.168.2.133が表示されるようにします。

設定が完了したので、スタートしましょう。
dnsmasqは53番ポートを使うので、BINDが起動している場合は競合しないようにオフにします。(少なくとも私はオフにしました。依存している可能性もあるので、慎重に)

systemctl disable named # 自動起動オフ
systemctl stop named # ストップ

さあ、起動します。

systemctl enable dnsmasq # ラズパイの電源起動時に自動で開始
systemctl restart named # リスタート

エラーが出なければ、これで起動しました!

DNSサーバーを設定する

サーバーで、ifconfigを使い、IPアドレスを取得しましょう。
そのIPアドレスを、iPadの

  • 設定 → Wifi → {SSID} → DNSを構成

をオンにして、入力すればOKです。

しかし、うまくいかない場合があります。ネットに繋がらなかったり...
その場合は、ifconfigのときに出たIPv4アドレスだけでなく、IPv6アドレスも一緒にiPadに入力してあげればうまくいきます。(うまくいきました)

偽造サーバを作成する

proxy.pacの偽造サーバーを作ります。これは超簡単です。

proxy.pacにアクセスされたとき、

function FindProxyForURL(url, host) {
  return "DIRECT"
}

と返せば良いだけです。
中身はFindProxyForURLというJavaScriptの関数になっていて、リクエストが飛ぶたびに実行されます。
urlhostを受け取り、どのような挙動をするかを返します。

返り値は、だいたいこんな感じです(実際もっとあります)

  • DIRECT リクエストはプロキシを介さずに、直接行われます。
  • PROXY {host:port} 指定されたプロキシーを使用します。
  • SOCKS {host:port} 指定されたSOCKSサーバーを使用する

このコードでは常にreturn "DIRECT"しているので、常にプロキシサーバを使わないという意味です。つまりフィルタリングが解除されます。

私の場合、Denoで

Deno.serve({
  port: 80
}, () => new Response(`function FindProxyForURL(url, host) {
  return "DIRECT"
}`))

って書いて実行させました。
ハマりポイントとして、80番ポートはLinuxではsudoがないと動きません…

動作確認

試しに、proxy.pacにアクセスしてみてください。偽造されたはずです!

次に、ブロックされるはずのサイトにアクセスすると、回避されるはずです!

そしたら、おめでとうございます!🥳🎉🎉🎉
うまくいかなかったら、残念です😢😢😢

うまくいかなくて元々なんですけどね…w

注意

これらの作業はローカルで動かしているので、家の中じゃないと動かないと思います。

学校でもやって自慢したいって場合は、自分でトンネル作ったりして、外からDNSサーバーと偽造サーバーにアクセスできるようにしてください。

免責事項

ここに書いてあることについて、私は一切の責任を負いません。

GitHubで編集を提案

Discussion