メールサーバ IPv6 対応に向けて、設定ファイルの書式で解らなかったところのまとめ

下記、Debian GNU/Linux 6.0 squeeze の場合です。メールサーバ以外についでに SSH サーバも IPv6 でアクセス可能とします。

前提条件として、IPv4 で下記条件が全てそろっている状況のサーバに手を加えることとします。

  • 今回設定する sv.example.com サーバには、IPv4 と IPv6 アドレスが既に当たっていて、双方とも利用可能であるが、IPv6 については ip6tables で外部からの通信をドロップしていた。
  • example.com というドメインの MX レコードに設定されているサーバは mail.example.com で、このサーバの実体は sv.example.com であり、IPv4 アドレスのみゾーンファイルに書いてあり、IPv6 アドレスは返さない。
  • sv.example.com サーバでは、mail.example.com として、IPv4 における SMTP / POP3 / IMAP サーバ、及び SSH サーバが全て正常に設定されている。

※つまり、サーバには IPv4 も IPv6 もどちらのアドレスも当たっているのだけれど、メールサーバ類は、IPv4 でしか使用していない状況を想定しています。

  • POP3 / IMAP サーバの Dovecot の設定

    まずは、Dovecot を IPv6 でも Listen させます。

    /etc/dovecot/dovecot.conf

    listen = *, [::]

  • SMTP サーバの Postfix の設定

    つぎに、Postfix も IPv6 でも Listen させます。

    /etc/postfix/main.cf

    inet_protocols = ipv4, ipv6
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

    ※ mynetworks の部分も自ホストからの送出は出来る様に適宜修正。

  • SSH の IPv6 側ホスト制限

    これにはいくつか方法があって、TCP wrapper や ip6tables で行う方法等があります。また、鍵認証をしている場合は、各ユーザの authorized_keys の from=”” に設定する方法もあります。

    ・TCP wrapper で行う方法
    /etc/hosts.allow ファイルに下記のように設定します。

    # Allow sshd from xxxx:yyyy:zzzz::/48 over IPv6
    sshd: [xxxx:yyyy:zzzz::]/48

    また、/etc/hosts.deny ファイルに下記のように設定します。

    # Deny sshd
    sshd: ALL

    この例では、xxxx:yyyy:zzzz::/48 のネットワークからのみ、ssh での接続が可能となり、それ以外からは接続できなくなります。

    ・ip6tables で行う方法
    以下のように root 権限でコマンド入力します。

    ip6tables -A INPUT -p tcp --dport 22 -s xxxx:yyyy:zzzz::/48 -j ACCEPT
    ip6tables -A INPUT -p tcp --dport 22 -j DROP

    この例でも、xxxx:yyyy:zzzz::/48 のネットワークからのみ、ssh での接続が可能となり、それ以外からは接続できなくなります。

    ・各ユーザの authorized_keys の from で対応する方法

    サーバのログインに SSH の鍵認証を使用している場合、公開鍵を保存している ~/.ssh/authorized_keys ファイルで以下のように指定することで、その鍵とペアになる秘密鍵を用いて接続する場合の接続元を制限できます。

    from="xxxx:yyyy:zzzz::/48" ssh-rsa …

    この例では、該当の鍵を利用して接続する場合のみ、from で指定した IPv6 アドレスからのみアクセス可能となります。
    ※ from はカンマ区切りで IPv4 やホスト名も複数指定可能です。

  • ip6tables で通信するポートを空ける

    基本的に INPUT のポリシーが DROP であると想定して、tcp 22, 25, 587, 110, 143 を ip6tables で空けます。

    # ssh
    ip6tables -A INPUT -p tcp --dport 22 -s xxxx:yyyy:zzzz::/48 -j ACCEPT
    # smtp
    ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT
    ip6tables -A INPUT -p tcp --dport 587 -j ACCEPT
    # pop3 / imap
    ip6tables -A INPUT -p tcp --dport 110 -j ACCEPT
    ip6tables -A INPUT -p tcp --dport 143 -j ACCEPT

     この例では、SSH のみ xxxx:yyyy:zzzz::/48 から接続可能とし、それ以外の 25, 587, 110, 143 番ポートについては、どこからでも接続可能としています。

  • mail.example.com に AAAA レコードを当てる

    上記の対応は、各サーバソフトウェアが IPv6 でアクセス可能になったと言うだけで、特にメールサーバに関しては、MX レコードで指定されているメールサーバに AAAA レコードが当たっていないと意味がありません。従って、example.com のゾーンファイルのメールに関する行は以下のように記載します。

    @		IN	MX		10 mail.example.com.
    mail	IN	A		aaa.bbb.ccc.ddd
    mail	IN	AAAA	ssss:tttt:uuuu:vvvvv:wwww:xxxx:yyyy:zzzz

基本的に、上記のような方法で、IPv6 経由でのメールのやりとりに加えて SSH サーバについても対応できると思います。

一通りやってみて思ったのは、各設定ファイルでの IPv6 アドレスの記述方法がまちまちで混乱しやすいことです。

例えば、hosts.allow や apache、postfixなどでは「[xxxx:yyyy:zzzz::]/48」といった具合にアドレス部分は括弧でくくって記述します。しかし、authorized_keys の from などではそのまま、「xxxx.yyyy.zzzz::/48」のように記述します。

基本的には、IPv6 に対応する以前にもともと設定ファイル中で ‘:’ 記号が特別な意味を持っているものは「[xxxx.yyyy.zzzz::]/prefix」と記述して、そうじゃ無い物はそのまま「xxxx.yyyy.zzzz::/prefix」と記述する感じですが、そう言う覚え方をしたら、いつか大変なことをやらかしそうだと思いました。

面倒でも、いちいち調べていかないと・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です