SOHO のための Postfix 設定

（以下は、[Postfix Small/Home Office Hints and Tips](http://www.postfix.org/SOHO_README.html) の翻訳です。間違いがあったらごめん。）

この文書は SOHO で Postfix を使う場合のヒントとコツを見つけやすいように一つにまとめたものだ。メールを送信する側の話だけをする。君のマシンがメールを直接には受け取っていない場合（つまり、マシンが独自のインターネット・ドメイン名や固定の IP アドレスを持ってない場合）は、メール受信のために "fetchmail" みたいなものが必要になるだろう。で、そういう話はこの Postfix の文書では扱わない。

+ [STANDARD_CONFIGURATION_README](http://www.postfix.org/STANDARD_CONFIGURATION_README.html) から選んだトピック
    + スタンドアロンのインターネット・ホスト上の Postfix
    + 本当のインターネット・ホスト名を持たないホスト上の Postfix
+ [SASL_README](http://www.postfix.org/SASL_README.html) から選んだトピック
    + PostFix の SMTP クライアントで SASL 認証を有効にする
    + 送信者別の SASL 認証を設定する

これらについての更に詳しい情報は、[STANDARD_CONFIGURATION_README](http://www.postfix.org/STANDARD_CONFIGURATION_README.html) と [SASL_README](http://www.postfix.org/SASL_README.html) を参照して欲しい。

## スタンドアロンのインターネット・ホスト上の Postfix

直接のインターネット・アクセスを持つスタンドアロンのマシン上では、Postfix は「箱から出す」だけで何もいじらなくても動く筈だ。少なくとも、http://www.postfix.org/ から Postfix のソース・コードをダウンロードした場合は、Postfix はそういう風にインストールされる。

**"postconf -n"** というコマンドを使うと、君の [main.cf](http://www.postfix.org/postconf.5.html) によって、どの設定が上書きされているかを知ることが出来る。スタンドアロンのホストでは、いくつかのパス名の設定以外は、[BASIC_CONFIGURATION_README](http://www.postfix.org/BASIC_CONFIGURATION_README.html) で触れられていないパラメータはあまりいじらない方が良い。

```:/etc/postfix/main.cf:
# オプション: user@hostname でなく user@domainname でメールを送信する
#myorigin = $mydomain

# オプション: NAT/proxy の外部アドレスを指定する
#proxy_interfaces = 1.2.3.4

# 選択肢 1: 他のホストからのメールを中継しない
mynetworks_style = host
relay_domains =

# 選択肢 2: ローカルのクライアントからのメールだけを中継する
# mynetworks = 192.168.1.0/28
# relay_domains =
```

これが君の設定に当てはまる場合は、"本当のインターネット・ホスト名を持たないホスト上の Postfix" の章も読んで欲しい。

## 本当のインターネット・ホスト名を持たないホスト上の Postfix

この章では、自分自身のインターネット・ホスト名を持たないホストを扱う。典型的には、DHCP やダイヤル・アップを通じて、動的 IP アドレスを取得するシステムのことだ。君がそのホストに架空の名前を付けていても、そのマシン上のアカウント間に限るなら、Postfix でメールの送受信をすることが出来る。けれども、インターネットにメールを送り出すときには、メール・アドレスに架空のホスト名を使うことは出来ない。なぜなら、誰も君のメールに返信することが出来なくなるからだ。また、実際のところ、存在しないドメイン名を持ったメール・アドレスを拒絶するサイトがだんだん多くなっている。

注意 : 以下の情報は Postfix のバージョンに依存する。Postfix がどのバージョンかを知るためには、**"postconf mail_version"** コマンドを実行すること。

### 解決策 1: Postfix version 2.2 以降

Postfix 2.2 は [generic(5)](http://www.postfix.org/generic.5.html) アドレス・マッピングを使って、ローカルの架空のメール・アドレスを正当なインターネット・アドレスに置き換える。このアドレス・マッピングは、メールがマシンから出て行くとき**だけ**に実行される。同じマシン上のユーザ間でメールを送信するときには実行されない。

以下のサンプルが追加の設定を示している。これを、この文書の前半で述べた基本的な設定情報と結合しなければならない。

```
1 /etc/postfix/main.cf:
2     smtp_generic_maps = hash:/etc/postfix/generic
3 
4 /etc/postfix/generic:
5     his@localdomain.local      hisaccount@hisisp.example
6     her@localdomain.local      heraccount@herisp.example
7     @localdomain.local         hisaccount+local@hisisp.example
```

メールが SMTP でリモート・ホストに送信されるとき :

+ 5 行目 : `his@localdomain.local` を his の ISP メール・アドレスで置き換える。
+ 6 行目 : `her@localdomain.local` を her の ISP メール・アドレスで置き換える。そして、
* 7 行目 : その他のローカル・アドレスを +local というアドレス拡張子を付けた his の ISP アカウントで置き換える（この例では、ISP が "+" スタイルのアドレス拡張子をサポートしていると仮定している）。

君のシステムが **db** でなく **dbm** ファイルを使っているなら、**hash** の替りに **dbm** を指定すること。Postfix がどのルックアップ・テーブルをサポートしているかを知るには、**"postconf -m"** コマンドを使う。

generic テーブルを変更するたびに、**"postmap /etc/postfix/generic"** コマンドを実行すること。

### 解決策 2 : Postfix version 2.1 以前

古い Postfix システムでの解決策は、可能な限り正当なインターネット・アドレスを使う、ということだ。そして、Postfix に正当なインターネット・アドレスをローカルの架空のアドレスにマップさせる。そうすれば、インターネットにもローカルの架空のアドレスにも、メールを送信できる。ローカルの架空のアドレスが自分自身の正当なインターネット・アドレスを持っていなくても大丈夫だ。

以下のサンプルが追加の設定を示している。これを、この文書の前半で述べた基本的な設定情報と結合しなければならない。

```
 1 /etc/postfix/main.cf:
 2     myhostname = hostname.localdomain
 3     mydomain = localdomain
 4 
 5     canonical_maps = hash:/etc/postfix/canonical
 6 
 7     virtual_alias_maps = hash:/etc/postfix/virtual
 8 
 9 /etc/postfix/canonical:
10     your-login-name    your-account@your-isp.com
11 
12 /etc/postfix/virtual:
13     your-account@your-isp.com       your-login-name
```

翻訳しよう。

+ 2 - 3 行目 : ここで架空のホスト名を置き換える。インターネット上で実在する組織によって既に使われているドメイン名を使ってはいけない。[RFC 2606](http://tools.ietf.org/html/rfc2606) を見ると、誰にも所有されないことが保証されているドメイン名のサンプルが分る。
+ 5,  9, 10 行目 : この部分が `your-login-name@hostname.localdomain` から `your-account@your-isp.com` への変換を提供する。ここは必須だ。
+ 7, 12, 13 行目 : `your-account@your-isp.com` へのメールを ISP に送信せず、ローカルに配信する。この部分は必須ではないが、あると便利だ。

君のシステムが **db** でなく **dbm** ファイルを使っているなら、**hash** の替りに **dbm** を指定すること。Postfix がどのルックアップ・テーブルをサポートしているかを知るには、**"postconf -m"** コマンドを使う。

canonical テーブルを変更するたびに、**"postmap /etc/postfix/canonical"** コマンドを実行すること。

virtual テーブルを変更するたびに、**"postmap /etc/postfix/virtual"** コマンドを実行すること。

## PostFix の SMTP/LMTP クライアントで SASL 認証を有効にする

この章では、Postfix の SMTP クライアントが全てのメッセージを SASL 認証を要求するメール・ゲートウェイ・サーバを通じて送信する場合の典型的なシナリオを扱う。

### トラブル解決のヒント

+ メール・ログファイルに "SASL authentication failure: No worthy mechs found" というエラーが記録されて、SASL のログインが失敗する場合は、["Postfix SMTP/LMTP client policy - SASL mechanism properties"](http://www.postfix.org/SASL_README.html#client_sasl_policy) の章を参照すること。
+ SASL 認証の失敗が、何か訳の分らんものである場合は、["Postfix SMTP/LMTP client policy - SASL mechanism names"](http://www.postfix.org/SASL_README.html#client_sasl_filter) を読むと良い。

例を読みやすくするために、二つの部分に分けて記述する。最初の部分が基本的な設定を担当し、第二の部分がユーザ名とパスワードの情報を設定する。

### 基本的な設定

```:/etc/postfix/main.cf
smtp_sasl_auth_enable = yes
relayhost = [mail.isp.example]
# 別の形式 :
# relayhost = [mail.isp.example]:submission
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
```

+ **smtp_sasl_auth_enable** の設定が SMTP クライアント認証を有効にする。クライアントのユーザ名とパスワードの情報は第二の部分で設定する予定だ。
+ **relayhost** の設定によって、Postfix の SMTP はすべてのリモート・メッセージを、宛先に直接配信しようとするのをやめて、指定されたメール・サーバに送信するようになる。
+ **relayhost** の設定で、ホスト名を **"["** と **"]"** で囲むと、Postfix の SMTP クライアントは MX (mail exchanger) レコードを参照しなくなる。
+ **relayhost** の宛先には既定値以外の TCP ポートを指定することが出来る。例えば、[mail.isp.example]:submission という別の形式を使うと、Postfix に TCP のポート 587 に接続すべきことを指定できる。TCP の 587 ポートはメール・クライアント・アプリケーションのために予約されているポートだ。
+ Postfix の SMTP クライアントは、EHLO コマンドに対して標準的でない "AUTH=method...." 形式の応答を返す SMTP サーバにも対応している。この件で Postfix クライアントの追加設定は不要だ。
+ Postfix の SMTP クライアントは廃止された "wrappermode" プロトコル (SMTP サーバの TCP ポート 465 を使う) には対応していない。stunnel コマンドを使う解決策を [TLS_README](http://www.postfix.org/TLS_README.html) で参照して欲しい。
+ **smtp_sasl_password_maps** のパラメータで、Postfix の SMTP クライアントがメール・ゲートウェイ・サーバにユーザ名とパスワードを送信するように設定する。 次の章で述べるように、Postfix の SMTP クライアントは複数の ISP アカウントをサポートしている。この理由によって、ユーザ名とパスワードが保存されるテーブルには、メール・ゲートウェイ・サーバごとに一組のユーザ名とパスワードが格納されている。

### ユーザ名とパスワードの設定

```:/etc/postfix/sasl_passwd:
# 宛先                          認証情報
[mail.isp.example]              username:password
# 別の形式 :
# [mail.isp.example]:submission username:password
```

### 重要
SASL クライアントのパスワード・ファイルは /etc/postfix に保存し、ファイルを root に対してのみ読み書き可能にして、ユーザ名とパスワードを他のユーザから保護すること。こうしておいても、Postfix の SMTP クライアントは SASL クライアントのパスワードを読むことが出来る。Postfix の SMTP クライアントは root としてファイルをオープンして読んだ後に権限を放棄する（またはオプションで指定された chroot jail に入る）。

+ /etc/postfix/sasl_passwd ファイルを変更するたびに **postmap** コマンドを使用すること。
+ **relayhost** の宛先で **"["** と **"]"** を指定した場合は、**smtp_sasl_password_maps** のファイルでも同じ形式を使わなければならない。
+ **relayhost** の宛先で標準でない TCP ポート (":submission" や ":587") を指定した場合は、**smtp_sasl_password_maps** のファイルでも同じ形式を使わなければならない。

## 送信者別の SASL 認証を設定する

Postfix では、送信者のアドレスによって ISP のアカウントを変えることが出来る (Version 2.3 以降)。この機能は、一人の人が同じマシンを仕事と私用の両方に使う場合や、違う ISP アカウントを持つ複数の人が同じ Postfix サーバを共用する場合に役に立つだろう。

これを可能にするために、Postfix は送信者ごとの SASL パスワードと送信者ごとのリレー・ホストをサポートしている。下記の例で示すように、Postfix の SMTP クライアントは、SASL パスワード・ファイルを読んで、**relayhost** のためのユーザ名とパスワードを取得する前に、送信者アドレスのためのユーザ名とパスワードを取得する。また、同じように、Postfix の [trivial-rewrite(8)](http://www.postfix.org/trivial-rewrite.8.html) デーモンが送信者ごとの **relayhost** ファイルを検索して、指定がない場合にのみ既定の **relayhost** 設定を採用する。

```:/etc/postfix/main.cf
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
relayhost = [mail.isp.example]
# 別の形式 :
# relayhost = [mail.isp.example]:submission
```

```:/etc/postfix/sasl_passwd
# 送信者ごとの認証情報; /etc/postfix/sender_relay も参照
user1@example.com               username2:password2
user2@example.net               username2:password2
# 既定の relayhost のためのログイン情報
[mail.isp.example]              username:password
# 別の形式 :
# [mail.isp.example]:submission username:password
```

```:/etc/postfix/sender_relay
# 送信者ごとのプロバイダ情報; /etc/postfix/sasl_passwd も参照
user1@example.com               [mail.example.com]:submission
user2@example.net               [mail.example.net]
```

+ 君の創造力が豊かであれば、二つのテーブルを単一の MySQL データベースに結合して、それぞれの Postfix のクエリを設定して適切な情報を取得できるようにすることも可能だ。
+ 君のシステムが **db** でなく **dbm** ファイルを使っているなら、**hash** の替りに **dbm** を指定すること。Postfix がどのルックアップ・テーブルをサポートしているかを知るには、**"postconf -m"** コマンドを使う。
+ sasl_passwd テーブルを変更するたびに、**"postmap /etc/postfix/sasl_passwd"** コマンドを実行すること。
+ sender_relay テーブルを変更するたびに、**"postmap /etc/postfix/sender_relay"** コマンドを実行すること。

## 設定例

参考までに、僕が自宅のイントラネットに立てた linux サーバの Postfix の設定例を示します。これは翻訳じゃありません。

### 設定ファイル

```:/etc/postfix/main.cf
...
relayhost = [foo.bar.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login
smtp_generic_maps = hash:/etc/postfix/generic
```

**smtp_sasl_security_options** および **smtp_sasl_mechanisim_filter** の設定は、たいていの場合、上記のようにすれば良いでしょう。うまく行かない場合は、これらのキーワードでググれば、いろいろと情報が（日本語のものも含めて）沢山出てきます。

### パスワード・ファイル

```:/etc/postfix/smtp_passwd
[foo.bar.com]:587 	hoge:piyopiyo
```

### アドレス・マップ・ファイル

```:/etc/postfix/generic
@linux.myhome.net	hoge@foo.bar.com
```

この linux サーバからのメール送信は、logwatch なんかが発信する管理者宛のものに限られているので、ごく簡単なマップで済ませています。

### 設定反映
```
$ sudo postmap hash:/etc/postfix/smtp_passwd
$ sudo postmap hash:/etc/postfix/generic
$ sudo /etc/init.d/postfix restart
```