Vine Garden ロゴ
Last updated: 03 February, 2001

[ TOP | Vine Garden | Prebious | Next ]

postfixに正しいMessage Idをつけさせる

はじめに

私は会社ではLAN経由でインターネットに接続できるし、自分のマシンにも固定IPアドレスをつけているのでまったく問題はありません。しかし、自宅ではダイアルアップアクセス環境であり、固定IPアドレスはなく、DHCPサーバーから動的にIPアドレスをもらっています。当然、グローバルに通用する固定したFQDNなんてありません。

一方、メールやニュースのMessage Idは全世界でユニークなものでなければいけないという決まりがあります。そのため、一般的にMessage Idは以下のような形式になっているのが普通です。

"<" + 日付 + "." + 英数字の文字列 "@" + FQDN + ">"
正しい例:<20010201124029.8067F1E1EC@Cutnm4DS09.tcg.mesh.ad.jp>

マシンのFQDNが正しく設定できていないと、例えば自分で適当につけた名前などにしているとMessage Idのユニーク性が失われてしまいます。なぜなら、同じ名前のマシンがもしかしたら他にも存在するかもしれないからです。

ユニーク性が失われた例:<20010201124029.8067F1E1EC@fly.localhost>

従って、ダイアルアップ環境でpostfixを運用する場合、いかに正しいFQDNを取得するかが課題となります。もちろん、普通はpostfixではMessage Idはつけさせず、プロバイダのSMTPサーバにつけさせるのでしょうけど(っていうか本当はそっちのほうがいいんだろうけど)ここではちょっと変わった方法でやってみたいと思います。

正しいFQDNを入手する

ダイアルアップアクセスでプロバイダに接続する場合、PPPで接続しますが、このとき、自分のマシンのPPPインタフェースに対してDHCPにより動的にIPアドレスが割り振られます。このIPアドレスに対するホスト名を使えば正しいMessage Idを作れそうです。従って、PPP接続した際に自動的に割り振られたIPアドレスに対するホスト・ドメイン名を調べ、これを用いてpostfixが動くようにすればよいと思います。

ここでは、PPP接続にPPxPを使用するものとして設定の方法を紹介したいと思います。

設定の方法

/etc/postfix/main.cfの設定

postfixの設定ファイルであるmain.cf内には自ホストのFQDNを設定するためのmyhostname行があります。ここにFQDNを設定すればいいのですが、接続していないときは設定しようがありませんので、仮設定として以下のようにしておきます。

myhostname = fly.localhost

"fly.localhost"というのはローカルにつけた自ホスト名です。また、このmain.cfをテンプレートファイルとして用いるため、main.cf.templateというファイル名でコピーしておきます。

/etc/ppxp/ip/drouteupの編集

通常の設定ならばPPxPは接続を確立した際に/etc/ppxp/ip/drouteupを実行します。

$ cat /etc/ppxp/ip/drouteup
ipconfig $(IP.LOCAL) $(IP.REMOTE) $(IP.NETMASK) $(IF.MTU)
#iproute addnet $(IP.NETWORK) $(IP.NETMASK)
iproute add default $(IP.REMOTE)

ここで、$(IP.LOCAL)というのが自分のマシンに割り振られたIPアドレスです。これを使えばうまく行きそうです。以下のように1行追加しましょう。

ipconfig $(IP.LOCAL) $(IP.REMOTE) $(IP.NETMASK) $(IF.MTU)
#iproute addnet $(IP.NETWORK) $(IP.NETMASK)
iproute add default $(IP.REMOTE)
postfix.rc up $(IP.LOCAL)

これで、PPxPでの接続確立時にpostfix.rcが実行されることになります。

/etc/ppxp/ip/droutedownの編集

接続時にpostfixの設定を変えるのならば、当然、切断時にも設定を元に戻す必要がありそうです。切断時は/etc/ppxp/ip/droutedownが実行されますので、上記のように1行追加して以下のようにしましょう。

$ cat /etc/ppxp/ip/droutedown
iproute del default
ipconfig down
postfix.rc down

/etc/ppxp/rc/postfix.rcの編集

さて、drouteupとdroutedownに追加したpostfix.rcですが、/etc/ppxp/rc/の下に置くことにします。内容は以下のとおりです。あとの説明のために連番で行番号をつけてあります。実際のファイルの内容は2行目から始まります。

スクリプトファイルの内容

 1: $ cat /etc/ppxp/rc/postfix.rc
 2: #!/bin/sh
 3:
 4: PATH=/usr/sbin:/sbin:/usr/bin:/usr/local/bin:/bin
 5: export PATH
 6:
 7: case "$1" in
 8:     up)
 9:         # loging connect time
10:         echo -ne "`/bin/date`\t" >> /var/log/ppxp.log
11:
12:         # get FQDN from local ip-address and record to log
13:         fqdn=`nslookup $2 | grep "Name:" | sed -e "s/^Name:[ \t]\{1,\}\(.\{1,\}\)/\1/"`
14:         echo -e "$2\t$fqdn" >> /var/log/ppp-up.log
15:
16:         # separate FQDN to hostname and domainname
17:         domain=`echo $fqdn | sed -e "s/^[^.]\{1,\}\.\(.\{1,\}\)/\1/"`
18:         hname=`echo $fqdn | sed -e "s/\(^[^.]\{1,\}\)\..\{1,\}/\1/"`
19:
20:         # rewrite main.cf and restart postfix
21:         sed -e "s/^myhostname = fly\.localhost/myhostname = $fqdn/g" /etc/postfix/main.cf.template > /etc/postfix/main.cf
22:         /etc/rc.d/init.d/postfix reload
23:         ;;
24:     down)
25:         # loging disconnect time
26:         echo `/bin/date` >> /var/log/ppxp.log
27: 
28:         # rewrite main.cf and restart postfix
29:
30:         cp /etc/postfix/main.cf.template /etc/postfix/main.cf
31:         /etc/rc.d/init.d/postfix reload
32:         ;;
33: esac
34:
35: exit 0

スクリプトファイルの説明

10行目
接続を開始した日時を/var/log/ppxp.logに書き出します。
13~14行目
nslookupを使ってIPアドレスからFQDNを逆引きし、FQDNの部分を取り出してfqdnにセットしています。そして/var/log/ppp-up.logにIPアドレスとFQDNを書き出します。
17~18行目
今回は使用していませんが、sendmailを使う場合はFQDNをさらにhostnameとdomainnameに分離する必要がありますのでそのための記述です。
21~22行目
今回の核心の部分です。/etc/postfix/main.cfの中の"myhostname = fly.localhost"と書いた部分を、nslookupで逆引きしたFQDNに書き換え、postfixを再起動しています。
26行目
切断した日時を/var/log/ppxp.logに書き出しています。
30~31行目
main.cfを元に戻し、postfixを再起動しています。

最後に

以上で、設定完了です。制限事項として、オフライン時は相変わらず正しいMessage Idにはなりませんが、それは目をつぶってください。また、/etc/ppxp/main.cfを書き換えるのですからユーザー権限では当然書き換えはできず、それなりの権限が必要になってきます。ユーザ権限でppxpを使用する場合は/etc/ppxp/rc/postfix.rcのパーミッションを適切に設定してください。