Postfix 2.2Postfix 2.2ではIPv6 (IPバージョン6) プロトコルのサポートが 組み込まれました。古いバージョンのPostfixにおけるIPv6サポートはアドオン パッチとして得られます。以下の "Postfix <2.2 IPv6 サポートとの互換性" セクションでこれらの実装の違いを議論しています。
興味深い主な特徴は、IPv4が使っている32ビットではなく、IPv6が128ビットの IPアドレスを使っていることです。そのため、NATのような醜いトリックを 使わなくても、はるかに大量のホストやネットワークに対応することができます。 膨大なアドレス空間の副次的な利点として、ネットワークスキャニングが 非現実的になるということがあります。
Postfixは古いIPv4ネットワークですでに使っているのと同じプロトコルをIPv6でも 使い、DNSでは古いAレコードに加えてAAAAレコードの検索もおこないます。 IPv6に関する情報は http://www.ipv6.org/ で見つけられます。
このドキュメントは以下のトピックに関する情報を提供します:
Postfixバージョン2.2は以下のプラットホームでIPv4およびIPv6をサポート しています:
他のプラットホームでは、Postfixはこれまで通り単にIPv4を使います。
IPv6サポートを他の環境にポーティングするためのtipsは 以下を参照してください。
Postfix IPv6サポートによって2つの新しい main.cf 設定パラメータが導入され、 また mynetworks や debug_peer_list のような マッチリストのアドレス表記法の文法に重要な変更がなされました。
Postfix IPv6アドレスの文法は少しトリッキーです。"[]" 文字でIPv6 アドレスを括らなければいけない場所があり、括ってはいけない場所もあります。 "[]" で括らなければいけない場所だけで "[]" を使うのが よい考えです。Postfixで動くIPv6関連の設定をする場合には毎回 postconf(5) マニュアルページを確認してください。
master.cf で 127.0.0.1 と ::1 ループバックアドレスを ハードコーディングする代わりに、main.cf で "inet_interfaces = loopback-only" を指定してください。こうすることで、PostfixがIPv6を有効にしたシステムで 動いているかどうかに関わらず、同じ master.cf が使えます。
最初の新しいパラメータは inet_protocols と呼ばれる ものです。これはPostfixがネットワーク接続を張る際および受ける際に使う プロトコルを指定し、またPostfixがネットワーク接続する際に使うDNS検索を 制御します。
/etc/postfix/main.cf: # このパラメータを変更したらPostfixを stop/start しなければ # いけません。 inet_protocols = ipv4 (デフォルト: IPv4のみ有効) inet_protocols = all (IPv4と、サポートされていればIPv6ともに有効) inet_protocols = ipv4, ipv6 (IPv4とIPv6ともに有効) inet_protocols = ipv6 (IPv6のみ有効)
デフォルトでは、ほとんどのシステムがIPv6ネットワークに接続していないため、 PostfixはIPv4のみを使います。
IPv4/IPv6スタックが結合したシステムでは、IPv6を通したメール配送の 試行は常に "network unreachable" で失敗し、これらの試行によってPostfixが 遅くなってしまいます。
LinuxカーネルはデフォルトではIPv6プロトコルサポートを読み込みすら しません。IPv6を使おうとする試行は即座に失敗します。
注意1: inet_protocols 設定パラメータを変更したら、Postfixを stop してから start しなければ いけません。
注意2: 以下のようなエラーメッセージが出た場合、Linuxを動かしていて、 カーネルでIPv6を有効にする必要があります: ヒントやtipsは http://www.ipv6.org/ を参照してください。 他のシステムと違い、LinuxはIPv4とIPv6の結合したスタックを持たず、IPv6 プロトコルサポートはデフォルトでは読み込まれません。
postconf: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol postconf: warning: inet_protocols: configuring for IPv4 support only
注意3: 古いLinuxやSolarisシステムでは、 "inet_protocols = ipv6" という 設定でもPostfixがIPv4接続を受けてしまうことを止められません。しかし PostfixはクライアントIPアドレスをIPv6形式で表します。それ以外の場合、 Postfixは常にIPv4クライアントIPアドレスをドットで区切られた4組という 伝統的な形式で表します。
もう一つの新しいパラメータは smtp_bind_address6 です。 これはちょうどIPv4での smtp_bind_address パラメータが おこなっているのと同様に、IPv6での外行きSMTP接続に使うローカルインターフェース アドレスを設定します:
/etc/postfix/main.cf: smtp_bind_address6 = 2001:240:5c7:0:250:56ff:fe89:1
mynetworks パラメータの値を デフォルトのままにしておくと (つまり main.cf に mynetworks の設定がない場合)、 Postfixは自分自身でネットワークアドレスが何かを見つけます。典型的な設定では 次のようになります:
% postconf mynetworks mynetworks = 127.0.0.0/8 168.100.189.0/28 [::1]/128 [fe80::]/10 [2001:240:5c7::]/64
main.cf で mynetworks パラメータの値を指定してしまっているのであれば、システムがあるIPv6 ネットワークを含むように mynetworks を更新する必要があります。IPv6アドレス情報が次のように "[]" の中に 指定していることを確認してください:
/etc/postfix/main.cf: mynetworks = ...IPv4 networks... [::1]/128 [2001:240:5c7::]/64 ...
注意: mynetworks や debug_peer_list のような Postfixマッチリストを設定する場合、main.cf パラメータの値や "/file/name" パターンで指定されるファイルの中では、IPv6 アドレス情報を "[]" の中に 指定しなければいけません。IPv6アドレスは ":" 文字を含んでいるため、そうしないと "type:table" パターンと混同して しまいます。
外行き接続試行のIPv6/IPv4の順序はまだ設定可能ではありません。現在は IPv6がIPv4の前に試行されます。
現在PostfixはIPv6クライアントIPアドレスに対するDNSBL (リアルタイム ブラックホールリスト) 検索をサポートしていません。現時点ではIPv6アドレス空間を カバーしたブラックリストはありません。
IPv6にはクラスA、B、Cといったネットワークはありません。IPv6 ネットワークでは、 "mynetworks_style = class" という設定は "mynetworks_style = subnet" という設定と同じです。
Tru64UnixとAIXでは、Postfixはローカルサブネットマスクを見つけられない ため、常に /128 ネットワークを想定します。これは main.cf で "mynetworks_style = subnet" を設定していて、明示的に mynetworks を設定していない場合にのみ問題となります。
Postfixバージョン2.2のIPv6サポートはDean StrikなどによるPostfix/IPv6 パッチを基にしていますが、いくつか小さな点で違いがあります。
main.cf: inet_interfaces は "ipv6:all" や "ipv4:all" といった記法をサポートしません。代わりに inet_protocols パラメータを 使います。
main.cf: IPv4とIPv6の両方をサポートするには "inet_protocols = all" もしくは "inet_protocols = ipv4, ipv6" を 指定します。
main.cf: inet_protocols パラメータはメール配送時や受信時にPostfixがおこなおうとするDNS検索の対象も 制御します。
main.cf: ループバックネットワークインターフェースのみをlistenするには "inet_interfaces = loopback-only" を指定します。
lmtp_bind_address および lmtp_bind_address6 機能は取り除かれました。 Postfix LMTPクライアントはSMTPクライアントに吸収されたため、LMTPクライアントの 追加機能を持ち続ける理由がありません。
SMTPコマンドにおけるIPv6アドレスは RFC 2821 に書かれているように [ipv6:ipv6address] という形で指定されていることを、 SMTPサーバは要求するようになりました。
IPv6ネットワークアドレスのマッチングコードは一から書き直され、仕様に 近いものになったはずです。その結果はPostfix/IPv6パッチと互換性がないかも しれません。
他のプラットホームでPostfix IPv6を動かすには、以下のステップを踏みます:
Postfixがローカルネットワークインターフェースを見つける方法を 指定します。Postfixはメーラループを避け、user@[ipaddress] がローカルか リモートの配送先のどちらかを知るのにこの情報を必要とします。
システムに getifaddrs() ルーチンがあれば、src/util/sys_defs.h の プラットホームごとのセクションに以下のものを加えます:
#ifndef NO_IPV6 # define HAS_IPV6 # define HAVE_GETIFADDRS #endif
それがなくて、SIOCGLIF ioctl() コマンドが /usr/include/*/*.h にあれば、 src/util/sys_defs.h のプラットホームごとのセクションに以下のものを加えます:
#ifndef NO_IPV6 # define HAS_IPV6 # define HAS_SIOCGLIF #endif
それもなければ、Postfixは古い SIOCGIF コマンドを使わなければならず、 機能を落としたIPv6 ("mynetworks_style = subnet" で必要なIPv6ネットマスクを見つけられません) を使うことになります。 これを src/util/sys_defs.h のプラットホームごとのセクションに加えます:
#ifndef NO_IPV6 # define HAS_IPV6 #endif
Postfixがインターフェース情報を見つけられるかテストします。
通常の方法でPostfixをコンパイルしたら、src/util ディレクトリに入り、 "make inet_addr_local" とタイプします。このファイルを手で動かすと、 すべてのインターフェースアドレスやネットマスクが出ます。例えば:
% make % cd src/util % make inet_addr_local [... some messages ...] % ./inet_addr_local [... some messages ...] ./inet_addr_local: inet_addr_local: configured 2 IPv4 addresses ./inet_addr_local: inet_addr_local: configured 4 IPv6 addresses 168.100.189.2/255.255.255.224 127.0.0.1/255.0.0.0 fe80:1::2d0:b7ff:fe88:2ca7/ffff:ffff:ffff:ffff:: 2001:240:5c7:0:2d0:b7ff:fe88:2ca7/ffff:ffff:ffff:ffff:: fe80:5::1/ffff:ffff:ffff:ffff:: ::1/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
上は古いFreeBSDマシンのものです。他のシステムでは少し違う結果となりますが、 考え方はわかるでしょう。
使える結果が全く出ない場合には、postfix-users@postfix.org メーリング リストにEメールを送れば、我々が手助けしようとするでしょう。
以下の情報は一部Dean Strikが編集した情報を基にしています。
Mark Huizer はオリジナルのPostfix IPv6パッチを書きました。
KAMEプロジェクトの Jun-ichiro 'itojun' Hagino はかなりの改良を おこないました。以降、KAMEパッチと呼びます。
PLD Linuxディストリビューションはコードを他のスタック (特に USAGI) に ポーティングしました。これをPLDパッチと呼んでいます。PLDパッチの非常に 重要な特徴は、Lutz Jaenicke のPostfix用TLSパッチと共に動くことでした。
Dean Strik は KAME および USAGI 以外のプラットホームにIPv6サポートを 広げ、Postfixの開発に合わせてパッチを更新し、IPv6+TLSパッチを結合して 提供しました。彼の努力に関する情報は Dean Strik のPostfixウェブサイト http://www.ipnet6.org/postfix/ で見つかります。
Wietse Venema は Dean Strik のIPv6パッチを取り込み、Postfix 2.2に マージし、IPv4専用のコードで取り除けるものはPostfixから取り除く機会を 得ました。カーネルやシステムライブラリでIPv6サポートのないシステムでも、 Postfixには単純な互換レイヤがあるため、以前と同様IPv4を使い続けます。