「日本語」の壁を越えて、不適切な検索を許さない。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全8回のSquid講座、完走お疲れ様でした!
さて、日本の企業や学校でプロキシを運用していると、必ずぶつかる壁があります。
それは「日本語の検索キーワードがブロックできない問題」です。
先生、困りました…。
前回教わったキーワードブロックで sex とか drug は止まるようになったんですが、日本語で「アダルト」とか「危険ドラッグ」って検索すると、すり抜けて表示されちゃうんです!
設定ファイルに日本語を書いたのに、効いてないみたいで…。
それはね、Squidが悪いんじゃなくて「インターネットの仕組み」の問題よ。
ブラウザがURLを送信する時、日本語は「%E3%81…」みたいな記号に変換(エンコード)されているの。
だからSquidの設定ファイルに漢字で「暴力」って書いても、流れてくるデータと一致しないのよ。
今回は、この変換ルールを攻略して、日本語キーワードを完璧にブロックする方法を伝授するわ!
本記事では、日本国内の運用で必須となる「日本語キーワードフィルタリング」の実装方法を解説します。
URLエンコードの自動変換テクニックや、抜け穴を防ぐためのセーフサーチ強制設定まで、実務直結のノウハウです。
🦑 Squid完全攻略講座(バックナンバー)
※本記事の内容は、第4回「SSLバンピング」の設定が完了していることが前提です。
第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. リストの更新方法
新しい隠語や流行りの言葉が出てきたら、ブロックリストを更新する必要があります。
運用フローは以下のようになります。
source_adult_ja.txt(日本語の元ファイル)に追記する。- Pythonコマンドを実行して、
block_adult_encoded.txtを再生成する。 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」で自分専用環境
サーバー知識を年収に
「ITエンジニア転職」


コメント