mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

Apple IPv6審査対応 NAT64/DNS64環境構築について

こんにちは、arukasaです。

今回IPv6 (NAT64/DNS64) のWi-Fi環境構築という貴重な経験をしましたので、情報共有を兼ねて寄稿させて頂きます。

背景

Appleが、2016年1月以降はIPv6環境で動作しないアプリはリジェクトすると宣言しましたので、ミクシィ社内でもその検証環境が必要になりました。

現時点ではApple側も回線から上位はv4想定のようなので、検証環境もそれに倣いLAN側はIPv6、WAN側はIPv4の構成を取りました。

構成

f:id:mixi_engineers:20160106210856p:plain

ネットワーク

  • uplinkはIPv4 only
  • クライアントはIPv6 only
  • サーバとASA間のみv4&v6 併用

機器構成

  • ASA 5505 ( NAT64 )
  • Raspberry Pi
    • DNS64 (unbound 1.5以降)
    • RA (radvd)
  • Aruba (Wi-Fi)

実は構成が確定するまでが一番苦労した部分で、当初導入予定だったDHCPv6 (isc-dhcp-server)やASAでのRA送出、BINDには色々な制限が有り、期待した機能を満たしていない事が動かしてみて初めてわかりました。この辺りの経緯は最後の【ハマったこと】に纏めています。宜しければご参照ください。

※ 以下に記述する手順はインターネット上の情報を多数参考にしています。
※ 環境の違いによって意図しない動作をする可能性も有ります、ご了承ください。
※ 間違い・改善出来る部分など多々あるかと思いますのでご指摘頂けると非常に有りがたいです。

以下configです。

ASA

まずASAから設定します。

先述の通りRAのやり取りはRaspberry piのradvdで行いますので、必要最小限のアドレス設定と、NAT64の設定です。RAの送出も抑止しています。

outsideはキャリアのDHCPサーバーからグローバルのIPv4アドレスを受け取っています。

IP設定

interface Vlan214
nameif inside02
security-level 0
ip address 10.10.214.1
ipv6 address face::10:10:214:1/64
ipv6 enable
ipv6 nd prefix face::/64 no-autoconfig
ipv6 nd suppress-ra 0 

interface Vlan2999
nameif outside01
security-level 0
ip address dhcp setroute

NAT64

IPv6をoutsideのIPv4アドレスにNAT64しています。 またRaspberry PiがIPv4でDNSを聞きに行く為、IPv4アドレスもNATします。

object network REAL_IPv6
 subnet face::/64
object network REAL_IPv4
 subnet 10.10.214.0 255.255.255.0
object network DNS64_range
 subnet cafe:ff9b::/96

nat (inside02,outside01) source dynamic REAL_IPv6 interface destination static DNS64_range any
nat (inside02,outside01) source dynamic REAL_IPv4 interface

ASAは以上です。あとは必要なセキュリティの設定と、物理インターフェースに各interface Vlanを割り当てます。

Raspberry Pi

unbound

unboundは1.5以降のバージョンからDNS64対応ですが、apt-getでは1.4系のパッケージしか無いため、ソースコードからインストールが必要です。ただし必要なパッケージが無いと多大な時間を浪費する事になります (当方はここでハマりました)。

raspberry-piの場合はlibssl-develが必須のようです。

他の手順は以下を参考にしました。

 

unbound.conf

server:
verbosity: 1
pidfile: "/var/run/unbound.pid"
use-syslog: yes
module-config: "dns64 iterator"
dns64-prefix: cafe:ff9b::/96
dns64-synthall: yes
interface: ::1
interface: face::10:10:214:235
access-control: ::0/0 allow 

forward-zone:
name: "."
forward-addr: 8.8.8.8
  • dns64-synthall: yesで、すべての問い合わせをDNS64変換するという実装になります。これをしないと、問い合わせた外部サイトがv6アドレスを持っていた場合、cafe:ff9bではなく生v6アドレスをクライアントに返してしまいます。BINDではここの実装がクリアできず、unboundに変更しました。
  • IPv6への移行という観点から言うとAAAAで接続出来るサイトにはv6通信出来た方が良いのかもしれませんが、今回はApple推奨環境と同様の動作をする環境構築が目的なので、あえてunboundを採用しています。
  • prefixをcafe:ff9b::/64にしているのは、ASAがwell-known-prefixを指定してNATできない仕様のためです。

以上でunboundは動作すると思います。

次はradvdでクライアントへIPv6アドレス、DNSサーバー、デフォルトゲートウェイを通知します。

radvd

こちらもapt-getできるバージョンが古い為、念のためソースから最新版をビルドします。以下を参考にしました。

Cross Compiling Radvd for ARM - BeyondLogic

radvd.conf

interface eth1 {
AdvSendAdvert on;
IgnoreIfMissing on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
AdvDefaultPreference high;
AdvHomeAgentFlag on;

#フラグの設定

AdvManagedFlag off;
AdvOtherConfigFlag off;

prefix face::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
};

#DNSの通知

RDNSS face::10:10:214:235
{
AdvRDNSSPreference 8;
AdvRDNSSOpen off;
AdvRDNSSLifetime 30;
};
};
  • Raspberry PiのデフォルトゲートウェイはASAに向けてください。
  • ここで設定したフラグの値でクライアントはRAを参照するのかDHCPを参照するのかが決定されます。今回の場合は全てRAを参照させたいので、M flagとO flagを共にOFFにします。
    ただし先述の通り、この設定によりWindowsに自動設定させる事はできなくなりますので、Windows側でオープンソースのアドオンを入れるか、DNSサーバーの情報は手動設定してください。
    rdnssd-win32 download | SourceForge.net
  • iPhoneやAndroidを繋がず、Windows PCやMacだけで良い場合はOフラグをonにし、isc-dhcp-serverでDNSを通知すれば自動接続出来るようになります。 

Raspberry Piは以上です。

Aruba

今回ASAからArubaまで全て同一VLANのL2構成での使用の為、IPv4と比べて特別な設定は必要ありませんでしたが、いくつか注意が有ります。

  • ipv6 enable
    この設定が入っていないと無線側がL2構成であってもIPv6のFirewall Processが働かず、正常に通信出来ません。
  • Valid user (ACL)
    ここがホワイトリストのような役割を果たしており、導入したOSバージョンによっては一定の制限が掛かっています。通信させたいセグメントを許可するように設定変更してください。
  • RA-Guard
    クライアント側から意図しないRAが発せられた時に、それをブロックします。アクセスリストに以下の記述を組み込んでください。
    ip access-list session ra-guard
        ipv6 user any icmpv6 rtr-adv deny

あとはIPv4と同じようにSS-IDを作成すれば接続できるはずです。

 

これで以上です。以下は苦労した点やハマった点などを記載します。

ハマった事

NAT絡み

  • NAT64が上手くいかない → source addressだけでなくdestの改変も必要だった。
  • well-known-prefixをDNSマッピングに指定していたがASAではNATに指定できない仕様だった

DHCPv6(isc-dhcp-server)やRA絡み

  • ASAでDHCPさせようとしたが、そもそもDHCPv6対応していない(ipv6 dhcp relayのみ対応)
    → dhcpをrelayしてRasperry PiにDHCPv6させようとする(当初raspberry piとクライアントは別セグメントだった為)
    → isc-dhcp-serverがIPv6で起動できない
    → v6起動のオプションが必要
    sudo vi /etc/init.d/isc-dhcp-server
    OPTIONS="-6"
    → 起動したものの、Androidだけ接続出来ない
    → 調べるとIPv6アドレスは取れているが、v6のDNS情報が通知出来ていない様子
    → AndroidはDHCPv6非対応の為、RAでDNSサーバー情報を渡さなければならない
    Comparison of IPv6 support in operating systems - Wikipedia, the free encyclopedia
    → RAでDNS情報を通知する為にはRFC6106をサポートした製品が必要になり、まだ多くのネットワーク製品がサポートしていない。
    インターネット用語1分解説~RA (Router Advertisement; ルータ広告)とは~ - JPNIC
    Firewall IPv6 Capabilities: Cisco, Forti, Juniper, Palo
    → 今回はアドレス情報やDNS情報のやり取りはASAではなくRaspberry Piのradvdに任せて、ASAは出口のNAT専用機とする事に変更。

DNS絡み (BINDの問題)

  • 問い合わせた結果AAAAで返ってきたアドレスはDNS64変換されず生のAAAAレコードをクライアントに返してしまう
  • ASAのNATでDNS64レンジを宛先に指定する必要があるためNG
  • unboundなら "dns64-synthall" というオプションがあるようなのでunboundに変更

無線絡み

  1. L2構成の場合ArubaのコントローラにIPv6アドレスを振らない為、IPv6を有効にする必要が無いと勘違いしていた。
  2. IPv6 enableを設定しないとFirewall(v6)も動作しない事を知らなかった。
  3. 運用中の実機のため、迂闊にIPv6 enableなどの設定変更が行えなかった。
  4. IPv6 enableを投入したものの、未だにACLに引っ掛かり通信出来ない
  5. valid userの設定変更が必要だと気づく

機器の実装の違い (最大の難関)

  • WindowsはDNS情報の通知にDHCPv6を使用しなければならないが、
  • AndroidはRAを使用しなければならない。
  • iPhoneはどちらでも構わないが、RAのやり取りが不安定で接続出来たり出来なかったりする。

以下まとめです。

  • Windows
    • RA(IP取得): OK
    • RA(DNS取得): NG (wikipediaより, 上記アドオンインストールで取得出来るようになるようです)
    • DHCPv6(DNS取得): OK
    • v6手動設定: OK
  • Android
    • RA(IP): OK
    • RA(DNS): OK
    • DHCPv6(DNS): NG
    • v6手動設定: 不可
  • iPhone (Mac OS X)
    • RA(IP): OK
    • RA(DNS): OK
    • DHCPv6(RA): OK
    • v6手動設定(DNSのみ): OK

上記よりWindows側が手動やアドオンなど頑張れる要素が多い事と、Appleの推奨環境もそういった構成を取っている為、それに倣いました。

情報の不足

海外サイト、国内サイトを含めて中々必要な情報が得られない状態でした。特に国内のサイトには一通りの情報をまとめているサイトが数える程しか無く、情報収集に苦労しました。

まとめ

Android・iOS・Windowsなどデバイス、OSによってサポート、非サポートな部分の違いが多数有る事がわかりました。本構成ではWindowsの標準機能でDNSサーバーを渡す事が出来ない点が、依然課題として残っています。(Windows側でアドオンをインストールするか、DNSのみ手動設定という手段で何とか接続させています。)

機器毎に実装が大幅に異なるIPv6が、本当にこのまま普及するのか疑問です。現状はappleが普及に向けた先導をしているように見えますが、Google, Microsoft等、業界大手が足並みを揃えなければ世界的な移行は難しいのでは無いかと思います。

謝辞

今回の構築にあたり加藤さん、吉野さんにはお忙しい中、多大なるご協力を頂きました。私一人では完成まで辿り着けなかったと思います。

本当にありがとうございました。