FreeBSD mpd5でIPv6接続 (PPPoE) その3

前の記事の続き

RA

ここまででルーター自体は機能しているのでネットワーク内の他のノード(ホスト)でもIPv6の手動設定を行うならネットワークを作ることができる。
でも、IPv6ではアドレスの自動設定を行うSLAAC(Stateless Address Autoconfiguration)という機能が使えるのでそれを使う方が簡単。というか、手動設定じゃ手軽に使えない。

そこで、(ルーターの)IPv6アドレスを他のノードに配るのにRA(Router Advertisement)を使う。
で、FreeBSDでは標準で入っているrtadvdでRAができることになっている。 /etc/rtadvd.confを作成して/etc/rc.confにrtadvd_enable="YES"とrtadvd_interfaces="em1" (em1はLANのNIC)を書けば良い筈。(標準設定のみなら/etc/rtadvd.confは要らない?)

/etc/rtadvd.conf
1
2
3
4
5
6
em1:\
    :raflags="mo":\
    :addr="240d:****:****:****プレフィックス部分":prefixlen#64:\
    :pinfoflags="l":\
    :rdnss="IPv6用 DNSサーバのアドレス":\
    :dnssl="localnetなどテキトーに":

ところが、/etc/rtadvd.confが動かなくて投げ出すことに。というか、ネットワーク内のパケットを眺めてもRAがもの凄く待って忘れかけた頃にようやくチョロっ程度にしか出力されないんだけどどうなってるの?間違ってるのかしら。rtadvdを停止・再起動しようとするととんでもなく時間かかるし。
このrtadvdによるRAの出力が全く上手くいかなくて1日ほど無駄に。

設定ファイルの書き方が違うだけだと思うのだが、どうしてもダメだったのでrtadvdを諦めてLinuxでもよく使われるradvdをインストール。

# cd /usr/ports/net/radvd
# make install clean
設定ファイルは/usr/local/etc/radvd.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface em1                       #RAを行うNIC (LAN側)
{
    AdvSendAdvert on;               #もちろんルータ広告送信する

#   MinRtrAdvInterval 3;            #以下4行は好みで(sampleママ)
#   MaxRtrAdvInterval 10;
#   AdvDefaultPreference low;
#   AdvHomeAgentFlag off;

    prefix 240d:****:****:****::/64 #以下6行が広告するprefix
    {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr off;          #←こいつの動きがよく解らない
    };

    #DNS GoogleDNS 8888&8844
    RDNSS 2001:4860:4860::8888 2001:4860:4860::8844
    {
        AdvRDNSSLifetime 30;
    };
};

このradvdは思ったとおりに動くんだよなぁ。

以前はRAでDNSの情報を広告することはできなかったみたいだが、現在はできることになっている。(RFC6106)
radvdでもRDNSSやDNSSLで指定できる。(FreeBSDに標準で入っているrtadvdも同じく)
でも、RAでのDNSサーバのアドレス広告はノード側が受け取ってくれないこと(Windowsね)があるようなので今回はRAでは通知せずDHCPv6で
DHCP6だと今度はAndroidが受け取れないらしい。結局のところRAとDHCPv6の両方でやるのが良いっぽい。

/usr/local/etc/dhcp6s.conf
1
2
3
4
5
6
7
8
9
option domain-name-servers 2001:4860:4860::8888;   #Google DNS
option domain-name-servers 2001:4860:4860::8844;   #Google DNS
interface em1 {
    address-pool pool1 3600;
};

pool pool1 {
    range  240d:xxxx:xxxx:xxxx::1000 to 240d:xxxx:xxxx:xxxx::2000;
};

poolのrangeはDHCPで割り当てるIPv6アドレスの範囲。

/etc/rc.confに追記 (2つ前の記事で足したのを含む)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ipv6_gateway_enable="YES"
route6d_enable="YES"
ipv6_network_interfaces="lo0 em1"
ifconfig_em1_ipv6="inet6 accept_rtadv"
#rtadvd_enable="YES"                   #上手く動かなかったrtadvd用の設定(以下3行)コメントで無効化
#rtadvd_interfaces="em1"
#rtadvd_flags="-s"
radvd_enable="YES"
dhcp6s_enable="YES"
dhcp6s_config="/usr/local/etc/dhcp6s.conf"
dhcp6s_interface="em1"

em1はLAN側のNIC。

ISPのネームサーバの取り方

2016年12月上旬現在、So-netではIPv6用のネットワーク接続の為の情報を全然出していない。IPv6のPPPoEアカウントとパスワード(IPv4のPPPoEと兼用)ということだけ。だからIPv6用のネームサーバも解らない。
既にGoogleとOpenDNSのDNSを仮利用する設定を書いているが、できればISPのネームサーバを使いたい。

そこで、dhcp6cでSo-netのネームサーバを取得する。

/usr/local/etc/dhcp6c.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
interface ng0 {
    send ia-pd 0;
    request domain-name-servers;
    script "/usr/local/etc/dhcp6c_post.sh";
};
id-assoc pd 0{
    prefix-interface em1 {
        sla-len 8;
        sla-id 1;
    };
};
/usr/local/etc/dhcp6c_post.sh
1
2
#!/bin/sh
echo $new_domain_name_servers > /tmp/isp_resolver.txt

これで、次回にdhcp6cが実行された際に /tmp/isp_resolver.txt にISPのネームサーバが書き込まれる。(おそらく2個か3個程度)
それを /etc/resolv.conf と dhcp6s.conf に書けば良い。ネームサーバを取得したら /usr/local/etc/dhcp6c.conf を元に戻し、 /usr/local/etc/dhcp6c_post.sh と /tmp/isp_resolver.txt は消せばよい。

WindowsでIPv6アドレス取得

ルーターでRAを出しているのでIPv6のデフォルトゲートウェイは自動的に取れる筈。IPv6アドレスも設定される筈。DHCPv6でネームサーバを配っているのでそれも取れる筈だし、追加のIPv6アドレスも取れる筈。
なのにWindowsでは上手くIPv6周りが設定されないことがある。相変わらず変なOS。

そこで、スタートボタン右クリック、「コマンドプロンプト(管理者)」をクリック。(Windows 10の場合)

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>netsh interface ipv6 reset[Enter]
インターフェース のリセットに成功しました。
近隣 のリセットに成功しました。
パス のリセットに成功しました。
 のリセットに失敗しました。
アクセスが拒否されました。

 のリセットに成功しました。
コンピューターを再起動してこの操作を完了してください。


C:\Windows\system32>

こんな感じ。「~が失敗しました」とかは無視。
Windowsを再起動する。

これでWindowsの新しいIPv6アドレスが取得できない、IPv6デフォルトゲートウェイが取得できない、IPv6 DNSサーバが取得できないなどの問題が解決される筈。
この症状のせいでかなり悩んだわ。

C:\Users\foobar> ipconfig /all[Enter]

Windows IP 構成

   ホスト名. . . . . . . . . . . . . . .: DESKTOP-HOGEHOGE
   プライマリ DNS サフィックス . . . . .:
   ノード タイプ . . . . . . . . . . . .: ハイブリッド
   IP ルーティング有効 . . . . . . . . .: いいえ
   WINS プロキシ有効 . . . . . . . . . .: いいえ
   DNS サフィックス検索一覧. . . . . . .: localnet

イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .: localnet
   説明. . . . . . . . . . . . . . . . .: Realtek PCIe GBE Family Controller
   物理アドレス. . . . . . . . . . . . .: D0-50-99-xx-xx-xx
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   IPv6 アドレス . . . . . . . . . . . .: 240d:xxxx:xxxx:xxxx::2000(優先)
   リース取得. . . . . . . . . . . . . .: 2016年12月11日 9:40:27
   リースの有効期限. . . . . . . . . . .: 2016年12月11日 11:10:26
   IPv6 アドレス . . . . . . . . . . . .: 240d:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx(優先)
   一時 IPv6 アドレス. . . . . . . . . .: 240d:xxxx:xxxx:xxxx:yyyy:yyyy:yyyy:yyyy(優先)
   リンクローカル IPv6 アドレス. . . . .: fe80::xxxx:xxxx:xxxx:xxxx%2(優先)
   IPv4 アドレス . . . . . . . . . . . .: 192.168.xxx.xxx(優先)
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   リース取得. . . . . . . . . . . . . .: 2016年12月10日 23:10:10
   リースの有効期限. . . . . . . . . . .: 2016年12月25日 23:10:09
   デフォルト ゲートウェイ . . . . . . .: fe80::zzzz:zzzz:zzzz:zzzz%2
                                          192.168.xxx.yyy
   DHCP サーバー . . . . . . . . . . . .: 192.168.xxx.yyy
   DHCPv6 IAID . . . . . . . . . . . . .: 4720xxxx
   DHCPv6 クライアント DUID. . . . . . .: 00-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx
   DNS サーバー. . . . . . . . . . . . .: 2001:xxxx::xxxx:xxxx
                                          2001:xxxx::xxxx:xxxx
                                          192.168.xxx.xxx
   NetBIOS over TCP/IP . . . . . . . . .: 有効

ipconfig /allで見た。
240d:xxxx:xxxx:xxxx::2000 はDHCP6sで割り当てられたIPv6アドレス。240d:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx と 240d:xxxx:xxxx:xxxx:yyyy:yyyy:yyyy:yyyy は自動構成で作成されたIPv6アドレス。IPv6はアドレス複数でも気にしない。
と、いうことで上手くいってるっぽい。

以上、たぶん10年くらい前に書くべき記事を今頃。しかも解らなくて悩みまくり。なさけない。