2006年6月アーカイブ

zaurusからphsでwebとかを見るときに、最近はw3mを使う。
広告とかうざいので、フィルタがかけられるといいな~と思って調べてみたら、MouseHoleなんて言うものがあるらしい。
このお方は、デフォルトではlocalhostからの接続しか許さないらしい。
どのくらいのセキュリティ設定ができるのかわからないけど、いきなり外向きにあけてオープンプロキシになってしまうのは嫌だなと。
うちではすでにsquidが動いているので、こいつとなんとか協調できないものかと思う。
そういえば、squidは現在内部向けにしかサービスしていないが、そもそもsquidの認証ってどうなっているのかな?と調べてみた。

いろいろな認証方法が使えるらしいが、一番お手軽なのはbasic認証らしい。しかし、例によってネットワークを平文でパスワードが流れるのは納得いかないので、digest認証を使うことにする。
portsから入れているsquidさんは、/usr/local/etc/squid/squid.conf が設定ファイル。
まずはこいつを眺めてみると、auth_param basic で始まる行が何行か有効になっていたので、こいつを全てコメントアウト。そして、以下のような記述を追加する。
http_port 外部向けのアドレス:3128

auth_param digest program /usr/local/libexec/squid/digest_pw_auth /usr/local/etc/squid/digpass
auth_param digest children 3
auth_param digest realm Squid proxy-caching web server
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50

acl password proxy_auth REQUIRED

http_access allow password
最後の、http_access allow password の行は、LAN側のallow の後で、 all の deny の前に入れる。
これで、LAN側からはパスワードなしでアクセスでき、インターネット側からはdigest認証を求められるようになる。
そして、/usr/local/etc/squid/digpassと言うファイルを作成し、ユーザ名:パスワード(平文) の行を必要なだけ追加する。
後は、/etc/ipf.rulesで外部からの3128へのアクセスを通すようにしておく。
で、squid を再起動すれば、外部からもうちのsquidが使えるようになった。
試しにw3mで見てみたら、リクエストのたびにユーザ名とパスワードを聞かれる・・・。

次は、squidを使って中身をフィルタできないか調べてみるかな~。
squidで使えるコンテンツフィルタを探していたら、dansguardianと言うものを見付けました。
squidからフィルタとして呼ばれるのかと思っていたら、どうも違うようです。
デフォルトの設定では、ポート8080で待機して、そこに対する proxy のリクエストを、localhost:3128 で動いている squid に投げるようです。
でもまあ、うちで使う分にはそんなにパフォーマンスも問題にならないだろうし、将来息子がネットを見るようになったときのために、インストールして試してみることに。

まずは、portsから www/dansguardian をインストール。ライセンス規約に同意する必要があるため(?)、ソースアーカイブは自分でダウンロードしてくる必要がある。
インストールすると、/usr/local/etc/dansguardian と言うディレクトリができるので、そこに設定ファイルを置く必要があるらしい。
設定ファイルの雛型は、/usr/local/etc/dansguardian/samples ディレクトリにあるので、まずはそこにあるファイルを全て親ディレクトリにコピーする。
ちなみに、dansguardian.plだけは/usr/local/etc/dansguardian ではなくて、apache の cgi-bin に入れる。
設定ファイルは、以下のように分類される。
  • 全体に有効な設定ファイル
    dansguardian.conf -- 全体の設定ファイル
    filtergroupslist -- フィルタグループの設定ファイル(誰にどのフィルタグループを適用するか)
    bannediplist -- アクセスを禁止するクライアントIPのリスト
    exceptioniplist -- フィルタの制限をせずに、常にアクセスを許可するクライアントIPのリスト
    banneduserlist -- アクセスを禁止するユーザのリスト
    exceptionuserlist -- フィルタの制限をせずに、常にアクセスを許可するユーザのリスト
    
  • フィルタグループ毎の設定ファイル
    dansguardianf[1-99].conf -- フィルタグループの設定ファイル
    bannedphraselist -- 禁止するフレーズのリスト
    weightedphraselist -- ウェイト付きのフレーズのリスト
    exceptionphraselist -- 許可するフレーズのリスト
    bannedsitelist -- 禁止するサイトのリスト
    greysitelist -- グレーなサイトのリスト
    exceptionsitelist -- 許可するサイトのリスト
    bannedurllist -- 禁止するURLのリスト
    greyurllist -- グレーなサイトのリスト
    exceptionurllist -- 許可するURLのリスト
    bannedregexpurllist -- 禁止するURL(正規表現)のリスト
    bannedextensionlist -- 禁止する拡張子のリスト
    bannedmimetypelist -- 禁止するMIMEタイプのリスト
    pics -- PICSの設定
    contentregexplist -- コンテンツ書き換えルール
    

まずは、dansguardian.conf の書き換え。私の場合、以下の2行だけ書き換えた。
filterip = 192.168.0.1
accessdeniedaddress = 'http://www.wizard-limit.net/cgi-bin/dansguardian.pl'
ここで、192.168.0.1 は、内部向けのIP。accessdeniedaddress は、dansguardian.pl のURL。
後は、/etc/rc.conf に以下を追加。
dansguardian_enable="YES"
/usr/local/etc/rc.d/dansguardian start で起動するはず。
後は、ブラウザの設定で、proxy を 8080 にしてやれば、dansguardian がはじいてくれるようになる。
デフォルトでは、フィルタグループはひとつしかなくて、禁止拡張子で exe とかをはじいてくれるので、結構くるしそうだ。
あと、デフォルトのフレーズリストだと、英語のポルノサイトとかは弾いてくれたけど、日本語のは駄目っぽい(当然)。
子供と大人でフィルタグループを分けたりする場合は、squid が内向きにも認証を要求するようにして、dansguardian.conf, filtergroupslistを修正し、dansguardianf1〜99.conf を追加して、地道な設定作業が必要なようだ。

コメントには、squidのbasic認証と書いてあるが、うちで使っている digest 認証でもいけるのかどうかテストが必要だ。

後は、本格運用をはじめる場合には、squid の内向きの Listen をやめ、NATも止める必要がある。
世間では、apacheの2.2が既にリリースされていたらしい。
遅まきながら、うちもapache2.2に上げることにする。動機は、mod_jk2の代わりに mod_proxy_ajpを使うこと。
と、言いつつ、うちの環境ではtomcatは通常は使っていないので、それについてはまた後日。
今回は、とりあえず2.0から2.2へのバージョンアップについてだけ。

まずは、pkg_deinstall で apache 2.0 をアンインストールする。-f オプションをつけないと、依存関係があるので削除できない。
ちなみに、依存していたのは以下のパッケージ。
cacti-0.8.6h_42
dansguardian-2.8.0.6_2
ilohamail-0.8.13_1
ja-squirrelmail-1.4.5,2
mod_jk2-apache2-2.0.4
mod_perl2-2.0.2,3
php4-4.4.2_1
php4-gettext-4.4.2_1
php4-mbstring-4.4.2_1
php4-mhash-4.4.2_1
php4-mysql-4.4.2_1
php4-openssl-4.4.2_1
php4-pcre-4.4.2_1
php4-pgsql-4.4.2_1
php4-session-4.4.2_1
php4-xml-4.4.2_1
subversion-1.3.0.r2
mod_jk2も使わなくなるので削除しておく。
続いて、portsからwww/apache22をインストール。オプションは、
# make WITH_BERKELEYDB=db4 WITH_PROXY_MODULES=yes install
設定ファイルの置き場所が、/usr/local/etc/apache22 に変わっている。
portupgrade -f で、mod_perl2, php4-\*, subversion を再インストールしておく。
php4 が、いつからかわからないけどデフォルトで apache のモジュールが入らないようになってしまっていたので、WITH_APACHE=yes を追加する。
/usr/local/etc/apache22/httpd.conf はバックアップしておいて、apache2.0のときに使用していたものを上書きする。
他にも、うちの環境で使っていた ssl.conf や各種証明書、パスワードファイル等をコピーする。
そしたら、httpd.conf, ssl.confの書き換え。
  • LoadModule が並んでいるところを、新しいhttpd.conf からコピーする。
  • /usr/local/etc/apache2 を /usr/local/etc/apache22 に置換する。
  • AuthDigestFile ディレクティブが、AuthUserFile ディレクティブに変更になったらしいので、置換する。
  • 何箇所かのAllowOverride ディレクティブでwarnning が出るので、コメントアウト。(これについては、何が変わったのか調査の必要あり)
  • 起動時に、warnが出るので、/usr/local/etc/apache22/Includes/no-accf.conf をIncludeする。
    ※ これで、warnは2行から1行に減ったが、なくならない。AcceptFilterディレクティブ周りのようだが・・・。
/etc/rc.conf を修正する。
apache22_enable="YES"
apache22_flags="-DSSL"
以前のような、apache2ssl_enableみたいなものはないらしい。
ここまでで、とりあえず起動はして動くようになったようだ。
次は、mod_proxy_ajpに挑戦してみたい。

仕事で apacheのモジュールを使いそうだったので、ちょっと調べてみた。

と言う本を買い、試してみたところ、サンプルを動かすところまでは実に簡単だった。
その先は、APIのまともなリファレンスがないようなので、結構大変かも知れない。

とりあえず、FreeBSDの portsから入れた apache22だと、少し問題があるみたいだったので、修正方法を書いておく。
※ これは、portsのバージョンが上がれば修正されるかも知れない。

起きる問題は二つで、apxs -n -g でテンプレートを作成した場合に起きる。
make したときにエラーが出るのだが、makeを使わずに apxs -c でコンパイルする分には問題がない。
  • make すると、
    "/usr/local/share/apache22/build/special.mk", line 26: Could not find /usr/local/build/rules.mk
    
    と怒られる。これは、/usr/local/sbin/apxs の648行目を修正して、
    top_builddir=%PREFIX%
    
    top_builddir=%PREFIX%/share/apache22
    
    にしてやると良い。
  • 上記を修正してmakeすると、今度は apr まわりがincludeできなくて怒られる。
    こちらは、/usr/local/share/apache22/build/config_vars.mk の78行目を修正する。
    EXTRA_INCLUDES = -I$(includedir) -I. -I/opt/ports/www/apache22/work/httpd-2.2.2/srclib/apr/include -I/opt/ports/www/apache22/work/httpd-2.2.2/srclib/apr-util/include -I/usr/local/include -I/usr/include
    EXTRA_INCLUDES = -I$(includedir) -I. -I${APR_INCLUDEDIR} -I${APU_INCLUDEDIR} -I/usr/local/include -I/usr/include
squidの設定をちょっと見直す。
やりたいことは、透過型proxyにすることと、snmp対応にして、cactiでグラフを見れるようにすること。

まずは、portsからのmake時に、--enable-ipf-transparentと--enable-snmp が有効になるようにすること。/usr/ports/www/squidで、make configとやると設定できる。
後は、/usr/local/etc/squid/squid.conf で、以下のあたりを修正する。
透過proxy 関係
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
snmp関係
acl snmppublic snmp_community public
snmp_access allow snmppublic localhost
snmp_access deny all
snmp_incoming_address 127.0.0.1
透過型proxyにするには、後は ipnatの設定(/etc/ipnat.rules)で、
rdr rl0 192.168.0.1/32 port 80 -> 192.168.0.1 port 80 tcp
rdr rl0 0/0 port 80 -> 192.168.0.1 port 3128 tcp
みたいなのを追加する。rl0 はLAN側のネットワークインターフェイスで、192.168.0.1 は LAN側のIP、3128はsquidのポート番号。
最初、これを
rdr rl0 0/0 port 80 -> 127.0.0.1 port 3128 tcp
と書いて、どうしてもうまくいかなかったのだが、内向きのIPを指定したらうまくいった。なんで駄目なのか私には理解できないのだが・・・。
後は、squidのログに以下のエラーが出る。
parseHttpRequest: NAT open failed: (13) Permission denied
/dev/ipnatのオーナーをsquidにしたら、エラーは出なくなった模様。
続いて、snmpの方。参考にしていたページだと、以下のように動作確認をしていた。
snmpwalk -p 3401 localhost public .1.3.6.1.4.1.3495.1.1
しかし、これだとsquidのログに
Failed SNMP agent query from : 127.0.0.1.
と言うエラーが出てうまくいかない。
いろいろ試した結果、
snmpwalk -v 1 -c public -m /usr/local/etc/squid/mib.txt localhost:3401 .1.3.6.1.4.1.3495.1
のようにやると、うまく行ったようだ。
これで、snmp経由でいろいろ取れるようになったはずだけど、cactiの方に入れる方法が良くわからないので、今日はここまで。
fletsに繋ぐときに、マルチセッションで繋ごうと思うと、flets用のルーティングテーブルは手で編集してあげないといけない。
しかし、fletsさんが設定を結構変えてくれるので、追いかけるのが大変だ。
今回、fletsのルーティングテーブルがhttp://routing.flets/routing.htmlに書かれていることを知ったので、そこからppp.conf用の設定を生成できるようにしてみた。

ルーティングテーブル生成スクリプト
#!/bin/sh
fetch http://routing.flets/routing.html
/usr/local/bin/perl mkroute.pl
ルーティングテーブル生成スクリプトが呼び出すperlスクリプト
#!perl

open(F, "routing.html");
while() {
    if (/^Route[0-9]/) {
 @l = split(",", $_);
 print " add $l[1] $l[2] HISADDR\n";
    }
}
手抜きだけど、とりあえずの用途にはいけるのではないでしょうか。
ちょっと前のエントリで、squidにsnmpを話させるところまで成功した。
今度は、それをcactiでグラフにしたいと思い、調べていたら[XML] SquidStats version 0.1 (cacti 0.8.5 only!!!)と言う記事を見つけた。
ここから、SquidStats-0.1.zipをダウンロードしてきて、README.txtにしたがって設定してみたが、なかなかうまく行かない。
そこの掲示板(?)のやり取りを参考にして、以下のようにしたらグラフを出すことに成功した。

  1. /usr/local/share/snmp/snmpd.confに以下の行を追加して、snmpdを再起動。
    proxy -v 1 -c public localhost:3401 .1.3.6.1.4.1.3495.1
    
  2. README.txtにしたがって、webcache_squid_core.xmlと、webcache_squid_median.xmlをインストールし、cacti_host_template_webcache_squid_server_snmp.xmlをインポートする。
  3. cactiの設定画面で、Devices から squidとsnmpdが動作しているホストを選択する。
  4. Associated Data Queriesのところで、WebCache - Squid Statistics - CoreとWebCache - Squid Statistics - Median Basedを追加する。
  5. Create Graphs for this Hostのリンクをクリックする。
  6. Data Query [WebCache - Squid Statistics - Core]と、Data Query [WebCache - Squid Statistics - Median Based]からそれぞれ追加したいgraph type を選択して、createしてやれば、グラフが追加される。
  7. 最大で5分待って、cmd.phpが実行されれば、グラフが表示されるはず。
最初、README.txtの通りに、squid用のホストテンプレートを選択してdeviceを追加し、3401ポートに繋ぐようにしてみたのだが、エラーは出ないけどグラフも出ない状態で、悩んだ末に上のやり方に落ち着いた。
もともと、ホストが増えてしまうのは本意ではなかったので、結果的に良かったと言えるかな。
2006年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

このアーカイブについて

このページには、2006年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年5月です。

次のアーカイブは2006年7月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1