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)#