2009/09/19

VPN してみよう (その1)

VPN をしてみようと思ったのです。

実家と自宅を VPN で結ぼうと。
実家にいるときに、自宅のファイルサーバのデータが欲しくなったりするんですよ。
自宅のメインマシンのデータとか。
ついでに、モバイル使用のノートからも VPN したいわけです。

FreeBSD で VPN というと、vtun がメジャーだったりします。
が、EuroBSDCon 2008 で、カナダのトロント大学で、OpenVPN で 3 万人に VPN を提供した、と言う発表があったようです。
ざっと探した限りでは、vtun か、OpenVPN か、地道に SSH か、と言う選択肢しか見つかりませんでした。

今回の目的は、自宅のネットワークと実家のネットワークを結び、ついでにモバイルからも接続できるようにする、です。
この目的にずばり答えてくれる選択肢を検討すると、
ネットワーク同士を結ぶ、と言う時点で SSH が消え、
ノートは Windows Vista と言う時点で vtun が消え、
結局 OpenVPN しかありませんでした。
# ネットワーク同士は vtun で結んで、ノートからは SSH しろ、とか言わないよーに (苦笑)

そんなわけで、導入です。
グローバルIP アドレス持ってる Gateway Server に OpenVPN をインストール。
インストールするのは、security/openvpn です。
security/openvpn-devel-2.1_r19 もあるのですが、まだ Release Candidate なので、採用を見送りました。
が、クライアントになるノートの方には、2.1RC を入れます。
理由は、2.1RC じゃないと、Windows Vista に対応していないからです。
2.1RC Client からも 2.0 Server には接続できるので、これで良し。

Windows 版は、プラムシステムズ (株) が日本語化しているので、以下の場所から落とします。

http://www.openvpn.jp/

なお、OpenVPN に関する日本語情報は、二箇所にあります。

http://freescitech.net/2/ OpenVPN の日本語情報
http://freescitech.net/2/wiki/ 上記の新しい Wiki

http://www.openvpn.jp/ プラムシステムズ (株)

ほぼ同じ情報が上がってます。


Server も Client も、インストールはお気軽です。
Server は portinstall openvpn するだけ。
Client は、zip 落としてきて、インストーラ実行するだけです。


さて、設定。
まず、サーバを仕込みます。

手順通りに作業します。(Server で作業)

最初は、Server/Client key pair に署名する認証局 (CA) を作ります。
手順書を見ると、/usr/local/share/doc/openvpn/easy-rsa/vars を編集しろ、と。
ここで、鍵を生成するようです。
ディレクトリが全然嬉しくない。。。
/usr/local/etc/openvpn/easy-rsa にしろよ。。。

さて、vars ファイルでは、設定しなければならない項目があります。
鍵に埋め込む Organization 情報です。


export KEY_COUNTRY=JP
export KEY_PROVINCE=TOKYO
export KEY_CITY=ADACHI-KU
export KEY_ORG="OpenVPN-NET"
export KEY_EMAIL="admin@example.com"

とかにしておきます。(実際には、ちゃんと入れてます)

書き換えたら、実行です。
手順書には、

. ./vars
./clean-all
./build-ca

ってやれ、って書いてあります。
・・・sh (Born Shell) ですね?
Linux が例に取られてるから bash だろうけど。
あたしゃ tcsh 使ってるのよー。
ついでに、clean-all にも build-ca にも実行ビットが立っていないので、仕方なく以下のように。

sh
. ./vars
sh ./clean-all
sh ./build-ca

. ./vars やると、clean-all やれ、って言われます。
./clean-all やっても何も言われないけど、./build-ca やるとガリガリ動いたあと、質問がいくつかなされます。
まぁ、属性設定項目を聞いてくるだけなんですが。
ほとんど ./vars で設定した内容がデフォルトで入っているので、そのまま Enter 押せばいいです。
が、一つだけ、設定しないといけない項目があります。

Common Name (eg, your name or your server's hostname) []:OpenVPN-CA

これだけは、適当に設定して下さい。


次に、Server の key pair を作ります。

sh ./build-key-server server

ここでも、Common Name は自分で設定しないといけません。
また、CA とも、あとから作成する Client とも、被ってはいけません。
まぁ、適当に server とかしておきます。
そして、次の二つの質問に yes と答えます。

Sign the certificate? [y/n] y
1 out of 1 certificate requests certified, commit? [y/n] y

これで Server の key pair 作成は完了です。

次に Client key pair を作成します。
今回は、2 つ (実家ネットワーク用とモバイルノート用) 作成します。

sh ./build-key jikka
sh ./build-key mobile

Common Name はユニークな物を付けて下さい。
まんま jikka, mobile と付けたことにします。
そして、Server と同じように、二つの質問に Yes と答えます。

これで鍵が出来ました。
鍵は全部、/usr/local/share/doc/openvpn/easy-rsa/ に出来てます。
公開鍵はともかく、秘密鍵が含まれますから、鍵は安全な方法でクライアントに持っていって下さい。
Client key は Client で作成して、CSR を提出して貰い、CA で署名して返す、と言う方法もあるのですが、めんどくさいのでしません。
というか、実家で鍵生成して、自宅に送って署名して持ってくる、って言うのがめんどくさいので。


次に、Diffie-Hellman パラメータを生成します。

sh ./build-dh

できたら、Server と Client に、それぞれコピーします。

Server には、
ca.crt
dh1024.pem
server.crt
server.key

実家には、
ca.crt
jikka.crt
jikka.key

ノートには、
ca.crt
mobile.crt
mobile.key

それぞれコピーします。
Server は、/usr/local/etc/openvpn/keys に置きました。
実家は同じ場所に。
ノートは、D:\Win32Apps\OpenVPN\keys に置きました。
これで、鍵の準備が整いました。


次に設定ファイルの編集です。
まずは Server から。
/usr/local/share/doc/openvpn/sample-config-files にサンプルがあるので、ここからコピーして編集します。
使うのは server.conf です。

まず Local IP Address の指定 (いっぱい IP Address が Alias してあるので)

local aaa.bbb.ccc.ddd

ポートは、デフォルトの 1194 のままです。
プロトコルも、デフォルトの udp にします。
# TCP も実装されているが、TCP-over-TCP 問題などがあり、UDP の方がよいとのこと

いろいろググったら、みんな Bridge モードで使ってるらしかったのだけれど、今回はネットワーク同士を繋ぐ必要があるので、ルーティングモードで使います。
なので、device は tun のままです。
そして、鍵の位置を指定します。

ca keys/ca.crt
cert keys/server.crt
key keys/server.key  # This file should be kept secret

皆さんフルパスで書いているんですが、OpenVPN は、起動時にワークディレクトリの指定が出来るので、そこからの相対パスにしました。
Diffie-Hellman パラメータの位置も指定します。

dh keys/dh1024.pem

VPN の IP Address の設定は、デフォルトのままにしました。

server 10.8.0.0 255.255.255.0

この 10.8.0.0/24 というのは、Server 側 LAN の IP Address とも、Client の IP Address とも被らない設定にしないといけません。
192.168.0.0/16 あたりは、公衆サービスなどで使われている可能性があるので、要注意です。
マニュアルによれば、10.0.0.0/8 の真ん中あたりから取ってくれば、大丈夫じゃないかなぁ? だそうです。

さて、今回はネットワーク同士を繋いで、シームレスに使えることを目的としているので、お互いのネットワークを広告して、ルーティングさせなきゃいけません。
なので、広告のために、次の設定をします。

push "route 自宅ネットワーク ネットマスク"
push "route 実家ネットワーク ネットマスク"

これで、広告されるそうです。
実家に繋がったら、ルーティングしないといけません。
実家から接続されたときに反応しないといけないので、client-config-dir を設定します。

client-config-dir ccd

ccd と言うディレクトリは、Server 実行時に存在しないといけません。
なので、/usr/local/etc/openvpn/ccd を作ります。
そして、ルーティングの設定を入れます。

route 実家ネットワーク ネットマスク

このほかに、実家から接続されたときの設定を ccd ディレクトリに作成します。
Client 名のファイルを作成し、ルート設定を入れます。

/usr/local/etc/openvpn/jikka:
iroute 実家ネットワーク ネットマスク

お互いにルーティングしないといけないので、冗長なようでも両方指定しろ、と書いてあります。

さて、server.conf の続き。
いるかどうか分からなかったのだけれど、一応 DNS と WINS を広告します。

push "dhcp-option DNS DNS-Server-IP-Address"
push "dhcp-option WINS WINS-Server-IP-Address"

そして、VPN の中で、他のクライアントマシンとも通信できるようにしたいので、以下の設定を入れます。

client-to-client

これを入れておかないと、各 Client は、Server しか見られません。
まぁ、これが必要なのは、モバイルノートから実家が見たい、とかの場合だけでしょうけれど。

あと、Server は FreeBSD なので、セキュリティのために以下の設定を有効にします。

user nobody
group nobody

こんなところで、Srver の設定は完了です。
Firewall に穴を開けて、Server を起動します。
とその前に、rc.conf に設定を。。。

#-- OpenVPN Settings --
openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
openvpn_dir="/usr/local/etc/openvpn"

これで、/usr/local/etc/rc.d/openvpn start すれば、動き出します。

Sat Sep 19 16:07:15 2009 OpenVPN 2.0.6 i386-portbld-freebsd7.2 [SSL] [LZO] built on Sep 19 2009
Sat Sep 19 16:07:15 2009 Diffie-Hellman initialized with 1024 bit key
Sat Sep 19 16:07:15 2009 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sat Sep 19 16:07:15 2009 TUN/TAP device /dev/tun0 opened
Sat Sep 19 16:07:15 2009 /sbin/ifconfig tun0 10.8.0.1 10.8.0.2 mtu 1500 netmask 255.255.255.255 up
Sat Sep 19 16:07:15 2009 /sbin/route add -net 10.8.0.0 10.8.0.2 255.255.255.0
add net 10.8.0.0: gateway 10.8.0.2
Sat Sep 19 16:07:15 2009 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Sat Sep 19 16:07:15 2009 GID set to nobody
Sat Sep 19 16:07:15 2009 UID set to nobody
Sat Sep 19 16:07:15 2009 UDPv4 link local (bound): 202.229.46.99:1194
Sat Sep 19 16:07:15 2009 UDPv4 link remote: [undef]
Sat Sep 19 16:07:15 2009 MULTI: multi_init called, r=256 v=256
Sat Sep 19 16:07:15 2009 IFCONFIG POOL: base=10.8.0.4 size=62
Sat Sep 19 16:07:15 2009 IFCONFIG POOL LIST
Sat Sep 19 16:07:15 2009 Initialization Sequence Completed

とかログが出れば成功です。


さて、次は Client です。
実家にはまだ帰っていないので、実家の設定は試せません (だから、その1なの)
というわけで、モバイルノートの設定をします。

sample-config-files の client.conf を下地にします。
というか、Windows 版なので、client.ovpn ファイルですね。
設定をいじるのは、remote 指定です。
ここで、OpenVPN Server を指定します。

remote Server-IP-Address 1194

1194 は、ポート番号です。
鍵の位置も指定しなきゃなりません。

ca d:\\win32apps\openvpn\\keys\\ca.crt
cert d:\\win32apps\openvpn\\keys\\mobile.crt
key d:\\win32apps\openvpn\\keys\\mobile.key

実行時ディレクトリを指定する方法が分からなかったので、フルパス指定です。。。orz
\ は、エスケープして書かないといけないそうです。

あとは、他の設定項目が Server と合っているかを確かめましょう。
ポート設定 (1194)、プロトコル (udp)、comp-lzo あたりを入念に。
これで設定は終わりです。

さっそく、繋いでみましょう。
Server の時と似たようなログが表示されれば、接続完了です。
Windows Vista だと、route 追加に失敗して、パラメータが間違っています、とか言うエラーが出ます。
結局、route.exe にお願いして、ルート設定しているようです。
心配なら netstat -r すること。


さて、最初、Samba に接続できなくて焦りました。
当たり前です。
Samba の設定を直さなきゃいけません。
今回の設定では、10.8.0.0/24 のネットワークから参照があるので、これを待ち受けないといけません。

hosts allow = 自宅ネットワーク 127.0.0.0/8 10.8.0.0/24

とかします。
これで、繋がるようになりました。

・・・\\Server-LAN-IP-Address\共有名 とかしないと繋がらないのはなんでだろう。
DNS 引けてるのに、\\サーバ名\共有名 じゃ、繋がらないんだよね。
まぁ、IP Address 指定すれば使えるからいいけど。
これは、先送りだなぁ。


さて、実家のネットワークと繋ぐことは出来るでしょうか。
楽しみ。

AntiVirus Scanner を導入

さて、予告通り、AntiVirus Scanner の導入です。

今回は、フリーの Clam AntiVirus Scanner (ClamAV) を採用しました。
Postfix との橋渡しには、AMaViS を使います。
AMaViS には、amavis, amavis-perl, amavisd-new, amavisd-ng と種類があるのですが、amavisd-new しかサポートもメンテもしてません、って書いてあるので、amavisd-new を使います。
と言って調べたら、FreeBSD の ports には amavisd-new しかないのでした。
でも、2004 年から更新止まってる感じね。

さて、そんなわけで、インストールするのは、
security/clamav
security/amavisd-new
です。

amavisd-new は、依存で山ほど port が入ります。
SpamAssassin も入るんだよね。。。orz
でも、使いません。
# 二重チェックしてもいいけど、バカっぽい

さて、まずは ClamAV の設定。
が、ほとんどデフォルトのままで問題ないです。
ログの設定をちょこっといじったくらい。

まぁ、ログは詳しく見たいし、時間も欲しいよね、ってことで。

LogFileMaxSize 2M
LogTime yes
LogVerbose yes


さて、次は AMaViS の設定です。

今回、オプションを指定しないでインストールしたので、vscan ユーザ/グループでインストールされちゃいました。
vscan は、McAfee VirusScan らしいです。
が、そんな物使いません。
今回使用するのは ClamAV なので、それを使うように設定します。
ClamAV のデーモンを使うためには、
AMaViS が ClamAV のユーザで動くか、
ClamAV が AMaViS のグループに属して、かつ、AllowSupplementaryGroups しないといけないみたいです。
どうせ ClamAV しか使わないので、AMaViS を ClamAV ユーザ/グループで動かします。
インストール時に作成された amavisd のディレクトリが、軒並み vscan:vscan なので、これを clamav:clamav に変更します。
変更の必要があったのは、
/var/amavis
/var/virusmails
もう一個くらいあった気がするけど、どれだっけ。。。
ちなみに amavisd-new のインストール時に
AMAVISUSER=clamav AMAVISGROUP=clamav
しておけば、良きに計らってくれたらしいです。

さて。
設定の変更点を挙げていきましょう。

今回は SpamAssassin を使った spam チェックはしないので、

@bypass_spam_checks_maps  = (1);  # controls running of anti-spam code

を有効にします。

ユーザの設定も変えておきます (オプション付きでインストールしたら要らないはず)

$daemon_user  = 'clamav';     # (no default;  customary: vscan or amavis), -u
$daemon_group = 'clamav';     # (no default;  customary: vscan or amavis), -g

ドメイン設定を自ドメインに。

$mydomain = 'example.com';   # a convenient default for other settings

ネットワークの設定も変えましょう。

@mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10
                  10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 );

チェックに引っ掛かった場合の動作もカスタムを。

$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;
$bad_header_quarantine_method = undef;

ウィルスメールだったら、破棄 (VirusAlert 監視ユーザにコピーが行きます)
配送不可は送信元に送り返し。
spam は配送許可 (今回は作動しない)
壊れたヘッダを持つメールも配送許可。
にしてみました。
個人的には、ウィルスメールも配送させたいんですが、家族は訳も分からず exe とかクリックしちゃうと思うので、泣く泣く削除。
VirusAlert に飛んでくるメール見てニヤニヤすることにします。

$banned_filename_re = new_RE(

という項目を全部消さないと、添付ファイルが軒並み送れなくなります。
デフォルトだと、exe, dll, pif, scr, rpm, cpio, tar, application/x-msdownload, application/x-msdos-program, application/hta, vbs, bat, cmd, com, cpl あたりが送れません。
ウィルスだったら送らない、んじゃなくて、拡張子/suffix がそれだったら送らせない、と言う酷い設定。
全解除です。

そして、ClamAV との連携部分がコメントアウトされているので、これを有効にします。

# ### http://www.clamav.net/
 ['ClamAV-clamd',
   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
   qr/\bOK$/m, qr/\bFOUND$/m,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
# # NOTE: run clamd under the same user as amavisd, or run it under its own
# #   uid such as clamav, add user clamav to the amavis group, and then add
# #   AllowSupplementaryGroups to clamd.conf;
# # NOTE: match socket name (LocalSocket) in clamav.conf to the socket name in
# #   this entry; when running chrooted one may prefer socket "$MYHOME/clamd".

# ### http://www.clamav.net/ and CPAN  (memory-hungry! clamd is preferred)
# # note that Mail::ClamAV requires perl to be build with threading!
# ['Mail::ClamAV', \&ask_clamav, "*", [0], [1], qr/^INFECTED: (.+)/m ],

ソケット部分は、デフォルトが /var/run/clamav/clamd になっているので、ClamAV の設定に合わせます。
/var/run/clamav/clamd.sock に修正。

これで完了です。


次に、Postfix の設定も変えます。

まず、main.cf.

content_filter = smtp-amavis:[127.0.0.1]:10024

を追加します。
これだけです。

次に、master.cf.
以下を追加します。

smtp-amavis unix -      -       n       -       2       smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookup=yes
127.0.0.1:10025 inet n  -       n       -       -       smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

判定返りを待つ部分が、ガチガチの設定になってますが、こんなもんでしょう。


さて、rc.conf の設定です。

ClamAV を有効に。

#-- Clam AntiVirus Scanner Settings --
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

clamav_freshclam というのは、ClamAV のデータベースを最新に保ってくれるデーモンです。
有効にしましょう。

さて、次に AMaViS の有効化。

#-- AMaViSd-new Settings --
amavisd_enable="YES"

出来たら、順次起動しましょう。

/usr/local/etc/rc.d/clamav_clamd start
/usr/local/etc/rc.d/clamav_freshclam start
/usr/local/etc/rc.d/amavisd start
/usr/local/etc/rc.d/postfix restart

これで完成です。

が。
AMaViS が、初回起動だけエラーを吐きました。

(!!)TROUBLE in child_init_hook: BDB no dbS: Lock table is out of available
locker entries, . at (eval 97) line 27.
(!)_DIE: Suicide in child_init_hook: BDB no dbS: Lock table is out of
available locker entries, . at (eval 97) line 27.

こんな感じ。
メールが一切送受信できなくなって焦りました。

一回全部止めて、起動し直したら問題なくなったんだよね。。。
BerkeleyDB のエラーらしいんだけど、何だったんだろう。。。
海外では、このエラーが報告されてて、BerkeleyDB をアップデートしろとか書いてあったんだよね。
なんか、これ謎みたいで、
$enable_db = 0;
にしたら起動した。
とか、そのあと $enable_db = 1; にしても問題なくなった、とか。
まぁ、動いてるから、気にしないことにしよう。

さて、なにかメールを送ってみましょう。

X-Virus-Scanned: amavisd-new at example.com

みたいなヘッダがあれば、OK です。

次に、実際にウィルスメールを送ってみましょう。
と言っても、1701 cascade くらいしか持っていないので。
ウィルスメールを送るサービスを利用します。

http://www.securesystems.co.jp/eicar.shtml
http://www.eicar.org/anti_virus_test_file.htm

これで、送ったアドレスにはメールが届かず、VirusAlert アカウントにメールのコピーが届けば完璧です。


無事動いたので、メールサーバの設定は終わりっ!



さて、タイムリーなことに、これを設定していたときに freebsd-stable ML に amavisd-new port の苦情が上がりました。
曰く、「port を upgrade したら、動かなくなった! 調べてみたら、amavisd.conf をデフォルトに上書きされちゃってた! バックアップしてたから実被害はなかったけど、ユーザがエディットしたコンフィグを消す port なんて見たことないから驚いた。 このバグ、どこに文句言えばいい?」
まぁ、「port maintainer に言え」 と言う至極真っ当な回答が返ってましたが。
なるほど、upgrade したら、設定ファイルを上書きされてしまうわけだな。
ちょっと覚えておかないといけませんね。

2009/09/17

bsfilter を仕込む

メールサーバが稼働したのですが、家族にも使わせるので、スパムフィルタを仕込もうと思ったのです。

スパムフィルタには様々ありますね。

POPFile
SpamAssassin
bogofilter

あたりがメジャーどころでしょうか。
# ベイジアンフィルタしかないやんけ、とか言わないように

色々調べてみた結果、bsfilter を使うことに決めました。

本当は、SpamAssassin を使おうかと思っていたのですけれど。
bogofilter も、C で書かれていて軽い、と言う点で魅力的だったのですけれど。
bsfilter は、独自に日本語に対応している、と言う点で日本人が使うならこれが良さそうだ、と判断しました。
ryby スクリプトなので、重さが気になるんですけどね。
# それを言ったら SpamAssassin は Perl じゃないか、とか言われそう


bsfilter 単体では、うまく日本語の文章から単語を切り出すことが出来ません。
なので、外部の形態素解析器を使います。
形態素解析器というのは、日本語の文章の中から、単語分けして切り出してくれるものだと思っといて下さい。
というか、bsfilter は、そう言う目的でしか使ってません。

使用できる形態素解析器は3つ。
和布蕪 (めかぶ)
茶筅 (ちゃせん)
案山子 (かかし)

今回は、和布蕪を使うことにしました。
本当は茶筅を使おうとしたのですけれど、調べたら和布蕪の方が良さそうだったので。
和布蕪は、茶筅がベースで、精度はほぼ同等、速度は倍以上、と言うことだそうです。

と言うわけで、追加インストールするのは、
mail/bsfilter: bsfilter 本体
japanese/ja-mecab: 和布蕪本体
japanese/ja-ruby-mecab: 和布蕪の Ruby バインディング
japanese/ja-mecab-ipadic: 和布蕪の辞書
となります。

bsfilter を ports からインストールすると、オプション選択で和布蕪と茶筅と案山子とを選ぶことが出来ます。
ここで和布蕪にチェックを入れておけば、和布蕪と Ruby バインディングは、依存で入ります。
ただし。
和布蕪の辞書は入れてくれないので、これだけは自分で入れる必要があります。
入れ忘れると、bsfilter 実行時に、「辞書がない!」 って怒られちゃいます。

さて。

bsfilter は、データディレクトリとして、$HOME/.bsfilter を使います。
設定も、ここに用意してやります。
内容はこんな感じ。

$HOME/.bsfilter/bsfilter.conf
jtokenizer mecab
insert-flag
insert-probability
auto-update

これで、
形態素解析器として和布蕪を指定
X-Spam-Flag: ヘッダを追加
X-Spam-Probability: ヘッダを追加
自動データベース更新
を指定したことになります。

あとは、データベースの用意です。
手元に、今まで受信した 7,000 通あまりの spam と、1,000 通あまりのメールがあるので、これを使います。

通常は、

bsfilter -c ~/Maildir/cur/*
bsfilter -s ~/Maildir/spam/cur/*

ってやって下さい、って言うところなんですが。。。
spam が 7,000 通あまりもあると、Argument too long! って言われちゃいまして (^”^;;;
仕方がないので、bsfilter に IMAP で読みに行ってもらいました。

bsfilter --imap --imap-server サーバ名 --imap-user ユーザ名 --imap-password パスワード -s inbox.spam

すんごく時間掛かりました。
どこにもログ更新などはされないので、思わず

tcpdump -i lo0 port imap

して見ちゃいました (笑)

クリーンメールもデータベースに突っ込んで。
で、データベース更新。

bsfilter -u

しばらく待っていれば、データベースができあがります。
あとは使うように設定するだけ。

一応、システム全体でこれを有効にするのは怖いので、各ユーザごとに使うようにしました。
ので、.forward で指定するわけだ。
んが、フィルタしてヘッダ付けて貰うだけ、って言うのをシンプルにやる方法が思いつかなかったので。
将来的に、自動振り分けも視野に入れて、procmail 使いました。

そんなわけで、.forward は、こんな感じ。

~/.forward
"| IFS=' ' && pmprog=/usr/local/bin/procmail && test -f $pmprog && exec $pmprog -Yf- .procmailrc.tamon || exit 75 #ユーザ名



レシピは、こんな感じ。

~/.procmailrc

PATH=$HOME/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$HOME/log/procmail.log
LOCKFILE=$HOME/.lockmail

:0 fw
| bsfilter --pipe

まさに、フィルタ処理してるだけ (笑)
procmail にしてみれば、役不足でしょう。
フォルダ自動振り分けレシピを書く気力がないので、この辺 SeaMonkey に任せっぱなしです。


今のところ、全ユーザで有効にするので、全ユーザでこの処理をやります。
設定ファイルなんかはコピーですが、データベースだけは怖いので、正規の手順通りに。

 bsfilter --export-clean > clean.list.txt
 bsfilter --export-spam > spam.list.txt

して、各ユーザごとに

 bsfilter --import-clean > clean.list.txt
 bsfilter --import-spam > spam.list.txt
 bsfilter -u

を実行。

今のところ、すり抜けはあっても誤認はないので、他のユーザの奴は、spam 判定されたら spam フォルダへ振り分けました。
レシピは、こんな感じ。

 ~/.procmailrc
  PATH=$HOME/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
  MAILDIR=$HOME/Maildir
  DEFAULT=$MAILDIR/
  LOGFILE=$HOME/log/procmail.log
  LOCKFILE=$HOME/.lockmail
  
  :0 fw
  | bsfilter --pipe
  
  :0 H
  * ^X-Spam-Flag: Yes
  $MAILDIR/.spam/


さて。

誤認されたら、再学習させなきゃいけません。
で、使用説明書には、

 bsfilter -S -c -u clean_mail
 bsfilter -C -s -u spam_mail

しなさい、とか書いてあるわけだ。
しょうがないので、メールの中身だけ転送すればいいように、拡張アドレスでちょこっとやりました。
# spam のヘッダなんか、偽装されてるかなんかで、まともな情報ないだろ、って言ういい加減な考え

 ~/.procmailrc.toclean
  :0 fw
  | bsfilter -S -c -u --pipe
  
  :0
  /dev/null

 ~/.procmailrc.tospam
  :0 fw
  | bsfilter -C -s -u --pipe
  
  :0
  /dev/null

何やってんだおまえ、って言われそうです (^”^;;;
まぁ、これで乗り切っていくことにしてみますよ。


次は、AntiVirus スキャナか・・・

2009/09/13

courier-imap をインストール

postfix を入れて、メールの配送が出来るようになったので、メールは読めなくっちゃね。

というわけで、courier-imap をインストール。
あ、postfix のローカル配送は、Maildir 形式ですよ、もちろん。
# じゃないと、courier-imap は使えない

設定は、/usr/local/etc/courier-imap/ の imapd と imapd-ssl を、ちょいといじるだけでほぼ完了。
ろくなマニュアルがないけど、設定ファイルのコメントに十分すぎるほど書いてあるので、問題にならないと思います。
メインの仕事は、/usr/local/etc/userdb をちまちま作って makeuserdb すること。

userdb には、home, mail の指定があるので、ここで mailbox をきちんと指定。
バーチャルホストにも対応できる。
パスワードは、CRAM-MD5 が hmac-md5, CRAM-SHA1 が hmac-sha1 らしい。


忘れがちなのが、/etc/syslog.conf と /etc/newsyslog.conf.
それぞれ、設定をしましょう。

/etc/syslog.conf: (追加分のみ)

!imapd
*.* /var/log/imapd
!imapd-ssl
*.* /var/log/imapd-ssl


/etc/newsyslog.conf: (追加分のみ)

/var/log/imapd 640  7   100 *     JC
/var/log/imapd-ssl 640  7   100 *     JC


これが出来れば、おしまい。
syslogd に HUP シグナル送って、courier-imap を起動するだけ。
これで問題なく動きました。


全然チェックしていなかった root のメールをチェックしたら、
crontab の書き方ミスって、コマンド実行ごとにエラーメール飛んでたり、
なんか凄いアタックログが飛んできてたりして、
かなりびっくりしました (^^;
やはり root のメールはチェックしないとダメですね。。。

2009/09/12

postfix をインストール

やっと、メールサーバの設定が出来るようになったので、postfix を入れてみました。

うちのネットワーク構成

<The Internet> <-> Broadband Router <-> <DMZ Network> <-> Gateway <-> <LAN> <-> Server

つまり、postfix は、Gateway と Server に入れて、
Gateway では、The Internet からのメールを受信し Server へ転送と、内部からの送信メールの配送。
Server では、Gateway からのメールの受信/ローカル配送と、内部から送信されたメールを Gateway へ配送を依頼。
と言うことをさせるわけだ。

ついでに、Gateway では、
SMTP-AUTH で認証されたクライアントからは、外部宛のリレーの許可。
バーチャルドメイン2つのホスティング。
もやる。
もっとも、バーチャルドメイン宛のメールも、Server でローカル配送するわけで、Server にもバーチャルドメインの設定は必要。

色々設定例を探したけれど、一番役に立ったのは、postfix の
BASIC CONFIGURATION README
SASL README
STANDARD CONFIGURATION README
VIRTUAL README
でした。
付属ドキュメントは読みましょう > σ(__;

設定 Tips は、これが全てでした。
なお、例に従って、Gateway では、ローカル配送を禁止しました。
なので、root 宛に来る security report などは、Server に転送されてきます。

あ、Cyrus-SASL support を有効にしましたが、これの設定は、情報が錯綜していますが、
平文認証で、PAM などで認証するなら
/usr/local/lib/sasl2/smtpd.conf:
pwcheck_method: saslauthd
mech_list: plain login
などとし、Challenge/Response 認証をするなら
/usr/local/lib/sasl2/smtpd.conf:
  pwcheck_method: auxprop
  auxprop_plugin: sasldb
  mech_list: cram-md5 digest-md5
などとやるべし。


これで一通りの設定終わり。
レジストラが提供している DNS をちょちょいといじって MX レコードを設定して、
外部からのメールがきちんとローカル配送できて、
内部からは、問題なくメールが配送できたので、
今度は、外部からのリレーチェック。

・・・smtp サーバが反応しませんでした。
おんやぁ?
色々試して、パケットフィルタログ見て、おかしくない。。。
パケットキャプチャしたら、接続が来ていませんでした。

・・・OP25B か!
submission ポートに切り替えて、再試行。
"STARTTLS を実行して下さい!"
TLS 設定してないけどな。。。
TLS 接続で再試行。
"STARTTLS は、サポートされません"
デスヨネー。

色々探したら、ありました。
 master.cf:
  submission inet n       -       n       -       -       smtpd
  > #  -o smtpd_tls_security_level=encrypt
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
   -o milter_macro_daemon_name=ORIGINATING

submission port での待ち受けには、問答無用で TLS 使うように設定されていたのでした。
コメントアウトして。

問題なく動くようになりました。

2009/09/07

CUPS でハマる

うちの File Server は、やらせたいことが多いので、まだまだ設定しなくちゃいけないんですが。
postfix とか courier-imap とか入れたいし。


でも、今のところ山ほどエラーを吐いてる CUPS が先決問題。
これをクリアしないと、凄い勢いで /var/log/messages がローテートしまくって、エラーログが見られない状況を打破できない。


と言うわけで、色々情報調べてやってみた。


へー、いきなりデーモン起動して Web Interface から設定するのかー。
コンフィグゴリゴリ書かないとダメなのかと思って、未起動だったわ。
プリンタを追加。
設定。
テストページ印刷。


。。。プリンタ停止。
と言うか、うんともすんとも言わずにジョブが止められてる。


うちのプリンタは、いろいろな印刷方法に対応しているので、いろいろなインターフェースで試すも。。。
エラー出て、動かない。。。orz


エラーログ吐くようにして見てみたら。
filter のシーケンスのところで、
「プリンタから、300秒後に応答がありませんでした!」
と言うエラーが、一瞬で出て終わってる。
ちょっと待ってー。
なんだよ、それー。


調べても分からなかったので、諦め。


エラーログは、samba が 「cups が上がってないぞゴルァ!」 って叫んでいるだけなので、CUPS Server だけ起ち上げたことで解消。
印刷できないけど、もういいや。




というか、うちのプリンタ、ネットワークプリンタだから、UNIX から印刷できなくても、全然困らないんだよね。
UNIX から印刷するにしても、PostScript プリンタだから、さして困らないんだよね。
もう、LPD でいいです (苦笑)

2009/08/19

通信が遅い

通信が遅くて困ったちゃんの、実家 PC。

ちゃんと調べてみました。

Radish での測定結果。
下り/上り: 10Mbps /30Mbps

なんじゃそりゃ、ってなもんです。
ちなみに、別のマシンをつなぐと、30Mbps とか 65Mbps とか出ます。
ルータの所為でも LAN ケーブルの所為でもない、と。。。

試しに、LAN 内でファイル転送させて、上り下りのスピード、計ってみました。
75Mbps とか出てるしー。。。orz

NIC が死んでる、と思っていたマシン。
NIC は、無事なのかもしれない。。。


MTU/MRU/MSS の問題では、なさそうなんですがー?
怪しいパケット、いなかったし。
他に、どんな原因があるんだろう。

2009/08/13

トラフィックモニタ その2

この間から色々探し回っていたトラフィックモニタ。
ようやく、それなりの物が見つかった。

インタフェース全てについて、リアルタイムでスループットを表示してくれる物: nload
インタフェースを指定して、リアルタイムで個々のコネクションごとのスループットを表示してくれる物: trafshow

これで、昔の ntop にあった機能は、揃った。

うん、幸せ。

2009/08/12

トラフィックモニタ

Gatway サーバのスループットが悪く、色々悩み中。
どうも、NIC が壊れているくさいのだが。

で、スループットを測りたい。
出来れば、各コネクションごとの。

昔は、ntop を使えば、コンソールでモニタできたはずなのだが。
最近の ntop は、なにやら凄いことになってて、デーモンとして常駐して、HTTP で詳細なグラフを表示するようになっていた。
が。
個々のスループットなどは調べようもなく。。。

昔の ntop に相当するツールは、ないものだろうか。。。

そして、FreeBSD ports リストを眺める日々。

2009/08/10

ブラウザ

この Blog ページ。
投稿しようとすると、SeaMonkey では、IME からの入力を確定したあと、フォーカスが外れておかしなことになる事態頻発。
同様のことが、Hotmail のページなどにも言える。
何か入力をトラップしているところがおかしいのだろうけれど、調べる気力無し。
この Blog を更新するためだけに、Google Chrome を入れたわたしは、根性無し。。。orz

RSS Reader も、iGoogle に入れてしまったからなぁ。
Google さまさまだ。

仮想環境

Windows 内に、仮想環境を作りたかったのです。
Windows 98 SE の。
単に、昔のゲームがやりたいだけだったんですけどね。


最初に試したのは、VirtualPC 2007。

Bootable CD のメディアを持っていなかったので、かなり苦労。
結局、iso イメージどころか、Virtual HDD を VirtualServer の vhdmount 使ってマウントして、CD コピーしたという。。。orz
そいでもって、DOS 起動ディスクを XP で作って、そこからインストール。
しかし、端と気がついた。
USB MIDI Port が使えん。 〓■●_

ここから、迷走が始まる。


次に試したのが、VirtualBox。

CD は iso イメージを用意して、マウント。
FD は、VirtualPC に入れた Win98SE で、起動ディスク作って準備。
ところが、CD-ROM ドライバの読み込みで固まる。
仕方がないので、config.sys いじって有効なドライバ以外、全部殺す。
今度は、物理 FDD を使うと、ディスクの交換を検知してくれない。
結局、FD もイメージ作成。
イメージからインストール。

・・・激重!orz
Win98SE がタコで、HLT 命令使ってないかららしいのだけれど。
CPU Cooler ソフト入れても、重すぎる。
そして、ネットワーク有効にしたんだけど、Web は見られるのに、LAN の Samba Server にアクセスできないという・・・

ここで、挫折。


次に、QEMU チャレンジ。
Windows 版は、ここ (http://homepage3.nifty.com/takeda-toshiya/)。

VirtualBox の基礎技術だみたいなことが書いてあって、ダメそうな臭いプンプン。
CD iso イメージマウントして、FD イメージマウントして。。。
起動しない。。。orz
エラー調べたら、\ をエスケープする必要があるらしい。
-fda h:\vm\win98se_setup1.img
じゃなくて、
-fda h:\\vm\\win98se_setup1.img
てな具合に。

そして、FD チェンジ。
あれ?

(qemu) change fda h:\\vm\\win98se_setup2.img
device not found.

(qemu) eject fda
device not found.

だめだこりゃ。
デバイス指定子分からないから、手出しできず。
結局、1 枚だけで完結する Setup Disk 作成。
インストール。

ネットワークデバイスが見えない。
どうやら、PCI PnP ドライバがダメなことになってる。
これを、ドライバ更新で、「PCI バス」 を選択。
これで再起動すると、どんどん読み込まれていく。

NE2000 PCI デバイスに関しては、Realtek 8029 ドライバを使用。
これで使える。

そして、やっぱり起きました。
Web は見られるけど、LAN の Samba Server にアクセスできない。
調べないといけないけど、萎え。


次は、QEMU で VMWare の HDD イメージ作って、VMWare Player かなぁ。。。
(イメージは、作成済み)

PulseAudio でハマる

FreeBSD 7.2-RELEASE-p3 の環境に、PulseAudio を入れてみた。

昔、4-Stable の頃に、mpg123 と xmms を使っていて、X では Enlightment を使っていたのだけれど。
当時、esound に悩まされていた。
X 起動しちゃうと、esound がデバイス握るから、殺さないと xmms で音が鳴らなかったり、mpg123 使って cron で鳴らしてる時報が鳴らなかったり、いろいろあった。

これの解決策を延々探していて、PulseAudio を知ったのだけれど。
訳の分からない、と言うより、要らないとしか言えない画像ライブラリとかまでたくさん入れられた挙げ句、X 起動しないと起動しそうにないデーモンに嫌気がさして、色々解決策を探ってた。
結局は、X 上げないと使えなさそうなモジュールを読まないようにしたのだけれど。

ネットで検索掛けたら、

なんで、PulseAudio なんか使ってるの?
それは、音源周りが混沌としてる Linux に於ける Linux 上の解決策でしかない。
FreeBSD では、標準の OSS で、十分に実装されていて、新たに PulseAudio を入れるのは、トラブルを招く元。
標準の OSS で不都合がある場合は、ports から OSSv4 を入れなさい。

という、コメント発見。

そうか、ってなもんで、さっくり PulseAudio は、uninstall。
OSSv4 を入れて、試してみている。
X 使ったらどうなるか、実験しないとな。。。

作ってみた

とりあえず、技術的な話を含め、PC 周りの話を書くための場所。
主に、備忘録。