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年くらい前に書くべき記事を今頃。しかも解らなくて悩みまくり。なさけない。

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

前の記事の続き

接続状態の確認

% ifconfig -a
em0: flags=8843<up ,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=8209b<rxcsum ,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
    ether 00:1b:21:xx:xx:00
    inet6 fe80::xxxx:xxxx:xxxx:aaaa%em0 prefixlen 64 scopeid 0x1
    nd6 options=21<performnud ,AUTO_LINKLOCAL>
    media: Ethernet autoselect (1000baseT <full -duplex>)
    status: active
em1: flags=8843<up ,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1454
    options=8209b<rxcsum ,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
    ether 00:1b:21:??:??:01
    inet xxx.xxx.xxx.xxx netmask 0xfffffff8 broadcast xxx.xxx.xxx.xxx
    inet6 fe80::xxxx:xxxx:xxxx:bbbb%em1 prefixlen 64 scopeid 0x2
    inet6 240d:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:bbbb prefixlen 56
    nd6 options=23<performnud ,ACCEPT_RTADV,AUTO_LINKLOCAL>
    media: Ethernet autoselect (1000baseT <full -duplex>)
    status: active
lo0: flags=8049<up ,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=600003<rxcsum ,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
    inet 127.0.0.1 netmask 0xff000000
    nd6 options=21<performnud ,AUTO_LINKLOCAL>
ng0: flags=88d1<up ,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1454
    inet xxx.xxx.xxx.xxx --> yyy.yyy.yyy.yyy netmask 0xffffffff
    inet6 fe80::xxxx:xxxx:xxxx:bbbb%ng0 prefixlen 64 scopeid 0x5
    nd6 options=21<performnud ,AUTO_LINKLOCAL>
ng1: flags=88d1<up ,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1454
    inet6 fe80::xxxx:xxxx:xxxx:bbbb%ng1 prefixlen 64 scopeid 0x6
    nd6 options=21<performnud ,AUTO_LINKLOCAL>

ifconfig -aで見るとこんな感じ。
IPv6の見え方がちょっと変なんだよなぁ。LAN側のインターフェース(em1)にIPv6のアドレスが生えてそれがゲートウェイのIPv6アドレスみたいに見えるんだよね。でPPPoEのng1の方には対向ルーターのIPv6アドレスが表示されないから意味がわからんし接続できてるいのか出来ていないのかも解らない。LAN(em1)の方に240dで始まるipv6アドレスが生えてるからようやく接続できているのが解る。っていうか何でここに勝手に生えるの?RA?

サーバ用のISPでは割り当てられたIPv6アドレスはプレフィックス長64ビットだったけどSo-netは56ビットなのね。

と、いうことで、確認するときに大切なのはLAN用のNICの側にinet6 2***で始まるIPアドレスが生えてて最後にprefixlen 56とかprefixlen 64とかプレフィックス長が表示されていること。ここでプレフィクス長が正しく通知されていないということだとdhcp6cのpd周りの設定がおかしくてプレフィックスが移譲されてないと思われる。

So-netは上のようにプレフィックス長が56ビットになっているが、LANでは56ビットではなく64ビットにした方が何かと都合が良い(と思うよねたぶん)。そこで、dhcp6c.confで sla-len 0; に仮設定していたのを sla-len 8; でプレフィックス長に8ビット足して64ビットにする。
次回からのdhcp6cを実行でifconfigで見るとプレフィックス長の表示がprefixlen 64になる筈。(変わらないとおかしい)。
と、いうことで変更できるんだけど、ISPから割り当てられるプレフィックス長が変わることがあるかもなので注意。

mpd5のウェブ画面で確認

mpd5ではログ以外にウェブで接続状態の詳細を見ることができる。前の記事のmpd.confの設定ファイルのstartupにあるコメント付きの行から行頭の#を取ってmpd5を再起動すればウェブブラウザで接続状態を確認できる。上の例だとhttp://IPアドレス:8888/を開き、IDはadmin、パスワードはpasswordで表示できる。
ウェブでの表示はいろいろ試す時だけ有効にして運用フェーズに入ったら無効に戻す方が安全。

接続状態1
この例ではIPv4とIPv6の同時接続。左端のバンドル列がB1の行がIPv4、B2の行がIPv6。うちの環境では何故かIPv6アドレスはIP列に表示されない。青文字のリンクを開くと詳細。

接続状態2
各リンクそれぞれサマリでは表示されない詳細を表示できる。正直あまり役に立たないけど。

arpみたいなの(arpじゃないけど)を見たいならIPv6 neighbor discovery protocolで。

# ndp -a
Neighbor                       Linklayer Address  Netif Expire    S Flags
fe80::xxxx:xxxx:xxxx:xxxx%ng0  (incomplete)         ng0 permanent R 
fe80::yyyy:yyyy:yyyy:yyyy%ng1  (incomplete)         ng1 permanent R 
240d:xxxx:xxxx:xxxx::bbbb      uu:uu:uu:uu:uu:uu    em1 23h59m59s S 
240d:xxxx:xxxx:xxxx::aaaa      vv:vv:vv:vv:vv:vv    em1 permanent R 
fe80::yyyy:yyyy:yyyy:yyyy%em1  vv:vv:vv:vv:vv:vv    em1 permanent R 
fe80::xxxx:xxxx:xxxx:xxxx%em0  ww:ww:ww:ww:ww:ww    em0 permanent R

この例ではExpireに時間が入っている240d:xxxx:xxxx:xxxx::bbbbはLAN内の他のIPv6ホスト。
もちろん、ネットワーク参加済みのIPv6ホストしか表示されない筈なのでネットワークが出来ていないこの時点で他のホストがもう表示されているということは本来はない筈。

PINGを打ってみる。IPv6版のpingはping6。

# ping6 -c2 google.com
PING6(56=40+8+8 bytes) 240d:xxxx:xxxx:xxxx::aaaa --> 2404:6800:400a:806::200e
16 bytes from 2404:6800:400a:807::200e, icmp_seq=0 hlim=54 time=6.859 ms
16 bytes from 2404:6800:400a:807::200e, icmp_seq=1 hlim=54 time=6.770 ms

--- google.com ping6 statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 6.770/6.815/6.859/0.044 ms

もし、名前解決できないなら/etc/resolv.confにネームサーバを追加する。
というか、まだネームサーバを取得する部分は設定してないのでできない筈。
So-netは何故かIPv6用のネームサーバを公開してないので取り敢えず公開リゾルバを追加。So-netのネームサーバは後で取る。

1
2
3
4
nameserver 2001:4860:4860::8888  #google-public-dns-a.google.com
nameserver 2001:4860:4860::8844  #google-public-dns-b.google.com
nameserver 2620:0:ccc::2         #resolver1.ipv6-sandbox.opendns.com
nameserver 2620:0:ccd::2         #resolver2.ipv6-sandbox.opendns.com

/etc/resolv.confはファイルを上書き保存したらすぐに適用される。

続く

Up