いつの間にか ip6tables の nat ターゲットで MASQUERADE が出来る様になっていた

最近 Raspberry Pi 2 のカーネルをビルドし直したのですが、いつの間にか、

ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

見たいな事が出来る様になっていました。

と言うことで、DNS64 + NAT64 の記事で、これに対応する追記を記載しました。

Debian 8 + DNS64 + NAT64 on the Raspberry Pi 2

Debian 8 上に DNS64 + NAT64 を設定した備忘録である。例によって無保証である。

2017/02/11 追記: Jool 3.5.x 系でも同じようにインストール出来ることを確認した。

Linux カーネルのビルドは、「Kernel Building – Raspberry Pi Documentation」に記載の通り、DNS64, NAT64 関係は、「DSAS開発者の部屋:Raspberry Pi 2 で NAT64 箱をつくってみた」の通りとなる。

両者のドキュメントに感謝しつつ、実際に設定を行ってみた。なお、私の環境では、USB で NIC を接続して別インタフェースを接続している。

続きを読む

ntpd の IPv6 設定

いまいち、ntpd.conf の restrict において IPv6 ネットワークアドレスの指定方法がよくわからなかったのだけど、調べたら「AccessRestrictions < Support < NTP の『6.5.1.2.1. If you used ‘restrict default ignore’』」に載っていた。

と言うことで、以下のような想定の設定を ntp.conf に行ってみる。

■想定

上位の ntp サーバ: ntp.example.com
IPv4 ネットワークアドレス: 192.168.1.0/24
IPv6 ネットワークアドレス: 2001:db8:1:1::/64

localhost からはフルアクセス、192.168.1.0/24 および 2001:db8:1:1::/64 から時刻の参照だけ許可する。

■設定例 (/etc/ntp.conf)

driftfile /var/lib/ntp/ntp.drift
server ntp.example.com iburst
restrict -4 default ignore
restrict -6 default ignore
restrict 127.0.0.1
restrict ::1
restrict 192.168.1.0 mask 255.255.255.0 noquery
restrict 2001:db8:1:1:: mask ffff:ffff:ffff:ffff:: noquery
restrict ntp.example.com noquery

HE Free IPv6 Tunnel Broker: IPv6 逆引き設定メモ

Hurricane Electric Free IPv6 Tunnel Broker」では、割り当てられた「Routed /64」または「Routed /48」のネットワークに対して、逆引き設定が出来ます。ここでは、その設定方法を記載します。

■前提

今回は、HE より「2001:DB8:1:1::/64」のネットワークが割り当てられているものとして、「2001:DB8:1:1::1」の逆引きとして www.example.jp をあてます。 また、上記逆引きを設定するサーバは、ns.example.jp であるとします。

■必要なもの

HE から割り当てられた「Routed /64」または「Routed /48」のネットワーク。
IPv6 の逆引きが設定できる DNS サーバ。

■自前の DNS サーバに逆引きゾーンを設定する。

ゾーン名は、IPv6 の場合、コロン以外の 1 文字 (4 bit) ずつ、ピリオド区切りで逆から並べて、最後に「ip6.arpa.」を付けます。

「2001:DB8:1:1::/64」は、「2001:0DB8:0001:0001::」なので、ゾーン名は「1.0.0.0.1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa.」となります。

BIND9 の場合、named.conf 等に以下のようにゾーンとゾーンファイルの読み込み設定を行います。

zone "1.0.0.0.1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa." {
	type master;
	file "/etc/bind/zones/2001:db8:1:1::.rev";
	allow-query { any; };
};

次に、「/etc/bind/zones/2001:db8:1:1::.rev」ファイルに対して、逆引きそのものを設定します。 こちらも、下位の 64 bit のインターフェイス ID のコロン以外の 1 文字 (4 bit) ずつ、ピリオド区切りで逆から並べます。

IPv6 アドレス「2001:DB8:1:1::1/64」を分解すると、「2001:0DB8:0001:0001」のネットワークプレフィックス、「0000:0000:0000:0001」のインターフェイス ID となります。ですので、ゾーンファイル中で指定するインターフェイス ID の部分は「1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0」となり、これに対して PTR レコードで割り当てる FQDN を設定します。

「/etc/bind/zones/2001:db8:1:1::.rev」ファイルの例

$TTL 43200
@			IN	SOA	ns.example.jp. root.example.jp. (
			2013081601
			86400
			7200
			1209600
			7200
)

			IN	NS	ns.example.jp.

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0	IN	PTR	www.example.jp.

ここまで出来たら、ネームサーバを再起動します。

■ローカルでの確認

逆引きチェック (設定を行ったネームサーバ上で)

$ dig @localhost 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa. ptr

「;; ANSWER SECTION:」で以下のように逆引きが帰ってくれば OK です。

;; ANSWER SECTION:
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa. 43200 IN PTR www.example.jp.

■ Hurricane Electric Free IPv6 Tunnel Broker のトンネルの設定

「rDNS Delegations」の項目の「Edit」をクリックすると「rDNS Delegated NS1 〜 NS5」まで逆引き DNS サーバの設定が出来るので、今回は「rDNS Delegated NS1」に「ns.example.jp」を入力し、「Save」します。

なお、上記で基本的に完了するのですが、フォーラムで「/48 rDNS delegation works, /64 rDNS doesn’t」なるトピックがあり、割当が /64 のネットワークの場合、逆引きが上手くいかない場合があるようです。私の場合も、設定を行うと、確かに HE 側 DNS サーバのシリアル値は上がっていくのですが、設定が反映されなくて、HE 側に問い合わせたところ、修正をしてもらえました。

■最終確認

自分が使用している ISP 等の DNS サーバなどを参照する環境において、逆引きチェックを実行。

$ dig -x 2001:DB8:1:1::1

「;; ANSWER SECTION:」で以下のように逆引きが帰ってくれば OK です。

;; ANSWER SECTION:
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa. 43200 IN PTR www.example.jp.

なお、これを書いている現在 (2013/08/16) 、HE 側のネームサーバの TTL 値は 3 時間程度になっているので、上記の確認は、HE 側で逆引き DNS サーバの設定してから、3 時間程度経過しないと正しい値が返ってこない可能性があることに注意が必要です。

■その他

IPv4 のサブネットで分割された逆引きより、とってもシンプルでわかりやすいけど、桁数が半端無いので面倒・・・。
dig IPアドレス +trace って便利だと思いました。

■参考

実用 BIND 9で作るDNSサーバ(12):IPv6対応DNSサーバの実現 (1/2) – @IT

RTX810: HE Free IPv6 Tunnel Broker 設定メモ

Hurricane Electric Free IPv6 Tunnel BrokerYAMAHA RTX810 で IPv6 トンネルを設定した備忘録です。

とりあえず動いた、と言うもので、特にフィルタリングの部分については、全く自信が無いので、間違っていたらコメント等で突っ込んでいただけると凄く嬉しいです。

ちなみにルータの環境は、一般的な PPPoE でグローバル IPv4 が PP インタフェースに当たっていて、LAN 内クライアントは IP マスカレードで LAN1 インタフェースからインターネットへ出て行っているようなものを想定しています。

  • ネットワーク条件

    • RTX810 の LAN1 IPv4:
      192.168.1.1/24
    • RTX810 の LAN1 IPv6 :
      2001:DB8:1:1::1/64
    • トンネルのエンドポイント IPv4 :
      192.0.2.1
    • トンネル内サーバ側 IPv6 :
      2001:DB8:1:2::1/64
    • トンネル内クライアント側 IPv6 :
      2001:DB8:1:2::2/64
    • 割り当てられたネットワーク :
      2001:DB8:1:1::/64

    上記の情報について、トンネル関係の IPv4, IPv6 や、割り当てられたネットワークの情報は、HE でトンネルを設定した際に表示されます。
    また、HE 側の管理画面で、トンネルの MTU 値は「1280」にしておきます。

    以下は、RTX810 への設定です。コンソールなり、SSH なりで設定します。設定を行う前に、既存の設定は必ずバックアップしておきます。

  • LAN1 インタフェースに IPv6 アドレスを当てる

    ipv6 lan1 address 2001:DB8:1:1::1/64
  • IPv6 トンネルを通す IPv4 フィルタと静的マスカレードを設定する

    ip filter 601 pass 192.168.1.1 192.0.2.1 ipv6 * *
    ip filter 602 pass 192.0.2.1 192.168.1.1 ipv6 * *
    ip pp secure filter in … 602 …
    ip pp secure filter out … 601 …
    nat descriptor type 101 masquerade
    nat descriptor address outer 101 ipcp
    nat descriptor address inner 101 auto
    nat descriptor masquerade static 101 1 192.168.1.1 ipv6
  • IPv6 用フィルタを定義する。

    # 入力・出力方向共通静的フィルタ (Windows ファイル共有は通過させない)
    ipv6 filter 101 reject-nolog * * udp,tcp 135 *
    ipv6 filter 102 reject-nolog * * udp,tcp * 135
    ipv6 filter 103 reject-nolog * * udp,tcp netbios_ns-netbios_ssn *
    ipv6 filter 104 reject-nolog * * udp,tcp * netbios_ns-netbios_ssn
    ipv6 filter 105 reject-nolog * * udp,tcp 445 *
    ipv6 filter 106 reject-nolog * * udp,tcp * 445
    # 入力方向 ICMP 静的フィルタ (一部の ICMP タイプだけ通過させる)
    ipv6 filter 111 pass * * icmp6 1
    ipv6 filter 112 pass * * icmp6 2
    ipv6 filter 113 pass * * icmp6 3
    ipv6 filter 114 pass * * icmp6 4
    ipv6 filter 115 pass * * icmp6 128
    ipv6 filter 116 pass * * icmp6 129
    # 入力方向静的フィルタ (established なパケットしか基本通過させない)
    ipv6 filter 121 reject-nolog 2001:DB8:1:1::/64 * * * *
    ipv6 filter 122 reject-nolog * 2001:DB8:1:2::2 * ssh
    ipv6 filter 123 reject-nolog * 2001:DB8:1:2::2 * telnet
    ipv6 filter 124 reject-nolog * 2001:DB8:1:2::2 * www
    ipv6 filter 125 reject-nolog * 2001:DB8:1:1::1 * ssh
    ipv6 filter 126 reject-nolog * 2001:DB8:1:1::1 * telnet
    ipv6 filter 127 reject-nolog * 2001:DB8:1:1::1 * www
    ipv6 filter 128 reject-nolog * 2001:DB8:1:1::/64 tcp * ident
    ipv6 filter 129 pass * 2001:DB8:1:1::/64 udp domain *
    ipv6 filter 130 pass * 2001:DB8:1:1::/64 established
    ipv6 filter 131 reject-nolog * * * * *
    # 出力方向静的フィルタ (ほとんどスルー)
    ipv6 filter 141 reject-nolog * 2001:DB8:1:1::/64 * * *
    ipv6 filter 142 pass * * * * *
    ipv6 filter 143 reject-nolog * * * * *
    # 出力方向ダイナミックフィルタ (何となく)
    ipv6 filter dynamic 101 * * ftp
    ipv6 filter dynamic 102 * * domain
    ipv6 filter dynamic 103 * * www
    ipv6 filter dynamic 104 * * smtp
    ipv6 filter dynamic 105 * * pop3
    ipv6 filter dynamic 106 * * tcp
    ipv6 filter dynamic 107 * * udp

    上記は、設定後、インターネット側から LAN1 インタフェース側の機器に対して nmap -6 してみて、大丈夫ではあったが、自信は無い。

  • トンネルインタフェースを設定する

    tunnel select 1
     tunnel encapsulation ipip
     tunnel endpoint address 192.168.1.1 192.0.2.1
     ipv6 tunnel address 2001:DB8:1:2::2/64
     ip tunnel mtu 1280
     ipv6 tunnel secure filter in 101 102 103 104 105 106 111 112 113 114 115 116 121 122 123 124 125 126 127 128 129 130 131
     ipv6 tunnel secure filter out 101 102 103 104 105 106 141 142 143 dynamic 101 102 103 104 105 106 107
     tunnel enable 1
  • IPv6 のデフォルトゲートウェイの設定と LAN1 側にルータ広告を行い、IPv6 パケットを扱うようにする

    ipv6 route default gateway tunnel 1
    ipv6 prefix 1 2001:DB8:1:1::/64
    ipv6 lan1 rtadv send 1
    ipv6 routing on

これで、RTX810 の LAN1 インタフェースに接続した、IPv6 が自動設定された iMac から http://www.kame.net/ にアクセスしたら、カメは踊り・・ません。

ping6 www.kame.net して、ping6 が通るにもかかわらず、です。

通常デュアルスタック環境において、双方がネイティブ IPv6 アドレスを持っている場合、普通は IPv6 で通信が行われるのですが、OS X Lion 以降では、Happy Eyeballs が実装されているらしく、必ずしも IPv6 で通信されるとは限らないため、のようです。

Linux とかだと、こう言う場合でも多分 IPv6 が優先されそうな気がします。その場合でも 6to4 なアドレスに対しては、常に IPv4 が優先されるはずです。(/etc/gai.conf をさわれば優先度を変更できる)

参考サイト

Feel6 がこんなに簡単に終了するはずがない

って思っていたら、ちょっと前にフリービット株式会社より『「Feel6接続サービス」終了のご案内』なんていうメールが届いてた。

サイトにも記載されているが、Feel6 接続サービスの終了は、2013/7/31 12:00 とのことで、自宅 LAN に Feel6 接続サービスから払い出された /48 のプレフィックスのネットワークから /64 を割り当てて使用していたので、さてどうしようかと。

件のメール中には代替サービスとして、「Feel@DTI」の提案もあるのだけど、ネットワークの払い出しではないようで、私の場合は代替にならなくて、結局「Hurricane Electric Free IPv6 Tunnel Broker」に切り替えた。

※というか、私は ISP に eo 光を使っていて、こちらでも IPv6 接続サービスをやっているのだけど、外部からの接続は遮断、専用ルータのレンタルが必須とか言う仕様…。

話を戻して、HE の Tunnel Broker 、海外のトンネリングサービスになるが、東京にトンネルのエンドポイントがある上、/64 のプレフィックスのネットワークを割り当ててくれる。(/48 もアサイン出来る様だが、個人的にはそこまで必要じゃないので今回はそのまま /64 で。)

当然ながら、自宅 LAN の IPv6 ネットワークアドレスは変わってしまうけど、比較的導入が楽だったので、その備忘録。

続きを読む

rsync でネットワーク越しに差分でミラーリングする

自分が契約している VPS のデータを定期的にデータのミラーを差分でローカルサーバに取るように設定した際のメモです。

■前提

VPS 側は固定 IPv4 / IPv6 アドレスをもつ。
ローカルサーバ側は動的 IPv4 / 固定 IPv6 をもつ。

上記から、

  • rsync + ssh を使用する
  • 双方とも固定のアドレスを持っている IPv6 経由を使用する
  • 常に起動している保証が無いローカル側から VPS 側のデータを取りに行く

と言う方法が一番安全と考えました。

なお、ミラーリングなので、VPS 側で無くなったファイルは、ローカルサーバ側でも無くなります。これを防ぐために、ローカルサーバ側は、ミラーリングされるディレクトリについても複数世代バックアップを別媒体に取得しています。

■ネットワーク環境

・VPS
Static IPv4 Address: aaa.bbb.ccc.ddd
Static IPv6 Address: 2002:xxxx:zzzz::1
FQDN : www.example.com

・ローカルサーバ
Dynamic IPv4 Address : www.xxx.yyy.zzz
Static IPv4 Address : 2001:xxxx:yyyy::1

■仕様

VPS の /etc と /home をローカルサーバの /backups ディレクトリにミーラーリングを取るようにします。また、接続開始はローカルサーバから行います。

■方法

・ローカルサーバ

root になります。
次に、ssh のキーペアを作成します。

# ssh-keygen -b 2048 -t rsa -N "" -f /root/.ssh/rsync-backups

/root/.ssh/rsync-backups.pub という公開鍵が出来ているので、これを VPS 側に何らかの方法で転送します。

・VPS

ローカルサーバから転送してきた公開鍵に安全のため、接続元を限定するため、下記の内容を先頭に追加します。

from="2001:xxxx:yyyy::1"

※実際の公開鍵の内容としては「from=”2001:xxxx:yyyy::1″ ssh-rsa xxxxxx…」となります。

この公開鍵を「/root/.ssh/authorized_keys」に追加します。
※なおこのファイルの所有権は root:root で、アクセス権は 600 にしておくべきです。

/etc/ssh/sshd_config について「PermitRootLogin without-password」とします。さらに sshd を再起動します。

・ローカルサーバ

ローカルサーバ側で root になり、以下のコマンドでパスワード不要で VPS 側に root でログインできることを確認します。

# ssh -6 -i ~/.ssh/rsync-backups root@www.example.com

ログイン確認できたら、VPS からログアウトします。

ミラーリング先のディレクトリを作成します。今回はローカルサーバの /backups 以下に取ることにします。

# mkdir /backups

ここまで出来たら、実際にどういう動作をするか、ファイル転送をせずに確認だけ行います。

# rsync -nvaz --delete --force -e "ssh -6 -i /root/.ssh/rsync-backups" \
root@www.example.com:/etc \
root@www.example.com:/home \
/backups/

問題が無ければ、実際に転送してみます。

# rsync -vaz --delete --force -e "ssh -6 -i /root/.ssh/rsync-backups" \
root@www.example.com:/etc \
root@www.example.com:/home \
/backups/

上手く転送できていれば OK です。あとは、cron で定期的に実行するなりすると良いと思います。

■さらにセキュリティを高めるために

rsync を実行中に VPS 側で ps コマンドなどで rsync がどのように実行されているのかを確認します。
この内容を、公開鍵に「command」を追加してあげて、/etc/ssh/sshd_config では「PermitRootLogin forced-commands-only」として、sshd を再起動してあげるとさらに安全になると思います。

Debian GNU/Linux 6.0 で固定 IPv6 設定

IPv6 が使用可能かつ Router Advertisement が流れているネットワークにおいて、サーバの IPv6 アドレスを手動というか、Static に設定する際になかなか意図する設定に出来なかったので、その解決のメモです。

■条件

サーバに割り当てる IPv6 アドレス : xxxx:yyyy:zzzz::2/64
IPv6 ゲートウェイ : xxxx:yyyy:zzzz::1

■設定

  • /etc/sysctl.conf
    net.ipv6.conf.all.forwarding = 0
    net.ipv6.conf.all.accept_ra = 0
    net.ipv6.conf.all.autoconf = 0
    net.ipv6.conf.all.accept_ra_defrtr = 0
    net.ipv6.conf.all.accept_redirects = 0

    IPv6 の自動設定を全てで OFF にしているのだが・・・。

  • /etc/network/interfaces
    auto eth0
    iface eth0 inet6 static
    	address xxxx:yyyy:zzzz::2
    	netmask 64
    	gateway xxxx:yyyy:zzzz::1
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/forwarding 
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_ra 
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/autoconf 
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_ra_defrtr 
    	pre-up echo 0 > /proc/sys/net/ipv6/conf/eth0/accept_redirects

    何故かインタフェース名を明示しないと設定が効かない。
    なお、この方法以外に pre-up で設定している内容と同等の設定をしかるべき書式で /etc/sysctl.conf で行っても良い。

上記のように、/etc/network/interfaces で、あらためて IPv6 の自動設定を無効にしているのは、/etc/sysctl.conf で本来なら効くはずの設定が何故か効かないからです。

/etc/sysctrl.conf に書いている内容だけでは、手動設定した IPv6 アドレスと、MAC アドレスをもとに自動生成された IPv6 アドレスの併用となってしまいます。(別にそういう運用もありかと思いますが・・・)

私の中では、net.ipv6.conf.all (設定の上書き) が一番強制力が強く、次に net.ipv6.conf.if名、最後に net.ipv6.conf.default (未指定時のデフォルト値) だと思っていたので、意外でした。

■参考にさせて頂いた URL

Postfix で relayhost を使用すると aliases が参照されない件

通常 Postfix では /etc/aliases ファイルに転送先を書いておくと、それを参照してしかるべきアドレスに配送してくれますが、main.cf で relayhost にて他のメールサーバにメール配送を依頼する場合、これが参照されない様でした。

例えば、server.test というローカルサーバにおいて、

  • /etc/postfix/main.cf 中「relayhost = mail.example.com」の様にして、メールの処理を mail.example.com にリレーする様にしている。

  • かつ、/etc/aliases ファイルに root: hoge@example.jp と書いてある。

  • この設定で、ローカルサーバ上から、mail root などで、root あてにメールを送ると、root → hoge@example.jp をいうエイリアス処理が行われず、mail.example.com に対して、そのまま「root@test」あてに配送するようにしてリレーしてしまう。

    ※つまり、hoge@example.jp に配送するつもりが、root@test という存在しないメールアドレスに配送してしまう事になる。

と言う現象が発生します。

これを回避するためには、「Postfix manual – transport(5)」の「例」を参照して、下記のようにすれば良いことがわかりました。

  • /etc/postfix/main.cf 中「relayhost = mail.example.com」の設定をやめる。

  • /etc/postfix/transport ファイルを下記の書式で作成する

    test		:
    server.test	:
    *		smtp:mail.example.com

    つまり、内部的に使用している test ドメインや、自分自身である server.test あてに届いたメールは、一旦自分自身で処理し、それ以外は mail.example.com にリレーすると言うことになり、/etc/aliases の設定が効くようになる様です。

  • # postmap transport の実行。

  • /etc/postfix/main.cf 中で、「transport_maps = hash:/etc/postfix/transport」と設定し、postfix を再起動する。

これに気付いたのは、固定 IPv6 アドレスを持っているローカルサーバから、これまた固定 IPv6 アドレス (6to4 だけど) を持っている自 VPS へのメールリレーを、IPv4 (もちろん OP25B がかかっている) 経由でサブミッションポートで SASL による認証を行ってリレーしていたのを、IPv6 (こっちは OP25B がかかっていないので) 経由で直にリレーするようにしたら、しかるべきメールが届かなくなっていたからと言う・・・。

SASL を使用してリレーするのと、直接リレーするのとで、挙動が違うのかなぁ。まぁ、すぐ気付いて良かった・・・。

もし認識に間違っているなどがあれば、ご指摘いただけると嬉しいです。

メールサーバ 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」と記述する感じですが、そう言う覚え方をしたら、いつか大変なことをやらかしそうだと思いました。

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