Warning: Error while sending QUERY packet. PID=5469 in /home/uls/public_html/wordpress/wp-includes/class-wpdb.php on line 2351 FreeBSDな生活

2006.07.29

Spamメール対策・・・(mail)

メールを良く使う人は誰でも「迷惑メール」に悩まされていることでしょう。
プロバイダーのメールアカウントを使っている方は、最近ではプロバイダーが「迷惑メール」対策サービスを提供しているので、それらを利用されている方も多いと思いますが、自前でメールサーバを立てていると、自分で防ぐ以外に方法はありません。 以下に小生のサーバで行っている対策について記述します。

1. accessファイルで制限

FreeBSDでは/etc/mailにaccessというファイルがあるので、この中に制限したいメールアドレスを書きます。

From:hotmail.co.jp                    REJECT ・・・・・・・?
tw               REJECT・・・・・・・・?
From:abcdxyz@        REJECT・・・・・・・・?
From:xyz@aaa.bbb.com        REJECT・・・・・・・?

などですが、上の例の?ではhotmai.co.jpから来るメールを全て拒絶しますし、?ではtw(台湾)からくるメールは全て拒絶します。
?はドメイン名によらず、abcdxydのアカウント名もつメールを拒絶するもので、fuck@とかpussy@などのエッチなアカウント名を拒絶するのに便利です。
?はずばり決め打ちでの拒絶例です。
しかし、知り合いでhotmailを使っている、台湾に友人がいるなどのときは困りますので、知人、友人だけは通すように設定します。 下記は例外を付けた例ですが、chijinn, yuujinをそれぞれの方のアカウント名とします。

chijin@                     RELAY
yuujin@              RELAY
From:hotmail.co.jp              REJECT
tw                  REJECT
From:abcdxyz@              REJECT
From:xyz@aaa.bbb.com            REJECT

これで、まずchijinn@, yuujin@が評価され、それ以降の設定によらず受け取れます。
また、REJECTの変わりに 550 User unknownと書けば相手には受け取れない理由として
User unknownとして通知されます。
もちろん、特定アドレス向けを拒絶することもでき、

To:stuv@xxxx.cccc.co.jp         REJECT

と書くことも出来ます。
accessのファイルが出来たら、sendmailが参照できるようにするため、access.dbを作成し、sendmailを再起動すれば設定が反映されます。

# makemap hash /etc/mail/access < /etc/mail/access
# kill -HUP <PID>

<PID>はsendmailのPIDで cat /var/run/sendmail.pidで番号を調べておきます。

2. Greet Pauseの設定

spamメールの送信者は次々と新しいアドレスで送りつけてくるのでaccessによる制限だけでは、なかなか防げません。
そこで、有効なのがGreet Pauseを入れるという方法です。
Grret Pauseを理解するために、メールの送受信のやり方を知る必要がありますが、例えばabc@xxx.yyyy.comにメールを送信するときは、送信側のサーバが相手側にメールを送信しても良いか問い合わせ、相手側から受け取れる旨の返事を待って実際のメールを送信します。
この相手からの返事をグリーティングメッセージと呼んでいます。
ところが、グリーティングメッセージは相手のメールサーバが忙しいと返事が遅れますので「迷惑メール」の送信者は数を稼ぐために、グリーティングメッセージを待つことなく勝手にメールを送り出します。
そこで、メール送信の問い合わせがあったとき、グリーティングメッセージをわざと少し遅らせ、返事を返していないのに勝手に送りつけてくるメールは「迷惑メール」と判断して捨ててしまうようにします。
通常のメールサーバなら1〜2分程度でも問題なく待ってくれるのですが、小生のところではとりあえず5秒遅らせることにしました。
それでは、設定ですが、簡単です。 sendmailにはGreet Pause機能が用意されています。
/etc/mailにsendmail.mcの名前のファイルがあるので、次の1行を追加します。

FEATURE(`greet_pause',`5000')dnl

mSec単位なので、5000で5秒遅らせることになります。
あとは、以下のようにfreebsd2.mcからfreebsd2.cfを作ってfreebsd2.cfをsendmail.cfにコピーしsendmaiを再起動でお終いです。 /etc/mailディレクトリー内で作業します。

# make freebsd2.cf
# cp freebsd2.cf sendmail.cf

効果はテキメンでした。 ほとんと拒否できています。
なお、デフォルト値は5秒ですが、acccessに以下のように書いておくと、特定のアドレスを0にしたり、もっと大きくしたり出来ます。

GreetPause:nakama.yoiserver.co.jp 0
GreetPause:abc.xyz.co.jp                 200

はっきりと問題ないと分かっているサーバは0にしておくのもエチケットでしょうか(相手の処理を遅らせるので)。


2006.05.01

FreeBSD-6.1RC1でXwindow・・・(FreeBSD)

今まで、FreeBSDはserverとしての利用に重きをおいていたため、Xwindow 関係の設定については書かないできた。 私のClient PCのグラフィックカードがsis630でFreeBSD-6.0では Xwindowがうまく立ち上がらないということもあった。
ところが、 FreeBSD-6.1RC1を入れたら簡単に立ち上がったので、少しXwindowをいじくってみた。

1.インストール

distributions.jpg
インストール自体は6.0と同じだが、Xwindowを使うためインストールはX-developerを選択する。

2. Window Managerのインストールと日本語関係の準備

  (1) Window Manager
     Window Managerはやはり一番洗練されていると思われるKDEを選んだ。
     packageからkde-3.5.1, ja-kde-i18n-3.5.1.tbzを選んでインストールする。
  (2) kterm, kinput2, canna, jvim3
     日本語の使用を可能とするため、packageからja-kterm-6.2.0_7.tbz,   
     ja-kinput2-canna-3.1_2.tbz, ja-jvim-canna-3.0.j2.1a_1を入れておく。 
     これでcannaも同時に入る。

3.Xwindowの立ち上げ

xorg1.jpg
Xwindowを立ち上げるためxorgcfgコマンドを打ち、mouse, keybord, graphic cardならびにdisplayの同期周波数を設定し、結果を/etc/X11に保存する。
/etc/X11にxorg.confが出来あがるので、これでXwindowが立ち上がる準備が出来たので、startxと打ってDefaultのtwm(一番簡単なWindow Manager)が立ち上がることを確認する。

4.日本語関係の設定

(1) cannaの起動を自動化するため、/etc/rc.confに canna_enable=”YES”の1行を追加する。
(2) 自分のHome Directoryにある.profileに次の3行を追加する。

LC_ALL=ja_JP.eucJP;    export LC_ALL
LANG=ja_JP.eucJP;      export LANG
XMODIFIERS=@im=kinput2; export XMODIFIERS

  (3) .inputrcファイル
      自分のHome Directoryに.inputrcのファイルを作成し下記の3行を入れておく。

set convert-meta off
set meta-flag on
set output-meta on

5.KDEの立ち上げ準備

/usr/X11R6/lib/X11/xinitrcの中にあるxinitrcを自分のHome Directoryにコピーし、ファイル名を.xinitcに変え以下のように最後の部分を修正する。

# start some nice programs
#/usr/X11R6/bin/twm &
#/usr/X11R6/bin/xclock -geometry 50x50-1+1 &
#/usr/X11R6/bin/xterm -geometry 80x50+494+51 &
#/usr/X11R6/bin/xterm -geometry 80x20+494-0 &
#exec /usr/X11R6/bin/xterm -geometry 80x66+0+0 -name login
kinput2 -canna &
sleep 3
exec startkde

ここまで準備が出来たら、一度rebootしてcannaも起動させloginしてstartxでKDEを起動する。
起動の過程で国と言語を選択する画面が出るので国は日本、言語は日本語を選んでおく。
もちろん、この設定はコントロールセンタで「国と言語」を選べば後でも自由に選択できる。

6.ktermの設定

無事KDEが起動したら、今後の作業に備えてまず最初にktermを使えるようにします。
タスクバーもしくは画面上にktermのiconを置き、これをクリックするとktermが起動するようにする。
タスクバー上でマウスの左クリックで非KDEアプリケイションの追加を選び、追加するアプリケーションのファイル選択で/usr/X11R6/bin/ktermを選び以下のように記述しておく。

/usr/X11R6/bin/kterm -sb -sl 250 -fn 10x20 -km euc

パラメータの意味を説明すると、

-sb     スクロールバーをつける
-sl 250  スクロールバッファーを250行確保する
-fn 使用文字を指定
-km 使用文字コードを指定

kterm -hと打つとその他にも沢山のオプションが存在するのが表示される。

7.その他のアプリケーション

後は好みだが、私はpackageでfirefoxの日本語版とgimpを入れ、portsからxineと、linux-realplayerを入れて動画再生も出来るようにした。
なお、xineをportsから入れるにはpackageのdevelのカテゴリーからlibtoolを入れておく必要があり、無いと途中でエラーで止まってしまう。
linux-realplayerを使うためにはインストールでlinux互換機能を入れておく必要があるが、入れていなければ
/usr/sbin/sysinstallを起動してdistributionからlinuxを追加でインストールする必要がある。

8.問題点

firefoxでどうしてもflashplayer-7.0がうまく動きません。
macromediaがacrobatのAdobeに吸収されてたときの騒動で、flashplayerの使用可能OSからFreeBSDが抜け落ちたため、律儀にFreeBSDで使えるようにportsを作らなかったようである。
署名運動も起こっているようで、いずれ誤解が解けて使えるようになると思っている。


2006.02.11

Movabletypeのページ分割・・・(Movabletype)

MTpaginateというpluginを使って、カテゴリーのページを分割する記事をよく見かける。
私のところでは、カテゴリー別ではまだそんなに大きなページになっていないが、トップページはさすがに大きくなってきたので、トップページのみページ分割することにした。
まず、MTPaginate.plでページ分割するためにはphpが動ける必要があるので、Packageで
php5-5.0.4_2 と  php5-extensions-1.0 を入れておく。
apacheのhttpd.confのLoadModuleの記述には下記の行が追加されていると思うが、無ければ追加する。
LoadModule php5_module libexec/apache2/libphp5.so
phpが動いているか否かは次の1行のファイルを作ってcheck.phpとでも名前を付けて保存し、ブラウザからアクセスしてみればよい。
<?php phpinfo(); ?>
phpの設定状況などの表示がなされるはずである。
次に、MTPaginate.zipをダウンロードして解凍したMTPaginate.plを /mt/pluginsディレクトリーに入れる。
準備が整ったのでメインページのテンプレートに以下の赤字部分を追加する。

<MTPaginate>
<MTPaginateIfMultiplePages>
<div class="mpage">
<$MTPaginateNavigator format_all="全部読む "
place_all="after" separator=" | ">
</div>
</MTPaginateIfMultiplePages>
<MTPaginateContent max_sections="10">
<MTEntries lastn="500">
----- 省略 ------
<$MTPaginateSectionBreak$>
</MTEntries>
</MTPaginateContent>
<MTPaginateIfMultiplePages>
<div class="mpage">
<$MTPaginateNavigator format_all="全部読む "
place_all="after" separator=" | ">
</div>
</MTPaginateIfMultiplePages>
</MTPaginate>

<MTEntries lastn=”500″> と </MTEntries> の場所を探してそこを基準にすると良い。
そして、テンプレートの出力ファイル名を index.htmlからindex.phpに変え、メインページの保存と再構築を行う。
最後にブログページ内に .htaccessのファイルを作って以下の1行を書いておく。
Redirect permanent /freebsd/index.html /http://uls.fam.cx/freebsd/index.php
これは従来通りindex.htmlにアクセスがあると、index.phpにリダイレクトするためである。
これで、アクセスすれば分割したページが表示される。 出来栄えはこのブログのトップページを見てください。


2006.02.02

NameVirtual サーバ・・・(Apache)

以前に1つのIPで2台のサーバを動かす方法を書いた。
一般的には、IPが1つもしくは2つで同一サーバ上で2つのドメインを扱う例は多いが、ここでは1つのサーバで物理的に2台のサーバへのアクセス方法についての試みの記述である。
ところが、サーバを新しく立ち上げ直したら、mod_proxyのmoduleが無く立ち上げられない事態に遭遇した。また、VirtualHost Directiveの書き方も追加修正が必要であることが分かった。
以下に方法を記すことにした。
当然あると思っていたmod_proxy.soが/usr/local/libexec/apache2に無く、既にstatic linkされているのかと思ったが、それも無い。
しかたが無いのでapache2をソースからコンパイルしてmoduleを得ることにした。
まず、ソースのダウンロードであるがダウンロードサイトのリストを見て適当なところから、httpd-2.0.55.tar.gz をダウンロードする。
次に展開してコンパイルするが、このときconfigureでproxyをsharedで指定してからコンパイルする。

# tar xvzf httpd-2.0.55.tar.gz
# cd httpd-2.0.55
# ./configure --enable-rewrite --enable-proxy=shared
# make

これで、modules/proxy/.libsの中にproxy関係のmoduleが
mod_proxy.so
mod_proxy_ftp.so
mod_proxy_connect.so
mod_proxy_http.so
の4つが出来るで、これを/usr/local/libexec/apache2内にコピーする。

# cd modules/proxy/.libs
# cp *.so /usr/local/libexec/apache2

これで、proxy関係のモジュールが得られたので、httpd.confを編集する。
まず、以下の2行の行頭の#を取り、proxy moduleをロードするようにする。

LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so

さらに、httpd.confの最後に以下を追加。

NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin hogehoge@uls.fam.cx
DocumentRoot /web/data
ServerName uls.flets.cds.ne.jp
ErrorLog /var/log/error_log
ProxyPass  /  http://192.168.1.6/
ProxyPassReverse  /  http://192.168.1.6/
</VirtualHost>

これで、apacheを再起動したら、私が使っている本来のドメイン名のuls.fam.cxでメインのサーバにアクセス出来、uls.flets.cds.ne.jpでアクセスすれば192.168.1.6のサーバにアクセス出来る。 出来るはずだった。
しかし、外部のproxy経由でアクセスしてみると、全て192.168.1.6に行ってしまう。
しばし、考えたが結局メインのサーバも以下のように追加で指定して解決した。

<VirtualHost *:80>
ServerAdmin hogehoge@uls.fam.cx
DocumentRoot /web/data
ServerName uls.fam.cx
ErrorLog /var/log/error_log
</VirtualHost>

Web関係だけであるが、簡単な設定でIPアドレスが1つでも2台以上のサーバが使えるので便利で素晴らしい。


2006.01.30

post2blogと携帯電話・・・(Movabletype)

昨日は、かなり強引なやり方でhtml形式でしか送れない携帯電話からのメールをpost2blogに引き渡すためのフィルターを書いたが、今朝目覚めると、なんともゴリゴリのフィルターで気になった. しかもhtml形式のメールの受け口とテキスト形式のメールの受け口を分けるのもどうかと思うようになった。
そこで、?単純なテキスト形式でテキストのみ、?テキスト形式だが画像添付あり、?html形式のメールで文章のみ、?html形式のメールで画像添付有りの4つのケースに分けてそれぞれの構成要素を再構築してpost2blogに引き継ぐフィルターを書いた。
若干解説すると、?、?のテキスト形式の場合は、そのままの状態でpost2blogに引き渡す。
?の場合は文章部分がプレインとhtmlにサブパートとして区切られているので、html部分を捨てプレインテキスト部分をテキスト形式の場合と同じになるよう、サブパートの区切り文字列の定義部分を取り除いた後に、サブの区切文字列をメインの区切り文字列(Headerで定義されたboundary)に置き換えた。
?も?と同じように、文章部分のhtml部を取り除き、画像添付部分はそのまま後ろに付けるようにしたものである。
問題は携帯電話の機種により送信ヘッダーが異なるのではと予想される事であるが、私のvodafone 902Tではヘッダーに

Content-Type: multipart/related;Type="multipart/alternative";
boundary="MMSPart_001_c3c794f7_a927_4812_b13e_b3365844b066"

とあり、multipart/relatedで添付ファイルがあるとの判断をするようにした。 普通のメーラーではmultipart/mixedである。
この辺のところは、携帯電話の機種によって異なると思われるので、個々に合わせて変更の必要があるのだろう。 ともかく文末に新しいフィルターのコードを載せて置く。
使い方は前回のと同じで /etc/aliasesもしくはホームディレクトリーの .forwardと名の付けたファイルに記述して使用する。

/etc/aliasesの場合 : 
inputaddress:   "| /usr/local/bin/html2text | /usr/local/bin/post2blog"
.forwardの場合 : 
"| /usr/local/bin/html2text | /usr/local/bin/post2blog"

これで、一応携帯電話からもOutlook Expressでhtml形式で複数の画像を添付してもうまく動いているようだ。
htmlからtext形式へのコンバート : html2text