🔖

JANOG55 Level3-3 問題解説

2025/01/30に公開

みなさんこんにちは!Lyle/Hassyです!
先週JANOG55が開催されましたね!
京都にお越しくださった皆さん、ありがとうございました!
私はJANOG55のnetcon実行委員をさせていただいてまして、問題を1問出題させていただきました!(Level3-3)
この記事はその問題の解説記事となります。

問題

まずは問題をおさらいしていきましょう。DHCPサーバーからルーターに適切なv6アドレスを配布するよう設定する問題となっています。

問題文


あなたはネットワークの勉強をしているエンジニアです。
DHCPサーバー(vyos)にルーターを接続させて、DHCPによってIPアドレスが割り当てられ、ルーターとDHCPサーバー間で通信できるようにしようとしました。
しかし、IPv4ではDHCPサーバーを用いてIPアドレスが割り振り通信できるよう設定できましたが、IPv6で同じように設定してもうまく行きません。

ルーターにDHCPv6によるIPv6アドレスの割り振りが行われ、ルーターとDHCPサーバーでIPv6による通信ができるよう設定を修正してください。

達成条件

  • RT-01のGi0/0/0/0にDHCPv6によって2001:db8::100/64が割り振られること。
  • RT-01のGi0/0/0/0からSV-01の 2001:db8::1/64に通信できること。

    ping 2001:db8::1 source 2001:db8::100

制約

  • DHCPv6を用いて、ルーターにIPv6アドレスを設定してください。(静的にIPアドレスを設定するのは禁止です。)
  • Static Routeを設定するのは禁止です。

事象の確認1

では、まずDHCPサーバー「SV-01」のconfigを見ていきましょう。

vyos@SV-01:~$ show configuration 
interfaces {
    ethernet eth1 {
        address 2001:db8::1/64
        address 192.168.1.1/24
        offload {
            gso
            sg
        }
    }
    loopback lo {
    }
}
service {
    dhcp-server {
        shared-network-name LAN001 {
            subnet 192.168.1.0/24 {
                range 0 {
                    start 192.168.1.100
                    stop 192.168.1.199
                }
                subnet-id 1
            }
        }
    }
    dhcpv6-server {
        shared-network-name LAN002 {
            subnet 2001:db8::/64 {
                prefix-delegation {
                    prefix 2001:db8:0:10:: {
                        delegated-length 64
                        prefix-length 60
                    }
                }
                range 1 {
                    start 2001:db8::100
                    stop 2001:db8::199
                }
                subnet-id 2
            }
        }
    }
    ntp {
        allow-client {
            address 127.0.0.0/8
            address 169.254.0.0/16
            address 10.0.0.0/8
            address 172.16.0.0/12
            address 192.168.0.0/16
            address ::1/128
            address fe80::/10
            address fc00::/7
        }
        server time1.vyos.net {
        }
        server time2.vyos.net {
        }
        server time3.vyos.net {
        }
    }
}
system {
    config-management {
        commit-revisions 100
    }
    console {
        device ttyS0 {
            speed 115200
        }
    }
    host-name SV-01
    login {
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
        }
    }
    syslog {
        global {
            facility all {
                level info
            }
            facility local7 {
                level debug
            }
        }
    }
}

DHCPv4サーバーとDHCPv6サーバーの役割が動いていることがわかります。
DHCPv6のprefix-delegationを行っていること以外はどちらも同じような設定がされていますね。
これで動いていそうですが、実際にRT-01に入って確認してみましょう。

RP/0/RP0/CPU0:RT-01#show ip interface gigabitEthernet 0/0/0/0 brief 

Interface                      IP-Address      Status                Protocol
GigabitEthernet0/0/0/0         192.168.1.100   Up                    Up      
RP/0/RP0/CPU0:RT-01#show ipv6 interface gigabitEthernet 0/0/0/0 brief 

GigabitEthernet0/0/0/0 [Up/Up]
    fe80::a8c1:abff:fede:4703      

IPv4アドレスはしっかり割り当てられていますが、IPv6アドレスはリンクローカルアドレスしかありませんね……。
そのため、DHCPv6に何か問題がある、ということがわかります。

解説1

今回の原因はDHCPv6サーバーにinterfaceの設定が明示されていないことです。
VyOSのdhcpv6-serverでは、どのインターフェースでDHCPv6を提供するのか 明示的に指定する必要があります。
そのため、以下のコマンドをSV-01で入力してみましょう。

vyos@SV-01:~$ configure
vyos@SV-01# set service dhcpv6-server shared-network-name 'LAN002' interface 'eth1'
vyos@SV-01# commit
vyos@SV-01# exit

するとRT-01でIPv6アドレス"2001:db8::100"が割り当てられました!

RP/0/RP0/CPU0:RT-01#show ipv6 interface gigabitEthernet 0/0/0/0 brief 

GigabitEthernet0/0/0/0 [Up/Up]
    fe80::a8c1:abff:fede:4703                     
    2001:db8::100    

なぜDHCPv4はインターフェースの明示が必要ないのに、DHCPv6はインターフェースの明示が必要なのか、という点ですが、これはDHCPv4とDHCPv6の仕様の違いにあると考えています。
DHCPv4はブロードキャストを用いるため、どのインターフェースでも受信することができます。(RFC2131)
一方、IPv6はブロードキャストが存在しないため、DHCPv6はマルチキャストで行います。(RFC8415)
そのため、どのインターフェースでDHCPv6のマルチキャストを受信するか明示する必要があります。

事象の確認2

これでRT-01にIPv6アドレスが割り当てられたので、疎通テストを行いましょう。

RP/0/RP0/CPU0:RT-01#ping ipv6 2001:db8::1 repeat 5 source 2001:db8::100

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:db8::1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

あれ……pingが通りませんね……。
まだ、問題が解決していないことがわかります。
改めてRT-01のIPv6のインターフェースを確認してみましょう。

RP/0/RP0/CPU0:RT-01#show ipv6 interface gigabitEthernet 0/0/0/0 
GigabitEthernet0/0/0/0 is Up, ipv6 protocol is Up, Vrfid is default (0x60000000)
  IPv6 is enabled, link-local address is fe80::a8c1:abff:fede:4703 
  Global unicast address(es):
    2001:db8::100, subnet is 2001:db8::100/128 
  Joined group address(es): ff02::1:ff00:100 ff02::1:ffde:4703 ff02::2
      ff02::1
  MTU is 1514 (1500 is available to IPv6)
  ICMP redirects are disabled
  ICMP unreachables are enabled
  ND DAD is enabled, number of DAD attempts 1
  ND reachable time is 0 milliseconds
  ND cache entry limit is 1000000000
  ND advertised retransmit interval is 0 milliseconds
  ND router advertisements are sent every 160 to 240 seconds
  ND router advertisements live for 1800 seconds
  Hosts use stateless autoconfig for addresses.
  Outgoing access list is not set
  Inbound  common access list is not set, access list is not set
  Table Id is 0xe0800000
  Complete protocol adjacency: 1
  Complete glean adjacency: 0
  Incomplete protocol adjacency: 0
  Incomplete glean adjacency: 0
  Dropped protocol request: 0
  Dropped glean request: 0
  RA DNS Server Address Count: 0
  RA DNS Search list Count: 0

解説2

今回疎通しない理由は、2001:db8::100, subnet is 2001:db8::100/128 、つまりサブネットマスクが/128となってしまっているからです。
/128はホストアドレスとなってしまっているので、これでは他のホストと通信することができません。
そこで、/64が割り当てられるよう再設定する必要があります。

RP/0/RP0/CPU0:RT-01#conf t
RP/0/RP0/CPU0:RT-01(config)#interface gigabitEthernet 0/0/0/0
RP/0/RP0/CPU0:RT-01(config-if)#ipv6 address dhcp-client-options prefix-len 64
RP/0/RP0/CPU0:RT-01(config-if)#no ipv6 address dhcp
RP/0/RP0/CPU0:RT-01(config-if)#ipv6 address dhcp
RP/0/RP0/CPU0:RT-01(config-if)#commit

上のコマンドを入力すると、ルータのインターフェースが「/64のアドレスを取得するように要求」するようになります。

RP/0/RP0/CPU0:RT-01#show ipv6 interface gigabitEthernet 0/0/0/0        

GigabitEthernet0/0/0/0 is Up, ipv6 protocol is Up, Vrfid is default (0x60000000)
  IPv6 is enabled, link-local address is fe80::a8c1:abff:fede:4703 
  Global unicast address(es):
    2001:db8::100, subnet is 2001:db8::/64 
  Joined group address(es): ff02::1:ff00:100 ff02::1:ffde:4703 ff02::2
      ff02::1

/64が割り当てられましたね。
もう一度疎通確認してみましょう。

RP/0/RP0/CPU0:RT-01#ping ipv6 2001:db8::1 repeat 5 source 2001:db8::100

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:db8::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/3/9 ms

今度はちゃんと疎通できました!
これで問題の達成条件を満たすことができました。
お疲れさまでした♪

最後に

今回のvyosでDHCPv6サーバーを動かして、ルーターにIPv6アドレスを割り当てる、という問題は実際に僕が踏んだトラブルを元にしています。
年末、ちょっと遊びで DHCPv6 の挙動を確認したくて ネットワークを組んでみました。
「DHCPv6って普段あまり触らないし、試しにVyOSでDHCPv6サーバーを動かして、ルーターにIPv6アドレスを割り当ててみるか~」くらいの軽いノリでした。
ところが思いっきりハマりました。
なんとか動かせるようになるまで丸一日溶かしましたね(笑)。

そもそもIPv6ってSLAACStateless Address Autoconfiguration)で勝手にアドレスが設定されることが多いので、DHCPv6を触る機会って少ないんですよね。
ましてや まだまだIPv4が主流の環境が多い ので、IPv6そのもののトラブルすら珍しいかもしれません。
そこで、自分がハマったトラブルの供養も兼ねつつ、「IPv4ばかり触っていると、いざIPv6を使うときに沼るぞ〜!」というメッセージを込めて、この問題を出題しました!
最終的にですが、今回作った問題を10名の方が正解してくれました!
正解してくれた方はもちろん、挑戦していただいた方も本当にありがとうございます!

また機会があれば、面白いネットワーク系の問題を作ってみたいと思いますので、そのときはよろしくお願いします!

GitHubで編集を提案

Discussion