2014年6月11日水曜日

ULA と Src/Dest NPT を使ってみた

IPv6 では IPv4 と違い使用できるアドレスが潤沢にあるため、LAN 内でもグローバル IPv6 アドレスを使用するのが一般的です。

ただ、グローバルアドレスを付与すると接続している上位の ISP が変わったりすると、LAN 内の機器も新しいグローバルアドレスに変更しなければなりません。
また、複数の ISP に接続していたりするマルチホームな環境の場合、複数のグローバルアドレスを機器に付与するため、ソースアドレスの選択の問題が発生したりします。

そこで ULA(Unique Local Address) を LAN 内の機器に付与し、ルータ等でグローバルアドレスに変換すればアドレスが変わったときに楽にならないかなと、以前から使用したいと思ってたので、試してみました。

アドレスの変換には NPTv6(RFC6296: IPv6-to-IPv6 Network Prefix Translation) を使用します。
変換先のアドレスはプレフィックスが変わったことによりチェックサムが変わらないように計算されたアドレスに変換されます。
これによりトランスレーターの計算負荷を減少させているそうです。

IPv4 の NAT と同様にエンドポイントのアドレスが変わるので、例えば SIP や FTP などは別途対応が必要になりますが、この辺はまだ調べてません。



NPTv6の設定

Linux では Kernel に実装されています。
次のコンフィグを有効化しておきます。
CONFIG_IP6_NF_TARGET_NPT=m
ユーザランドでは netfilter で設定できます。

まずは ULA -> グローバルアドレスの変換。
変換元 fd34:fe56:7891:2f3a::/64
変換先 2001:0db8:abcd:1234::/64


$ ip6tables -t mangle -A POSTROUTING -s fd34:fe56:7891:2f3a::/64 -j SNPT --src-pfx fd34:fe56:7891:2f3a::/64 --dst-pfx 2001:db8:abcd:1234::/64

続いてグローバル -> ULA の変換
$ ip6tables -t mangle -A PREROUTING -d 2001:db8:abcd:1234::/64 -i eth1 -j DNPT --src-pfx 2001:db8:abcd:1234::/64 --dst-pfx fd34:fe56:7891:2f3a::/64
net.ipv6.conf.all.forwarding が有効になっていれば、この箱を通過するパケットのアドレスが自動変換されます。

ちなみに、iptables-1.4.21 の ip6tables-save はルールの保存部分に問題があり、正しいルールが出力されませんのでご注意下さい。

... -j DNPT--src-pfx 2001:db8:abcd:1234::/64 ...
こんなルールが出力されてしまいます..
一応バグ報告を出してみましたが、未だ受理されてないようです。
nftables の方に開発リソースを振ってるのかもしれません。使ってるユーザが少ないというのもありそうですが。

感想

宅内のネットワークで1ヶ月ほど使ってますが、FTPも利用しませんし今のところ不便はないです。
ただ、IPv4のネットワークと同じく、内部ネットワークがプライベートアドレスになってしまうため、サーバ等を NPT の内側に置いてしまっていると、外から見えるアドレスと中から見えるアドレスが異なってしまうのが面倒です。
IPv6の利点であるグローバルアドレスをたくさん使えるメリットがなくなってしまうのは、勿体ない。
しかし、DMZを置くとなると、また最初の問題に戻ってしまうという...