cisco 841MでNAT64検証
この記事は、大阪工業大学 Advent Calendar 2019の4日目の記事です。
背景
先日、欧州地方に割り当てられたIPv4アドレスが枯渇したと言うニュースが流れてきました。(参考:https://pc.watch.impress.co.jp/docs/news/1220787.html)
このこともあり、なるべくIPv4に依存しない環境が今後必要になることが予想されます。
と言っても、IPv6に対応していないサービスに対してはどうしようもないので、今回はNAT64/DNS64の環境を構築し、IPv4が必要なサービスのみIPv4、それ以外はIPv6でインターネットを利用する環境が作れるかどうか検証します。
検証環境
NAT64に対応した機器やソフトといえば、Linuxでも動作する[Jool](https://jool.mx/en/index.html)が有名で、JPNIC主催のInternetWeekの会場ネットワークでも実験的に提供されている実績もあります。(参考1:https://blog.nic.ad.jp/2019/2121/)
(参考2:https://blog.nic.ad.jp/2019/2136/))
しかし、なるべくネットワーク機器を用いて構築してみたかったため、今回はCiscoの841Mを用いました。使用した機器の情報は以下の通りです。
Router#show version Cisco IOS Software, C800M Software (C800M-UNIVERSALK9-M), Version 15.5(3)M6, RELEASE SOFTWARE (fc2) (中略) Cisco C841M-4X-JSEC/K9 (revision 1.0) with 496716K/27571K bytes of memory. Processor board ID ******** 6 Gigabit Ethernet interfaces 1 Virtual Private Network (VPN) Module DRAM configuration is 32 bits wide 255K bytes of non-volatile configuration memory. 1908736K bytes of SD Flash sdflash (Read/Write) License Info: License UDI: ------------------------------------------------- Device# PID SN ------------------------------------------------- *1 C841M-4X-JSEC/K9 ********* License Information for &aposc800m&apos License Level: advsecurity Type: Permanent Next reboot license Level: advsecurity (以下略)
また、今回の検証では以下のトポロジーを使用しました。
※グローバルIPアドレスはマスクしています。
※Vlan1側IPv6アドレスブロックは、Internet側からルーティングされているものとします。後述しますが、本検証ではRIPngを使用しました。
構築・検証
IPv6アドレス設定・ルーティング
まずInternet側のGE0/4にIPアドレスを設定していきます。(config)#ipv6 unicast-routing (config)#ipv6 cef (config)# (config)#interface GigabitEthernet0/4 (config-if)# ipv6 address autoconfig default (config-if)# no shutdown (config-if)# exit (config)#
確認します。
今回はRAで自動設定したため、デフォルトゲートウェイも設定されているはずなので確認します。
対外への疎通も確認しておきます。
次に、PC等が接続する側のVlan1にIPアドレスを設定していきます。DNSサーバはDNS64対応のGoogle PublicDNSを使用します。
(config)#interface Vlan1 (config-if)# no ip address (config-if)# ipv6 address 2001:XXXX:XXXX:B3F1::1/64 (config-if)# ipv6 nd prefix 2001:XXXX:XXXX:B3F1::/64 (config-if)# ipv6 nd ra interval 5 3 (config-if)# ipv6 nd ra dns server 2001:4860:4860::6464 (config-if)# ipv6 nd ra dns server 2001:4860:4860::64 (config-if)# exit (config)#
確認します。
PCを接続し、IPv6アドレスのみが降ってくるか確認します。
アドレスが降ってきたことを確認したら、ルータとの疎通を確認します。
ここまでできたら、次はルーティングの設定です。先述の通り、本環境ではRIPngを使用します。
(config)#ipv6 router rip 1 (config-rtr)# exit (config)# (config)#interface GigabitEthernet0/4 (config-if)# ipv6 rip 1 enable (config-if)# exit (config)# (config)#interface Vlan1 (config-if)# ipv6 rip 1 enable (config-if)# exit (config)#
確認します。
疎通確認です。PCから対外へPingを送ります。
最後に、Internet側のGE0/4にIPv4アドレスを設定します。
(config)#interface GigabitEthernet0/4 (config-if)# ip address dhcp (config-if)# exit
確認します。
DHCPでデフォルトゲートウェイも設定されているはずなので、そちらも確認します。
疎通確認です。ipv4でルータから対外へpingを送ります。
IPv6でPCから対外への疎通およびIPv4でルータから対外への疎通が確認できたら、事前準備は完了です。お疲れ様でした。まだ事前準備です。
NAT64設定
お待たせいたしました。ここからNAT64の設定に入っていきます。(config)# (config)#ipv6 access-list v6test1 (config-ipv6-acl)# permit ipv6 any any (config-ipv6-acl)# exit (config)# (config)#nat64 v4 pool v4pool XXX.XXX.255.109 XXX.XXX.255.109 %Pool v4pool prefix length 32 too large; should be no more than 30 (config)#nat64 prefix stateful 64:ff9b::/96 %NAT64: Cannot use the well-known prefix (config)#nat64 v6v4 list v6test1 pool v4pool overload (config)#
nat64コマンドの最後の行は、list以降はほぼIPv4のNATと変わりませんね。
何か怒られたみたいですが、気にせず進みます。
(config)#interface GigabitEthernet0/4 (config-if)# nat64 enable (config-if)# exit (config)# (config)#interface Vlan1 (config-if)# nat64 enable (config-if)# exit (config)#
確認します。windowsではIPv6アドレスの中にIPv4アドレスを埋め込んで表記しても、自動で変換してくれます。
ダメです!
考察・トラブルシュート
configを流してる段階ですでに怪しい箇所がいくつかありましたね。まずはこれ。
-
%NAT64: Cannot use the well-known prefix
これは事前に検証した際に分かったことですが、
64:FF9B::/96
に関してはあえて設定しなくてもデフォルトで動作します。なぜそうなったかの経緯は分かりませんが、まあIPv4-embedded IPv6 addressのwell-known prefixだからですかね多分。
続いてはこれ。
-
%Pool v4pool prefix length 32 too large; should be no more than 30
要は変換用IPv4アドレスプールは/30以上にしなさいってことらしいです。
そもそもですが、IPv4のNATでは変換する送信元IPアドレスをインターフェースのアドレスに指定することができました。しかしNAT64ではそれができません。指定できるのはPoolだけです。これを最初見つけた時はマジかーって気分でしたが、仕方ありませんね。
一応
?
の結果を貼っておきます。
参考: IPv4のNAT
仕方がありません。poolでなんとかするしかないようです。
とりあえず最低限poolが/30になるように広げてみます。
(config)# (config)#no nat64 v4 pool v4pool XXX.XXX.255.109 XXX.XXX.255.109 NAT64 pool still in use, do you want to delete all entries? [no]: yes (config)# (config)#nat64 v4 pool v4pool XXX.XXX.255.108 XXX.XXX.255.111 (config)#
結論から言うと、これもダメです!
画像は載せていませんが、さっきとまったく同じ結果になりました。
今度はpoolをインターフェースのIPv4アドレスと重ならないようにしてみます。
(config)# (config)#no nat64 v4 pool v4pool XXX.XXX.255.108 XXX.XXX.255.111 pool still in use, do you want to delete all entries? [no]: yes (config)#nat64 v4 pool v4pool XXX.XXX.255.112 XXX.XXX.255.115 (config)#
確認してみましたが、やっぱりダメです!通りません。画像は載せていませんが、さっきから同じ出力ばかりです。
最終手段です、アドレスプールをインターフェースのIPv4アドレスのネットワーク全体に重ならないようにしました。
またそれに合わせて対向のルータにアドレスプール分の経路を向けさせる設定もします。本環境の例ではOSPFを使用します。
(config)#no nat64 v4 pool v4pool XXX.XXX.255.112 XXX.XXX.255.115 NAT64 pool still in use, do you want to delete all entries? [no]: yes (config)#nat64 v4 pool v4pool XXX.XXX.255.192 XXX.XXX.255.195 (config)# (config)#ip route XXX.XXX.255.192 255.255.255.252 Null0 (config)#router ospf 1 (config-router)# redistribute static subnets (config-router)# network XXX.XXX.255.0 0.0.0.127 area 0 (config-router)# exit (config)#
確認します。
2019年12月現在で、ネイティブでIPv6に対応していないYahoo-JAPANのサイトも問題なく閲覧できます。
まとめ
まとめです。なんとかしてCiscoルータでNAT64できないか試みてみました。CiscoのサイトではIOS-XE(ASR)向けのような物ばかりで、普通のIOS向けを見つけることができませんでした。なので
?
コマンドだけを頼りに検証を進めました。結果としてはNAT64自体は上手くできたのですが、うーんって感じ。まだまだ検証が足りないのか、それともRFCなどをロクに読んでないのが悪いのか。
いずれにせよこれでは一般家庭ではNAT64が使えません。だってアドレスプール用にグローバルIPv4アドレスが使える家なんて普通ありませんからね。
一応周りの人にこのことについて相談してみました。すると、
Ciscoのルータなんて一般家庭にないで。
付録
最終的に成功したパターンのconfigを載せておきます。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50(config)#ipv6 unicast-routing (config)#ipv6 cef (config)# (config)#interface GigabitEthernet0/4 (config-if)# ipv6 address autoconfig default (config-if)# no shutdown (config-if)# exit (config)# (config)#interface Vlan1 (config-if)# no ip address (config-if)# ipv6 address 2001:XXXX:XXXX:B3F1::1/64 (config-if)# ipv6 nd prefix 2001:XXXX:XXXX:B3F1::/64 (config-if)# ipv6 nd ra interval 5 3 (config-if)# ipv6 nd ra dns server 2001:4860:4860::6464 (config-if)# ipv6 nd ra dns server 2001:4860:4860::64 (config-if)# exit (config)# (config)#ipv6 router rip 1 (config-rtr)# exit (config)#interface GigabitEthernet0/4 (config-if)# ipv6 rip 1 enable (config-if)# exit (config)#interface Vlan1 (config-if)# ipv6 rip 1 enable (config-if)# exit (config)# (config)#interface GigabitEthernet0/4 (config-if)# ip address dhcp (config-if)# exit (config)# (config)#ipv6 access-list v6test1 (config-ipv6-acl)# permit ipv6 any any (config-ipv6-acl)# exit (config)# (config)#ip route XXX.XXX.255.192 255.255.255.252 Null0 (config)#router ospf 1 (config-router)# redistribute static subnets (config-router)# network XXX.XXX.255.0 0.0.0.127 area 0 (config-router)# exit (config)# (config)#nat64 v4 pool v4pool XXX.XXX.255.192 XXX.XXX.255.195 (config)#nat64 v6v4 list v6test1 pool v4pool overload (config)# (config)#interface GigabitEthernet0/4 (config-if)# nat64 enable (config-if)# exit (config)#interface Vlan1 (config-if)# nat64 enable (config-if)# exit (config)#