こんにちは、arukasaです。
今回IPv6 (NAT64/DNS64) のWi-Fi環境構築という貴重な経験をしましたので、情報共有を兼ねて寄稿させて頂きます。
背景
Appleが、2016年1月以降はIPv6環境で動作しないアプリはリジェクトすると宣言しましたので、ミクシィ社内でもその検証環境が必要になりました。
現時点ではApple側も回線から上位はv4想定のようなので、検証環境もそれに倣いLAN側はIPv6、WAN側はIPv4の構成を取りました。
構成
ネットワーク
- 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.0 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
ASAは以上です。あとは必要なセキュリティの設定と、物理インターフェースに各interface Vlanを割り当てます。
Raspberry Pi
・unbound
unboundは1.5以降のバージョンからDNS64対応ですが、apt-getでは1.4系のパッケージしか無いため、ソースコードからインストールが必要です。
ただし必要なパッケージが無いと多大な時間を浪費する事になります (当方はここでハマりました)。
raspberry-piの場合はlibssl-develが必須のようです。
他の手順は以下を参考にしました。
Linux - DNS unboundサーバ構築手順(ソースからunbound 1.5.1をインストール) - Qiita
DSAS開発者の部屋:Raspberry Pi 2 で NAT64 箱をつくってみた
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
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
http://blog.webernetz.net/2015/04/21/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の設定変更が必要だと気づく
・機器の実装の違い(最大の難関)
・情報の不足
海外サイト、国内サイトを含めて中々必要な情報が得られない状態でした。特に国内のサイトには一通りの情報をまとめているサイトが数える程しか無く、情報収集に苦労しました。
まとめ
Android・iOS・Windowsなどデバイス、OSによってサポート、非サポートな部分の違いが多数有る事がわかりました。
本構成ではWindowsの標準機能でDNSサーバーを渡す事が出来ない点が、依然課題として残っています。
機器毎に実装が大幅に異なるIPv6が、本当にこのまま普及するのか疑問です。現状はappleが普及に向けた先導をしているように見えますが、Google, Microsoft等、業界大手が足並みを揃えなければ世界的な移行は難しいのでは無いかと思います。
謝辞
今回の構築にあたり加藤さん、吉野さんにはお忙しい中、多大なるご協力を頂きました。私一人では完成まで辿り着けなかったと思います。
本当にありがとうございました。