/
カテゴリー

概要

ある日仕事のできない上司から「isc-dhcpを使ってdhcpv6アドレスを配布したいが動かない」と言われ相談を受けました。

上司が作成していたシステムは下記のようなものでした。

前提条件

  • 操作を行えるのはDHCP server、クライアントです
  • プレフィックス・GWに関しては配布できていなくても良いです

初期状態

クライアントにアドレスが割り振られず、 ping fc00:1:1:1::1 をしても応答がない。

終了状態

クライアントにアドレスが配布されてあり、「fc00:1:1:1::1」に対しpingコマンドにて応答があることを確認する。

解説

こんにちは。この問題を作問したHickyです。今回の問題は、IPv6、アドレス配布に関する基礎知識を問う問題でした。
まず初めにクライアントのDHCPの状態を確認します。

[email protected]:~$ ip a
<---抜粋--->
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 9c:a3:ba:20:a0:fc brd ff:ff:ff:ff:ff:ff

これよりDHCP待ち受けインターフェースにアドレスが配布されていないことが確認できます。なのでクライアントのネットワーク設定を確認します。

[email protected]:~$ sudo cat /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    eth0:
      addresses:
        - 192.168.3.2/24
      dhcp4: 'no'
      dhcp6: 'no'
      gateway4: 192.168.3.254
  renderer: networkd
  version: 2

ここでeth1に関するDHCPの設定が不足していることが確認できます。そこで下記のようにファイルを書き換えます。

[email protected]:~$ sudo cat /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    eth0:
      addresses:
        - 192.168.3.2/24
      dhcp4: 'no'
      dhcp6: 'no'
      gateway4: 192.168.3.254
    eth1:
      dhcp6: 'yes'
      accept-ra: 'yes'
  renderer: networkd
  version: 2

そして上記の設定を適応させ、リンクローカルアドレズが配布されていることを確認できます。

[email protected]:~$ ip a
<---抜粋--->
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 9c:a3:ba:20:a0:fc brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9ea3:baff:fe20:a0fc/64 scope link
       valid_lft forever preferred_lft forever

次にDHCPサーバーが動作しているホストにてDHCPサービスの動作について確認します。

[email protected]:~$ sudo systemctl status isc-dhcp-server6
● isc-dhcp-server6.service - ISC DHCP IPv6 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server6.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-08-30 23:10:16 JST; 4min 1s ago
       Docs: man:dhcpd(8)
   Main PID: 414 (dhcpd)
      Tasks: 4 (limit: 1108)
     Memory: 5.1M
     CGroup: /system.slice/isc-dhcp-server6.service
             └─414 dhcpd -user dhcpd -group dhcpd -f -6 -pf /run/dhcp-server/dhcpd6.pid -cf /etc/dhcp/dhcpd6.conf

Aug 30 23:10:16 dhserver sh[414]: ** Ignoring requests on eth0.  If this is not what
Aug 30 23:10:16 dhserver sh[414]:    you want, please write a subnet6 declaration
Aug 30 23:10:16 dhserver sh[414]:    in your dhcpd.conf file for the network segment
Aug 30 23:10:16 dhserver sh[414]:    to which interface eth0 is attached. **
Aug 30 23:10:16 dhserver dhcpd[414]: ** Ignoring requests on eth0.  If this is not what
Aug 30 23:10:16 dhserver dhcpd[414]:    you want, please write a subnet6 declaration
Aug 30 23:10:16 dhserver dhcpd[414]:    in your dhcpd.conf file for the network segment
Aug 30 23:10:16 dhserver dhcpd[414]:    to which interface eth0 is attached. **
Aug 30 23:10:16 dhserver dhcpd[414]:
Aug 30 23:10:16 dhserver dhcpd[414]: Server starting service.
[email protected]:~$ 

配布インターフェースに問題がありそうなので下記のようにインターフェースの設定を投入します。

[email protected]:~$ sudo cat /etc/default/isc-dhcp-server
# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#       Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4=""
INTERFACESv6="eth1"

その後再度DHCPサービスの状態を確認すると正常に動作していることを確認できます。

[email protected]:~$ sudo systemctl status isc-dhcp-server6
● isc-dhcp-server6.service - ISC DHCP IPv6 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server6.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-08-30 23:39:30 JST; 2s ago
       Docs: man:dhcpd(8)
   Main PID: 948 (dhcpd)
      Tasks: 4 (limit: 1108)
     Memory: 2.3M
     CGroup: /system.slice/isc-dhcp-server6.service
             └─948 dhcpd -user dhcpd -group dhcpd -f -6 -pf /run/dhcp-server/dhcpd6.pid -cf /etc/dhcp/dhcpd6.conf eth1

Aug 30 23:39:30 dhserver sh[948]: PID file: /run/dhcp-server/dhcpd6.pid
Aug 30 23:39:30 dhserver dhcpd[948]: Wrote 2 NA, 0 TA, 0 PD leases to lease file.
Aug 30 23:39:30 dhserver sh[948]: Wrote 2 NA, 0 TA, 0 PD leases to lease file.
Aug 30 23:39:30 dhserver dhcpd[948]: Bound to *:547
Aug 30 23:39:30 dhserver sh[948]: Bound to *:547
Aug 30 23:39:30 dhserver sh[948]: Listening on Socket/7/eth1/fc00:1:1:1::/64
Aug 30 23:39:30 dhserver sh[948]: Sending on   Socket/7/eth1/fc00:1:1:1::/64
Aug 30 23:39:30 dhserver dhcpd[948]: Listening on Socket/7/eth1/fc00:1:1:1::/64
Aug 30 23:39:30 dhserver dhcpd[948]: Sending on   Socket/7/eth1/fc00:1:1:1::/64
Aug 30 23:39:30 dhserver dhcpd[948]: Server starting service.

クライアントにてIPアドレスを確認すると配布できていないことが確認できます。

[email protected]:~$ ip a
<---抜粋--->
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 9c:a3:ba:20:a0:fc brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9ea3:baff:fe20:a0fc/64 scope link
       valid_lft forever preferred_lft forever

DHCPv6でアドレスを配布するためにはRAのMフラグを立てなければいけないので、下記のようなファイルを作成しRadvdを起動させます。

[email protected]:~$ sudo cat /etc/radvd.conf
interface eth1
{
AdvSendAdvert on;
AdvManagedFlag on;
prefix fc00:1:1:0::/64
{
AdvOnLink off;
AdvAutonomous off;
AdvRouterAddr off;
};

};

Radvdの状態を確認すると、正常に動作していることを確認できます。

[email protected]:~$ sudo systemctl start radvd.service
[email protected]:~$ sudo systemctl status radvd.service
● radvd.service - Router advertisement daemon for IPv6
     Loaded: loaded (/lib/systemd/system/radvd.service; disabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-08-30 23:49:57 JST; 4s ago
       Docs: man:radvd(8)
    Process: 1074 ExecStartPre=/usr/sbin/radvd --logmethod stderr_clean --configtest (code=exited, status=0/SUCCESS)
    Process: 1083 ExecStart=/usr/sbin/radvd --logmethod stderr_clean (code=exited, status=0/SUCCESS)
   Main PID: 1084 (radvd)
      Tasks: 2 (limit: 1108)
     Memory: 788.0K
     CGroup: /system.slice/radvd.service
             ├─1084 /usr/sbin/radvd --logmethod stderr_clean
             └─1085 /usr/sbin/radvd --logmethod stderr_clean

Aug 30 23:49:57 dhserver systemd[1]: Starting Router advertisement daemon for IPv6...
Aug 30 23:49:57 dhserver radvd[1074]: config file, /etc/radvd.conf, syntax ok
Aug 30 23:49:57 dhserver radvd[1083]: version 2.17 started
Aug 30 23:49:57 dhserver radvd[1083]: IPv6 forwarding setting is: 0, should be 1 or 2
Aug 30 23:49:57 dhserver radvd[1083]: IPv6 forwarding seems to be disabled, but continuing anyway
Aug 30 23:49:57 dhserver systemd[1]: Started Router advertisement daemon for IPv6.

その後クライアント側でnetplanを再起動しアドレスが配布されていることを確認します。

[email protected]:~$ sudo netplan apply
[email protected]:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 9c:a3:ba:25:67:77 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.2/24 brd 192.168.3.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe25:6777/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 9c:a3:ba:20:a0:fc brd ff:ff:ff:ff:ff:ff
    inet6 fc00:1:1:1::2:d32d/128 scope global tentative dynamic noprefixroute
       valid_lft 2591915sec preferred_lft 604715sec
    inet6 fe80::9ea3:baff:fe20:a0fc/64 scope link
       valid_lft forever preferred_lft forever

DHCPサーバーの状態を確認するとDHCPサーバーがアドレスを配布していることを確認できます。

[email protected]:~$ sudo systemctl status isc-dhcp-server6
● isc-dhcp-server6.service - ISC DHCP IPv6 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server6.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-08-30 23:39:30 JST; 16min ago
       Docs: man:dhcpd(8)
   Main PID: 948 (dhcpd)
      Tasks: 4 (limit: 1108)
     Memory: 2.4M
     CGroup: /system.slice/isc-dhcp-server6.service
             └─948 dhcpd -user dhcpd -group dhcpd -f -6 -pf /run/dhcp-server/dhcpd6.pid -cf /etc/dhcp/dhcpd6.conf eth1

Aug 30 23:49:58 dhserver dhcpd[948]: Request message from fe80::9ea3:baff:fe20:a0fc port 546, transaction ID 0x16F6D100
Aug 30 23:49:58 dhserver dhcpd[948]: Reply NA: address fc00:1:1:1::2:d32d to client with duid 00:02:00:00:ab:11:1c:ef:e0:6a:e7:bd:0c:ac iaid = 1079403426 valid for 2592000 seconds
Aug 30 23:49:58 dhserver dhcpd[948]: Sending Reply to fe80::9ea3:baff:fe20:a0fc port 546
Aug 30 23:51:22 dhserver dhcpd[948]: Solicit message from fe80::9ea3:baff:fe20:a0fc port 546, transaction ID 0x55698900
Aug 30 23:51:22 dhserver dhcpd[948]: Advertise NA: address fc00:1:1:1::2:d32d to client with duid 00:02:00:00:ab:11:1c:ef:e0:6a:e7:bd:0c:ac iaid = 1079403426 valid for 2592000 seconds
Aug 30 23:51:22 dhserver dhcpd[948]: Sending Advertise to fe80::9ea3:baff:fe20:a0fc port 546
Aug 30 23:51:23 dhserver dhcpd[948]: Request message from fe80::9ea3:baff:fe20:a0fc port 546, transaction ID 0x6577B800
Aug 30 23:51:23 dhserver dhcpd[948]: Reply NA: address fc00:1:1:1::2:d32d to client with duid 00:02:00:00:ab:11:1c:ef:e0:6a:e7:bd:0c:ac iaid = 1079403426 valid for 2592000 seconds
Aug 30 23:51:23 dhserver dhcpd[948]: Reusing lease for: fc00:1:1:1::2:d32d, age 85 secs < 25%, sending shortened lifetimes - preferred: 604715, valid 2591915
Aug 30 23:51:23 dhserver dhcpd[948]: Sending Reply to fe80::9ea3:baff:fe20:a0fc port 546

pingコマンドを用いて「fc00:1:1:1::1」との疎通確認を行います。

[email protected]:~$ ping fc00:1:1:1::1
PING fc00:1:1:1::1(fc00:1:1:1::1) 56 data bytes
64 bytes from fc00:1:1:1::1: icmp_seq=1 ttl=64 time=0.816 ms
64 bytes from fc00:1:1:1::1: icmp_seq=2 ttl=64 time=0.295 ms
64 bytes from fc00:1:1:1::1: icmp_seq=3 ttl=64 time=0.314 ms
^C
--- fc00:1:1:1::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2026ms
rtt min/avg/max/mdev = 0.295/0.475/0.816/0.241 ms