私は会社では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サーバにつけさせるのでしょうけど(っていうか本当はそっちのほうがいいんだろうけど)ここではちょっと変わった方法でやってみたいと思います。
ダイアルアップアクセスでプロバイダに接続する場合、PPPで接続しますが、このとき、自分のマシンのPPPインタフェースに対してDHCPにより動的にIPアドレスが割り振られます。このIPアドレスに対するホスト名を使えば正しいMessage Idを作れそうです。従って、PPP接続した際に自動的に割り振られたIPアドレスに対するホスト・ドメイン名を調べ、これを用いてpostfixが動くようにすればよいと思います。
ここでは、PPP接続にPPxPを使用するものとして設定の方法を紹介したいと思います。
postfixの設定ファイルであるmain.cf内には自ホストのFQDNを設定するためのmyhostname行があります。ここにFQDNを設定すればいいのですが、接続していないときは設定しようがありませんので、仮設定として以下のようにしておきます。
myhostname = fly.localhost
"fly.localhost"というのはローカルにつけた自ホスト名です。また、このmain.cfをテンプレートファイルとして用いるため、main.cf.templateというファイル名でコピーしておきます。
通常の設定ならば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が実行されることになります。
接続時にpostfixの設定を変えるのならば、当然、切断時にも設定を元に戻す必要がありそうです。切断時は/etc/ppxp/ip/droutedownが実行されますので、上記のように1行追加して以下のようにしましょう。
$ cat /etc/ppxp/ip/droutedown iproute del default ipconfig down postfix.rc down
さて、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
以上で、設定完了です。制限事項として、オフライン時は相変わらず正しいMessage Idにはなりませんが、それは目をつぶってください。また、/etc/ppxp/main.cfを書き換えるのですからユーザー権限では当然書き換えはできず、それなりの権限が必要になってきます。ユーザ権限でppxpを使用する場合は/etc/ppxp/rc/postfix.rcのパーミッションを適切に設定してください。