【Squid講座 付録】日本語検索も完全ブロック!「アダルト・暴力・薬物」を遮断するURLエンコードフィルタリング術

「日本語」の壁を越えて、不適切な検索を許さない。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全8回のSquid講座、完走お疲れ様でした!

さて、日本の企業や学校でプロキシを運用していると、必ずぶつかる壁があります。
それは「日本語の検索キーワードがブロックできない問題」です。

コウ君

先生、困りました…。
前回教わったキーワードブロックで sex とか drug は止まるようになったんですが、日本語で「アダルト」とか「危険ドラッグ」って検索すると、すり抜けて表示されちゃうんです!
設定ファイルに日本語を書いたのに、効いてないみたいで…。

リナックス先生

それはね、Squidが悪いんじゃなくて「インターネットの仕組み」の問題よ。
ブラウザがURLを送信する時、日本語は「%E3%81…」みたいな記号に変換(エンコード)されているの。
だからSquidの設定ファイルに漢字で「暴力」って書いても、流れてくるデータと一致しないのよ。
今回は、この変換ルールを攻略して、日本語キーワードを完璧にブロックする方法を伝授するわ!

本記事では、日本国内の運用で必須となる「日本語キーワードフィルタリング」の実装方法を解説します。
URLエンコードの自動変換テクニックや、抜け穴を防ぐためのセーフサーチ強制設定まで、実務直結のノウハウです。


第1章:なぜ「日本語」でブロックできないのか?

Squidの設定ファイル(squid.conf)はUTF-8に対応していますが、問題は「流れてくるデータ」の方です。

URLエンコード(パーセントエンコーディング)の罠

例えば、あなたがブラウザで「暴力」と検索したとします。
ブラウザのアドレスバーには日本語で見えていますが、実際にサーバー(Squid)に送られているリクエストは以下のようになっています。

見た目:
https://www.google.com/search?q=暴力

実際の通信データ:
GET /search?q=%E6%9A%B4%E5%8A%9B ...

Squidの url_regex(正規表現フィルタ)は、この「実際の通信データ」に対してマッチングを行います。
そのため、ACLリストに「暴力」と書いても、%E6%9A%B4%E5%8A%9B とは一致せず、すり抜けてしまうのです。

対策:リスト側をエンコードする

解決策はシンプルです。
ブロックリストを作る際に、人間が読む日本語ではなく、機械が読むエンコード形式で記述すれば良いのです。


第2章:【準備】ブロックリストの作成と変換

それでは、「アダルト」「暴力」「薬物」に関する日本語キーワードリストを作成しましょう。
手動で変換するのは大変なので、Linuxのコマンドを使って自動変換します。

ステップ1:日本語でリストを作成(元データ)

まず、人間が編集しやすい日本語のリストを作ります。
/etc/squid/lists/source_adult_ja.txt とします。

sudo mkdir -p /etc/squid/lists
sudo nano /etc/squid/lists/source_adult_ja.txt

中身の例(1行1単語):

アダルト
エロ
出会い
風俗
ヌード
裏ビデオ
無修正

同様に、危険ワード用も作ります。

sudo nano /etc/squid/lists/source_danger_ja.txt

中身の例:

自殺
死にたい
殺害
爆弾
麻薬
覚醒剤
危険ドラッグ
闇バイト
大麻
暴力団

ステップ2:Pythonで一括変換(エンコード)

この日本語リストを、Squidが理解できる形式に変換します。
Linuxには標準でPythonが入っていることが多いので、ワンライナー(1行コマンド)で変換するのが一番早いです。

以下のコマンドを実行してください。

# アダルトリストの変換
sudo python3 -c "import sys, urllib.parse; print('\n'.join([urllib.parse.quote(line.strip()) for line in sys.stdin]))" < /etc/squid/lists/source_adult_ja.txt | sudo tee /etc/squid/lists/block_adult_encoded.txt

# 危険ワードリストの変換
sudo python3 -c "import sys, urllib.parse; print('\n'.join([urllib.parse.quote(line.strip()) for line in sys.stdin]))" < /etc/squid/lists/source_danger_ja.txt | sudo tee /etc/squid/lists/block_danger_encoded.txt

💡 何が起きた?

作成された block_adult_encoded.txt の中身を見てみましょう。

sudo cat /etc/squid/lists/block_adult_encoded.txt

結果:

%E3%82%A2%E3%83%80%E3%83%AB%E3%83%88
%E3%82%A8%E3%83%AD
%E5%87%BA%E4%BC%9A%E3%81%84
...

このように、全て「パーセントエンコーディング」された文字列に変換されました。
これでSquidが認識できるリストの完成です。


第3章:Squidへの設定と適用

作成したエンコード済みリストを、SquidのACLとして読み込みます。

squid.confの編集

sudo nano /etc/squid/squid.conf

以下の設定を追記します。
url_regex(正規表現)を使いますが、大文字小文字の区別はエンコード文字列には関係ないので -i オプションは不要です(あっても害はありません)。

# --- 日本語フィルタリング設定 ---

# エンコード済みリストの読み込み
acl jp_adult_words url_regex "/etc/squid/lists/block_adult_encoded.txt"
acl jp_danger_words url_regex "/etc/squid/lists/block_danger_encoded.txt"

# 英語の禁止ワード(そのまま記述)も併用する場合
# acl en_adult_words url_regex -i adult sex porn

# ブロックの適用
http_access deny jp_adult_words
http_access deny jp_danger_words
# http_access deny en_adult_words

# --- 設定ここまで ---

再起動とテスト

sudo systemctl reload squid

ブラウザでGoogleを開き、「アダルト」や「危険ドラッグ」で検索してみてください。
検索ボタンを押した瞬間、Squidの「Access Denied」画面が表示されれば成功です!


第4章:キーワードの抜け穴を塞ぐ「セーフサーチ強制」

キーワードブロックは強力ですが、完璧ではありません。
例えば「水着」という単語自体はブロックしたくないけれど、画像検索で過激な画像が出るのは防ぎたい、といったケースです。

ここで、検索エンジン(Google/Bing)の機能である「セーフサーチ(SafeSearch)」を強制的にオンにする設定を併用します。

仕組み:DNSリライト

ユーザーが www.google.com にアクセスしようとした時、Squid側でこっそり「セーフサーチ強制用のサーバー(VIP)」に接続先を書き換えます。
これには /etc/hosts を使うのが最も手軽で確実です。

設定手順

Squidサーバーの /etc/hosts を編集します。

sudo nano /etc/hosts

ファイルの末尾に以下を追記します。
※IPアドレスはGoogle等が提供している固定のものです。

# Google SafeSearch VIP
216.239.38.120  www.google.com
216.239.38.120  www.google.co.jp
216.239.38.120  google.com
216.239.38.120  google.co.jp

# Bing SafeSearch VIP
204.79.197.220  www.bing.com

編集後、Squidを再起動します。

sudo systemctl restart squid

効果の確認

クライアントPCからGoogleで適当な単語を検索してください。
検索結果の右上に「セーフサーチ」という表示があり、鍵マークが付いていてオフにできない状態になっていれば成功です。
これで、キーワードブロックをすり抜けた際どい画像なども、検索エンジンのAIが自動的に排除してくれます。


第5章:運用上の注意とメンテナンス

日本語フィルタリングを運用する上でのポイントです。

1. リストの更新方法

新しい隠語や流行りの言葉が出てきたら、ブロックリストを更新する必要があります。
運用フローは以下のようになります。

  1. source_adult_ja.txt (日本語の元ファイル)に追記する。
  2. Pythonコマンドを実行して、block_adult_encoded.txt を再生成する。
  3. sudo systemctl reload squid で反映する。

これをシェルスクリプトにしておくと便利です。

#!/bin/bash
# update_blocklist.sh

# 変換
python3 -c "import sys, urllib.parse; print('\n'.join([urllib.parse.quote(line.strip()) for line in sys.stdin]))" < /etc/squid/lists/source_adult_ja.txt > /etc/squid/lists/block_adult_encoded.txt

# 反映
systemctl reload squid
echo "Blocklist updated."

2. 過剰ブロック(誤検知)への対応

例えば「麻薬」をブロックすると、「麻薬探知犬のニュース」や「麻薬取締官の採用情報」まで見られなくなります。
短い単語(2文字など)は誤検知のリスクが高まります。

対策として、特定の業務PCや部署(人事部など)からのアクセスにはフィルタリングを適用しない「除外ルール」を必ず用意しておきましょう。

# 除外するIP(人事部など)
acl skip_filter_ips src 192.168.1.50 192.168.1.51

# 許可を先に書く(これにマッチすれば、下のdenyは評価されない)
http_access allow skip_filter_ips

# その後にブロック設定
http_access deny jp_adult_words

まとめ:日本語ブロックは「変換」が命

今回は、多くの管理者がつまづく「日本語キーワードのブロック」について解説しました。

今回の重要ポイント:

  • SquidはURLエンコードされた文字列を見ている。
  • 日本語リストはPythonなどでパーセントエンコーディング変換してから読み込ませる。
  • Googleセーフサーチ強制を併用することで、画像検索などの抜け穴を塞ぐ。
  • SSLバンピング(HTTPSデコード)が有効でないと、そもそも検索ワードは見えない。

この設定を行えば、あなたの組織のネットワークは、不適切なコンテンツから強力に保護されます。
「有害サイトは見せない、検索させない」。
この環境を作ることで、セキュリティリスクの低減だけでなく、健全な職場・学習環境の維持にも大きく貢献できるはずです。

ぜひ、本編(全8回)と合わせて活用し、最強のSquidサーバーを構築してください!

▼ エンジニアとしてのキャリアを加速させる ▼

フィルタリング実験
「VPS」で自分専用環境

おすすめVPSを見る

サーバー知識を年収に
「ITエンジニア転職」

転職エージェントを見る

コメント