SlideShare ist ein Scribd-Unternehmen logo
1 von 2
Downloaden Sie, um offline zu lesen
OSC2012 Tokyo/Fall

                                  お手軽インターネットアクセス制限
                                           - AWK でブラックホール Proxy を作る -


    不快なサイトは見たくない                                            socket_type   =   stream
                                                            wait          =   no
  不快なサイトや広告などがある場合、皆さんはどう                                   user          =   root
していますか?                                                     server        =   /usr/local/bin/blackhole_proxy.awk
  1. 市販ソフトによるブロック                                           disable       =   no
                                                        }
  2. プロバイダによるブロック
  3. hosts によるブロック
  4. ブラウザのアドオンによるブロック                                    xinetd は /ete/service を見ますので、これに TCP
  5. Proxy でブロック                                        の 81 番ポートを加えておきます。
  これらにはそれぞれ一長一短があります。全ての接                               List 3: /etc/service
続機器やブラウザで統一するのは難しく、Proxy では                             blackhole_proxy        tcp/81
HTTPS の通信を制限できません。
                                                            次に proxy.pac は以下のようなものを用意します。
    そうだ! proxy.pac を使おう
  個々のブラウザで制御しつつ一括管理するのには                                List 4: proxy.pac
proxy.pac を 使 い ま す 。 proxy.pac の 正 体 は                 var white_regexp = [
JavaScript ですので、  JavaScript が使えるブラウザで                      ".css",
                                                        ];
あれば使えます。     また、  proxy.pac は Proxy のアドレス
とポートしか返せませんので、ブラックリストに該当                                var black_regexp = [
すれば 1 x 1 ピクセルの透過画像を常に返す Proxy に                            "[^a-z0-9]ad[^a-z]*[^a-z0-9]",
                                                            "[^a-z0-9]affiliate[^a-z]*[^a-z0-9]",
渡します。    この Proxy こそが  「ブラックホール Proxy」                  ];
なのです。    この Proxy に渡すことで "Not Found" と表
示されることも、     画像が  「×」 で表示されることもなくな                      function FindProxyForURL(url, host) {
                                                            for (var i in white_regexp) {
ります。この Proxy は xinetd スーパーサーバーを使                                var regexp = new RegExp(white_regexp[i], "i");
えば、  AWK でも簡単に作れます。        ここでは 81 番ポート                         if (url.match(regexp)) {
を使うように作ってみます。                                                       return "DIRECT";
                                                                }
                                                            }
List 1: /bin/blackhole_proxy.awk
                                                            for (var i in black_regexp) {
#! /bin/gawk -f                                                 var regexp = new RegExp(black_regexp[i], "i");
                                                                if (url.match(regexp)) {
BEGIN {                                                             return "PROXY gauc.no-ip.org:81;";
    RS = "rn"; ORS = "rn";                                  }
                                                            }
    getline;
                                                            return "DIRECT";
    print "HTTP/1.0 200 OK";                            }
    print "MIME-Version: 1.0";
    print "Content-Type: image/gif";
    print "";                                             関数の前で配列でブラックリストを定義したり 、
    printf("x47x49x46x38x39x61x01x00"          shExpMatch ではなく match を使っているので、巷
           "x01x00xf0x00x00xffxffxff"   
           "x00x00x00x21xf9x04x01x00"   
                                                        の proxy.pac とは一風異なるものになっています。ま
           "x00x00x00x2cx00x00x00x00"          た、CSS をブロックすると体裁が崩れてしまうサイト
           "x01x00x01x00x00x02x02x44"          が多いので、    ホワイトリストに加えておくと便利です。
           "x01x00x3bx00");
}
                                                          カスタマイズは自分に合わせよう
                                                         不快と感じるかどうかは個人の主観です。 proxy.pac
 このスクリプトに実行権限を付けて、/usr/local/bin
                                                        であれば自分が不快と思えば簡単に加えることができ
に配置します。また、xinetd の設定を行います。
                                                        ます。しかも、共通でアクセスできる場所に proxy.pac
List 2: /etc/xinetd.d/blackhole_proxy                   を置けば全ての接続機器で同じ設定になります。   さぁ、
service blackhole_proxy                                 ちょっとした工夫で自分に合った快適なインターネッ
{                                                       ト環境を構築してみましょう。

                          日本 GNU AWK ユーザー会 http://gauc.no-ip.org/awk-users-jp/
OSC2012 Tokyo/Fall
    余談                                                       お試しできます!
  proxy.pac は ク ラ イ ア ン ト サ イ ド で 処 理 す る                 この単純な Proxy (実際には httpd ですね) は簡単
JavaScript です。そのため、  あまりにも多い処理を行う                       に設置できますが、お試しのために外部からアクセス
と遅くなったりすることもあります。必要に応じて加                                できるようにしてあります。先述のように 何を不快と
えていくのが良いでしょう。                                           感じるかは個人の主観であるため、 proxy.pac 自体は
  さて、  何故 AWK なのでしょうか? 今回のように常に                         提 供 し ま せ ん が 、 Proxy の 戻 り 値 を gauc.no-
同じものを返すのであれば、Shell でも作成できます。                            ip.org:81 にしていただければ、この Proxy を利用で
しかし、このスクリプトのままだと JavaScript の場合                         きます。    ご利用ください。   (※ただし、  断りなくサービス
にも画像を返すため不具合を生じるかもしれません。                                を停止させていただく場合もあります)
そこで、以下のように拡張してみます。                                        また、   ブースにてデモを行っていますので、        お試しく
                                                        ださい。
List 5: /bin/blackhole_proxy.awk
#! /bin/gawk -f
                                                            Proxy を使った応用
BEGIN {                                                   実際に、私の環境でもこのブラックホール Proxy を
    RS = "rn";    ORS = "rn";                       利用していますが、さらに、 PHP でアクセス元毎の
                                                        proxy.pac の分岐、  LAN 外アクセス時には Ziproxy で
    getline;
                                                        圧縮転送、    Squid によるキャッシュ、 ClamAV によるウ
    request_url     = $2;                               イ ル ス チ ェ ッ ク 、 Google Safe Browsing や
                                                        squidGuard によるさらなるアクセス制限、dnsmasq
    if (request_url ~ /.js$/) {
        is_javascript = 1;                              による DNS のキャッシュなど行っています。         このよう
    } else {                                            に自由なソフトだけで便利かつ安心できる環境を構築
        is_javascript = 0;
                                                        できます。(※これらは上記サービス外です)
    }

    print "HTTP/1.0 200 OK";                               「日本 GNU AWK ユーザー会」について
                                                          日本 GNU AWK ユーザー会は以下のような活動を
    if (is_javascript) {    # JavaScript
        print "MIME-Version: 1.0";
                                                        行っています。
        print "Content-Type: text/javascript";             •   GNU AWK (gawk, gawkextlib) の開発
        print "";                                          •   AWK を便利にするための活動
        print "//";
                                                          GNU AWK (gawk) は外部のライブラリを利用でき
    } else {                # JavaScript 以外
        print "MIME-Version: 1.0";                      るようになりました。XML, PostgreSQL, MPFR など
        print "Content-Type: image/gif";                の 拡 張 を 行 っ て い た xmlgawk の プ ロ ジ ェ ク ト は
        print "";
                                                        gawkextlib と名前を変え、   継続して gawk の外部ライ
        printf("x47x49x46x38x39x61x01x00"   
               "x01x00xf0x00x00xffxffxff"      ブラリ開発活動を行っています。
               "x00x00x00x21xf9x04x01x00"        また、 「USP 友の会」の友好団体として OSC などの
               "x00x00x00x2cx00x00x00x00"   
                                                        イベントや勉強会に参加しています。           ご興味があれば、
               "x01x00x01x00x00x02x02x44"   
               "x01x00x3bx00");                     合わせて参加ください。
    }
}                                                          参考
                                                           •   日本 GNU AWK ユーザー会:
                                                                http://gauc.no-ip.org/awk-user-jp/
 AWK のようなプログラミング言語を使うことで、一
                                                           •   USP 友の会:
貫して簡単に拡張させることができます。                                             http://www.usptomonokai.jp/
 GNU AWK (gawk) には TCP の Socket 通信機能が                      •   Bust Banner Ads with Proxy Auto Config:
                                                                http://www.schooner.com/~loverso/no-ads/
ありますが、   この Socket 通信機能では通信のセッショ
ン管理やタイムアウト処理を行うことができません。
                                                            お問い合わせ先
同様の動作をさせることはできますが、アクセスが集
                                                          本資料に関するお問い合わせは @hi_saito または
中すると不具合が発生してしまいます。          そこで、  xinetd
                                                        hi_saito@yk.rim.or.jp にお願いします。
の TCP Wrapper の機能を使い処理を行っています。
 最近のスマホであれば、3G 回線でも VPN を利用す
ることで proxy.pac を使えますので、    WiFi 環境以外で
もこの Proxy を利用することができます。        ただし、 ここ
では VPN の設定は割愛します。


                            日本 GNU AWK ユーザー会 http://gauc.no-ip.org/awk-users-jp/

Weitere ähnliche Inhalte

Was ist angesagt?

.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
Tusyoshi Matsuzaki
 
Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
peryaudo
 
Dive into dockerネットワーク
Dive into dockerネットワークDive into dockerネットワーク
Dive into dockerネットワーク
Kazuyuki Mori
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
kjwtnb
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
Akio Ishida
 

Was ist angesagt? (20)

10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
 
Openresty
OpenrestyOpenresty
Openresty
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
 
Dive into dockerネットワーク
Dive into dockerネットワークDive into dockerネットワーク
Dive into dockerネットワーク
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
Mongo dbのgridfsについて
Mongo dbのgridfsについてMongo dbのgridfsについて
Mongo dbのgridfsについて
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistream
 
Wake and Shutdown on LAN
Wake and Shutdown on LANWake and Shutdown on LAN
Wake and Shutdown on LAN
 
Word press on conoha このべん #3
Word press on conoha このべん #3Word press on conoha このべん #3
Word press on conoha このべん #3
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 

Ähnlich wie 日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall

OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
irix_jp
 
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
博文 斉藤
 
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使うVagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
Masashi Shinbara
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
 

Ähnlich wie 日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall (20)

OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみた
 
Nginx
NginxNginx
Nginx
 
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API DragonJOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
JOSUG2014 OpenStack 4th birthday party in Japan; the way of OpenStack API Dragon
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
 
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
 
Niigata.pm #1
Niigata.pm #1Niigata.pm #1
Niigata.pm #1
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouch
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
1day cloud on_your_lab
1day cloud on_your_lab1day cloud on_your_lab
1day cloud on_your_lab
 
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使うVagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
 
OpenWrtによるサイト間IPsec接続
OpenWrtによるサイト間IPsec接続OpenWrtによるサイト間IPsec接続
OpenWrtによるサイト間IPsec接続
 
AWS Lambdaで作るクローラー/スクレイピング
AWS Lambdaで作るクローラー/スクレイピングAWS Lambdaで作るクローラー/スクレイピング
AWS Lambdaで作るクローラー/スクレイピング
 
LAMP環境にDocker環境を追加してみた
LAMP環境にDocker環境を追加してみたLAMP環境にDocker環境を追加してみた
LAMP環境にDocker環境を追加してみた
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 

Mehr von 博文 斉藤

「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!
博文 斉藤
 
Shell で制限付き並列処理をしよう
Shell で制限付き並列処理をしようShell で制限付き並列処理をしよう
Shell で制限付き並列処理をしよう
博文 斉藤
 
curl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しようcurl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しよう
博文 斉藤
 
Usptomonokai 20111028
Usptomonokai 20111028Usptomonokai 20111028
Usptomonokai 20111028
博文 斉藤
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413
博文 斉藤
 
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
博文 斉藤
 
お手軽並列処理
お手軽並列処理お手軽並列処理
お手軽並列処理
博文 斉藤
 

Mehr von 博文 斉藤 (13)

Obsidian Talk JP 資料 - 2021-10-15
Obsidian Talk JP 資料 - 2021-10-15Obsidian Talk JP 資料 - 2021-10-15
Obsidian Talk JP 資料 - 2021-10-15
 
 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 Obsidian Talk JP - Template & Daily notes - 2021-09-04 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 
Markdown で行こう!
Markdown で行こう!Markdown で行こう!
Markdown で行こう!
 
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
 
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
 
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
 
「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!
 
Shell で制限付き並列処理をしよう
Shell で制限付き並列処理をしようShell で制限付き並列処理をしよう
Shell で制限付き並列処理をしよう
 
curl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しようcurl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しよう
 
Usptomonokai 20111028
Usptomonokai 20111028Usptomonokai 20111028
Usptomonokai 20111028
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413
 
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
 
お手軽並列処理
お手軽並列処理お手軽並列処理
お手軽並列処理
 

日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall

  • 1. OSC2012 Tokyo/Fall お手軽インターネットアクセス制限 - AWK でブラックホール Proxy を作る - 不快なサイトは見たくない socket_type = stream wait = no 不快なサイトや広告などがある場合、皆さんはどう user = root していますか? server = /usr/local/bin/blackhole_proxy.awk 1. 市販ソフトによるブロック disable = no } 2. プロバイダによるブロック 3. hosts によるブロック 4. ブラウザのアドオンによるブロック xinetd は /ete/service を見ますので、これに TCP 5. Proxy でブロック の 81 番ポートを加えておきます。 これらにはそれぞれ一長一短があります。全ての接 List 3: /etc/service 続機器やブラウザで統一するのは難しく、Proxy では blackhole_proxy tcp/81 HTTPS の通信を制限できません。 次に proxy.pac は以下のようなものを用意します。 そうだ! proxy.pac を使おう 個々のブラウザで制御しつつ一括管理するのには List 4: proxy.pac proxy.pac を 使 い ま す 。 proxy.pac の 正 体 は var white_regexp = [ JavaScript ですので、 JavaScript が使えるブラウザで ".css", ]; あれば使えます。 また、 proxy.pac は Proxy のアドレス とポートしか返せませんので、ブラックリストに該当 var black_regexp = [ すれば 1 x 1 ピクセルの透過画像を常に返す Proxy に "[^a-z0-9]ad[^a-z]*[^a-z0-9]", "[^a-z0-9]affiliate[^a-z]*[^a-z0-9]", 渡します。 この Proxy こそが 「ブラックホール Proxy」 ]; なのです。 この Proxy に渡すことで "Not Found" と表 示されることも、 画像が 「×」 で表示されることもなくな function FindProxyForURL(url, host) { for (var i in white_regexp) { ります。この Proxy は xinetd スーパーサーバーを使 var regexp = new RegExp(white_regexp[i], "i"); えば、 AWK でも簡単に作れます。 ここでは 81 番ポート if (url.match(regexp)) { を使うように作ってみます。 return "DIRECT"; } } List 1: /bin/blackhole_proxy.awk for (var i in black_regexp) { #! /bin/gawk -f var regexp = new RegExp(black_regexp[i], "i"); if (url.match(regexp)) { BEGIN { return "PROXY gauc.no-ip.org:81;"; RS = "rn"; ORS = "rn"; } } getline; return "DIRECT"; print "HTTP/1.0 200 OK"; } print "MIME-Version: 1.0"; print "Content-Type: image/gif"; print ""; 関数の前で配列でブラックリストを定義したり 、 printf("x47x49x46x38x39x61x01x00" shExpMatch ではなく match を使っているので、巷 "x01x00xf0x00x00xffxffxff" "x00x00x00x21xf9x04x01x00" の proxy.pac とは一風異なるものになっています。ま "x00x00x00x2cx00x00x00x00" た、CSS をブロックすると体裁が崩れてしまうサイト "x01x00x01x00x00x02x02x44" が多いので、 ホワイトリストに加えておくと便利です。 "x01x00x3bx00"); } カスタマイズは自分に合わせよう 不快と感じるかどうかは個人の主観です。 proxy.pac このスクリプトに実行権限を付けて、/usr/local/bin であれば自分が不快と思えば簡単に加えることができ に配置します。また、xinetd の設定を行います。 ます。しかも、共通でアクセスできる場所に proxy.pac List 2: /etc/xinetd.d/blackhole_proxy を置けば全ての接続機器で同じ設定になります。 さぁ、 service blackhole_proxy ちょっとした工夫で自分に合った快適なインターネッ { ト環境を構築してみましょう。 日本 GNU AWK ユーザー会 http://gauc.no-ip.org/awk-users-jp/
  • 2. OSC2012 Tokyo/Fall 余談 お試しできます! proxy.pac は ク ラ イ ア ン ト サ イ ド で 処 理 す る この単純な Proxy (実際には httpd ですね) は簡単 JavaScript です。そのため、 あまりにも多い処理を行う に設置できますが、お試しのために外部からアクセス と遅くなったりすることもあります。必要に応じて加 できるようにしてあります。先述のように 何を不快と えていくのが良いでしょう。 感じるかは個人の主観であるため、 proxy.pac 自体は さて、 何故 AWK なのでしょうか? 今回のように常に 提 供 し ま せ ん が 、 Proxy の 戻 り 値 を gauc.no- 同じものを返すのであれば、Shell でも作成できます。 ip.org:81 にしていただければ、この Proxy を利用で しかし、このスクリプトのままだと JavaScript の場合 きます。 ご利用ください。 (※ただし、 断りなくサービス にも画像を返すため不具合を生じるかもしれません。 を停止させていただく場合もあります) そこで、以下のように拡張してみます。 また、 ブースにてデモを行っていますので、 お試しく ださい。 List 5: /bin/blackhole_proxy.awk #! /bin/gawk -f Proxy を使った応用 BEGIN { 実際に、私の環境でもこのブラックホール Proxy を RS = "rn"; ORS = "rn"; 利用していますが、さらに、 PHP でアクセス元毎の proxy.pac の分岐、 LAN 外アクセス時には Ziproxy で getline; 圧縮転送、 Squid によるキャッシュ、 ClamAV によるウ request_url = $2; イ ル ス チ ェ ッ ク 、 Google Safe Browsing や squidGuard によるさらなるアクセス制限、dnsmasq if (request_url ~ /.js$/) { is_javascript = 1; による DNS のキャッシュなど行っています。 このよう } else { に自由なソフトだけで便利かつ安心できる環境を構築 is_javascript = 0; できます。(※これらは上記サービス外です) } print "HTTP/1.0 200 OK"; 「日本 GNU AWK ユーザー会」について 日本 GNU AWK ユーザー会は以下のような活動を if (is_javascript) { # JavaScript print "MIME-Version: 1.0"; 行っています。 print "Content-Type: text/javascript"; • GNU AWK (gawk, gawkextlib) の開発 print ""; • AWK を便利にするための活動 print "//"; GNU AWK (gawk) は外部のライブラリを利用でき } else { # JavaScript 以外 print "MIME-Version: 1.0"; るようになりました。XML, PostgreSQL, MPFR など print "Content-Type: image/gif"; の 拡 張 を 行 っ て い た xmlgawk の プ ロ ジ ェ ク ト は print ""; gawkextlib と名前を変え、 継続して gawk の外部ライ printf("x47x49x46x38x39x61x01x00" "x01x00xf0x00x00xffxffxff" ブラリ開発活動を行っています。 "x00x00x00x21xf9x04x01x00" また、 「USP 友の会」の友好団体として OSC などの "x00x00x00x2cx00x00x00x00" イベントや勉強会に参加しています。 ご興味があれば、 "x01x00x01x00x00x02x02x44" "x01x00x3bx00"); 合わせて参加ください。 } } 参考 • 日本 GNU AWK ユーザー会:  http://gauc.no-ip.org/awk-user-jp/ AWK のようなプログラミング言語を使うことで、一 • USP 友の会: 貫して簡単に拡張させることができます。  http://www.usptomonokai.jp/ GNU AWK (gawk) には TCP の Socket 通信機能が • Bust Banner Ads with Proxy Auto Config:  http://www.schooner.com/~loverso/no-ads/ ありますが、 この Socket 通信機能では通信のセッショ ン管理やタイムアウト処理を行うことができません。 お問い合わせ先 同様の動作をさせることはできますが、アクセスが集 本資料に関するお問い合わせは @hi_saito または 中すると不具合が発生してしまいます。 そこで、 xinetd hi_saito@yk.rim.or.jp にお願いします。 の TCP Wrapper の機能を使い処理を行っています。 最近のスマホであれば、3G 回線でも VPN を利用す ることで proxy.pac を使えますので、 WiFi 環境以外で もこの Proxy を利用することができます。 ただし、 ここ では VPN の設定は割愛します。 日本 GNU AWK ユーザー会 http://gauc.no-ip.org/awk-users-jp/