LinuxにおけるIPv6のアドレスアサイン方法①

## 概要
IPv6ネットワークではルータより配信されているra(router advertisement)のmフラグ、oフラグによりホストのIPアドレスの配布・アサイン方法が異なる。

|mフラグ  |oフラグ  |分類  |IPアドレス配布方法|サーバ情報|
|---|---|---|---|---|
|ON  |ON  |ステートフルDHCPv6 |DHCPv6|DHCPv6|
|ON  |OFF  |ステートレスDHCPv6  |RA|DHCPv6|
|OFF  |ON  |ステートフル  |DHCPv6|手動|
|OFF  |OFF  |ステートレス  |RA|手動|

IPアドレスの配布/アサイン方法としてはRAを元にホスト側で生成するステートレスまたはDHCPv6サーバより配布されるステートフルがある。

IPアドレスとは別にサーバ情報（DNS,NTPサーバ等）はDHCPv6で配布するかホストで手動で設定となる。（RAではサーバ情報は配布されない）

## 環境
* osxのmultipass上で動作するUbuntu20.04


## ステートレスによるIPv6アドレスアサインの検証
linux network namespaceを用いて検証する。network namespaceを作成する。ここではlan-router-wanの3つのnamespaceを作成する。

* radvdのインストール
<pre>sudo apt-get install radvd</pre>
* 検証環境構築
<pre>sudo ip netns add lan
sudo ip netns add router
sudo ip netns add wan
sudo ip link add lan-veth0 type veth peer name gw-veth0
sudo ip link add wan-veth0 type veth peer name gw-veth1
sudo ip link set lan-veth0 netns lan
sudo ip link set wan-veth0 netns wan
sudo ip link set gw-veth0 netns router
sudo ip link set gw-veth1 netns router
sudo ip netns exec lan ip link set lan-veth0 up
sudo ip netns exec wan ip link set wan-veth0 up
sudo ip netns exec router ip link set gw-veth0 up
sudo ip netns exec router ip link set gw-veth1 up</pre>

* WAN側環境でIPv6の転送を有効化
<pre>sudo ip netns exec wan sysctl -w net.ipv6.conf.all.forwarding=1  
net.ipv6.conf.all.forwarding = 1</pre>

* ルータにてRAの受信を有効化
<pre>sudo ip netns exec router sysctl -w net.ipv6.conf.gw-veth1.accept_ra=2
net.ipv6.conf.gw-veth1.accept_ra = 2</pre>

* WANのネットワークインタフェースに手動でグローバルアドレスを設定
<pre>sudo ip netns exec wan ip addr add 2001:db8::1/64 dev wan-veth0 
sudo ip netns exec wan ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: wan-veth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 0a:61:ff:c6:c6:d1 brd ff:ff:ff:ff:ff:ff link-netns router
    inet6 2001:db8::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::861:ffff:fec6:c6d1/64 scope link 
       valid_lft forever preferred_lft forever</pre>

* radvdの設定
<pre>cat /etc/radvd.conf 
interface wan-veth0{
	AdvSendAdvert on;
	AdvManagedFlag off;        # Mフラグ Off
	AdvOtherConfigFlag off;    # Oフラグ Off
	prefix 2001:db8::/64{};
};</pre>

* radvd起動
<pre>sudo ip netns exec wan sudo radvd</pre>
* router側でIPアドレスのアサインを確認。
<pre>sudo ip netns exec router ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: gw-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d6:35:44:4a:15:6a brd ff:ff:ff:ff:ff:ff link-netns lan
    inet6 fe80::d435:44ff:fe4a:156a/64 scope link 
       valid_lft forever preferred_lft forever
5: gw-veth1@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f2:dd:83:fe:62:c4 brd ff:ff:ff:ff:ff:ff link-netns wan
    inet6 fe80::f0dd:83ff:fefe:62c4/64 scope link 
       valid_lft forever preferred_lft forever

sudo ip netns exec router ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: gw-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d6:35:44:4a:15:6a brd ff:ff:ff:ff:ff:ff link-netns lan
    inet6 fe80::d435:44ff:fe4a:156a/64 scope link 
       valid_lft forever preferred_lft forever
5: gw-veth1@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f2:dd:83:fe:62:c4 brd ff:ff:ff:ff:ff:ff link-netns wan
    inet6 2001:db8::f0dd:83ff:fefe:62c4/64 scope global dynamic mngtmpaddr 
       valid_lft 86399sec preferred_lft 14399sec
    inet6 fe80::f0dd:83ff:fefe:62c4/64 scope link 
       valid_lft forever preferred_lft forever</pre>

## ステートフルDHCPv6によるIPv6アドレスアサインの検証
linux network namespaceを用いて検証する。network namespaceを作成する。ここではlan-router-wanの3つのnamespaceを作成する。

* 検証環境構築
<pre>sudo ip netns add lan
sudo ip netns add router
sudo ip netns add wan
sudo ip link add lan-veth0 type veth peer name gw-veth0
sudo ip link add wan-veth0 type veth peer name gw-veth1
sudo ip link set lan-veth0 netns lan
sudo ip link set wan-veth0 netns wan
sudo ip link set gw-veth0 netns router
sudo ip link set gw-veth1 netns router
sudo ip netns exec lan ip link set lan-veth0 up
sudo ip netns exec wan ip link set wan-veth0 up
sudo ip netns exec router ip link set gw-veth0 up
sudo ip netns exec router ip link set gw-veth1 up</pre>

* WAN側環境でIPv6の転送を有効化
<pre>sudo ip netns exec wan sysctl -w net.ipv6.conf.all.forwarding=1  
net.ipv6.conf.all.forwarding = 1</pre>

* ルータにてRAの受信とsolicitを有効化
<pre>sudo ip netns exec router sysctl -w net.ipv6.conf.gw-veth1.accept_ra=2
sudo ip netns exec router sysctl -w net.ipv6.conf.gw-veth1.router_solicitations=1</pre>

* WANのネットワークインタフェースに手動でグローバルアドレスを設定
<pre>sudo ip netns exec wan ip addr add 2001:db8::1/64 dev wan-veth0 
sudo ip netns exec wan ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: wan-veth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 0a:61:ff:c6:c6:d1 brd ff:ff:ff:ff:ff:ff link-netns router
    inet6 2001:db8::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::861:ffff:fec6:c6d1/64 scope link 
       valid_lft forever preferred_lft forever</pre>

* radvdの設定
<pre>cat /etc/radvd.conf 
interface wan-veth0{
	AdvSendAdvert on;
	AdvManagedFlag on;        # Mフラグ On
	AdvOtherConfigFlag on;    # Oフラグ On
	prefix 2001:db8::/64{};
};</pre>

* radvd起動
<pre>sudo ip netns exec wan sudo radvd</pre>

* DHCPサーバの起動
isc-dhcpが起動しなかった(dhcpd6.leases: Permission denied)のでwide-dhcpv6を起動。

<pre>sudo apt-get install wide-dhcp-server
cat /etc/dhcp6s.conf

interface wan-veth0 {
	address-pool pool1 3600;
};

pool pool1 {
	range 2001:db8:1:2::1000 to 2001:db8:1:2::2000 ;
};
sudo ip netns exec wan dhcp6s -c /etc/dhcp6s.conf wan-veth0</pre>

* DHCPクライアントの起動
こちらはisc-dhcpclientを用いる。

<pre>sudo apt-get install isc-dhcp-server
cat  /etc/dhcp/dhclient6.conf 
interface "gw-veth1" {
    send dhcp6.client-id DUID;
}
sudo ip netns exec router dhclient -cf  /etc/dhcp/dhclient6.conf -6
</pre>
* IPアドレスの確認。radvdで設定したアドレスではなく、dhcpv6サーバで設定した払い出しアドレスがアサインされていることが確認できる。
<pre>sudo ip netns exec router ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: gw-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b2:d6:b2:55:46:9c brd ff:ff:ff:ff:ff:ff link-netns lan
    inet6 fe80::b0d6:b2ff:fe55:469c/64 scope link 
       valid_lft forever preferred_lft forever
5: gw-veth1@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 56:be:de:cc:b2:28 brd ff:ff:ff:ff:ff:ff link-netns wan
    inet6 2001:db8:1:2::1000/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::54be:deff:fecc:b228/64 scope link 
       valid_lft forever preferred_lft forever</pre>