Nordic nRF5を使ってIPv6 Globalする

NordicさんからnRF52 Dev Kitで動くIoT SDK(自分の中で通称6LoWPAN SDKと呼んでいる)が出てきたので早速使ってみることに。SDKとかはこの辺からダウンロードしてきて書き込み。

ダウンロードして展開すると、documentationに使い方が詳しく書いてあるから見れば使える。Getting Started(この辺はRaspberry PIをGWにした方法)、IoT SoftDevice(利用するSoftDevice)あたりを読めばOK。examples以下にサンプルが山ほどあるから、Keil5(を自分は使った)で書き込んで完了という簡単な流れ。

ただ、RPiを使わなくてもPC(Bluetoothが付いているPC)でVMを使えば大丈夫。方法はこの辺で。一応、Win/MacともにBTが付いているPC上でVMを作って、IPv6 Gatewayにして疎通できた。

あと、これはICMPv6のサンプルコードに書いてある部分の画面キャプチャ。ボタンを押すとRAをしたり、これ便利ね。SDKダウンロードしてきて、ソースを見れば書いてあるけど。

IPv6リンクローカルなら疎通は問題なし。すぐ出来ると思われ。ただ、やっぱあれよね、Global IPv6から疎通したみたいぜ!!と思うのは自然だと思われで、やってみたらこれも問題なし。方法は次の流れで。

前提) IPv6 /64プレフィックスが使える環境
1) ルータのIPv6遮断(フィルタを切る)
2) RPiをルータに接続して、IPv6/Bluetooth Gatewayとして機能させる

前提) IPv6 /64プレフィックスが使える環境
まず前提のIPv6 /64プレフィックスが使える環境は、幸いな事に自分はAU光の回線&プロバイダを使っているおかげで、特に追加費用とか何もいらずにIPv6 /64 Globalが使えている。AU光な人はすぐ実験&IPv6できるですね。
よくIPv6の促進がどーとか聞くけど、Flet’s系のGlobal追加は知らんけど(追加費用が必要と思われ。そのままでも使えるけどGlobal抜けられないw。この辺は脈々と古くから続いているシガラミ)、AU光だとIPv6が降ってきて知らないうちに使えている人は多いような。しらないうちにIPv6が使えているってやつっすね。
ということで、この普通に宅内に引いてきているAU光を使う。

1) ルータのIPv6遮断(フィルタを切る)
これは、一応だけど超注意が必要。心配ならフィルタを切るなりした方が良い。IPv6 Globalで直接、宅内のIPv6 NWまで侵入される可能性もあるから(IPv4側は大丈夫)。ただ、設定はAterm(プロバイダから貰ったやつ)のでこの辺。自分は保護しているから、この部分は心配せずに全公開でwww

2) RPiをルータに接続して、IPv6/Bluetooth Gatewayとして機能させる
これはNordic SDKの資料のGetting Startedあたりにも書いてあるけど、radvd(IPv6のRAをするデーモン)を使ってやる。radvdとかもうヲレ的に10年前からずっと、RAをLinux上でするならradvdだよね感がする、枯れて普通に動くものですね。

RPi上でのコマンドの流れはこんな感じで、RPiを上位のAU光からの/64のGWにして、Bluetooth側に流している。本当はブリッジして…とかの方が良いのかもだけど、btXXの増減を考えるとbrを作るか、NDP Proxyでとりあえず代理応答しておくか…は考え所かなと思われ。とりあえず手軽にNDP Proxyした訳だけど、どっちもどっちだと思われ。
ちなみに、以下、プレフィックスを特に隠さず全部書いちゃっているけど、このアドレス&プレフィックスにアクセスしてもすでにアクセス不能にしているので気にしてないっす。ONUを再起動すれば変わっちゃったりするし。

# 6lowpanを有効にする
modprobe bluetooth_6lowpan
echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable

# nRF52に接続する
echo "connect 00:B9:89:15:EF:B1 1" > /sys/kernel/debug/bluetooth/6lowpan_control

# IPv6 forwarding(GW)を有効
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

# とりあえずlink localのIPv6 pingを投げて確認
ping6 fe80::2b9:89ff:fe15:efb1 -I bt0

# bt0でRAを受けれるようにする(brさせなきゃ、別にいらない気もするけど)
echo 2 > /proc/sys/net/ipv6/conf/bt0/accept_ra 

# ICMPv6 NDP Proxyを有効(これはRPiのeth0に入ってくるRA応答用)
sysctl -w net.ipv6.conf.all.proxy_ndp=1

# 生成されるアドレス用の上位ルータ向けNDP Proxy
ip -6 neigh add proxy 240f:1:6c14:1:2b9:89ff:fe15:efb1 dev eth0

# とりあえず適当にbtにアドレスを振っておく
ifconfig bt0 add 240f:1:6c14:1::4/68

こっちはradvdの設定

cat /etc/radvd.conf 
interface bt0
{
    AdvSendAdvert on;
    # このIPv6 prefixはAU光から配布されたもの
    prefix 240f:1:6c14:1::/64
    {
        AdvOnLink off;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
};

ifconfigの状態はこんなん

root@raspberrypi:~# ifconfig
bt0       Link encap:UNSPEC  HWaddr 00-19-86-FF-FE-00-00-78-00-00-00-00-00-00-00-00  
          inet6 addr: 240f:1:6c14:1:219:86ff:fe00:78/64 Scope:Global
          inet6 addr: 240f:1:6c14:1::4/68 Scope:Global
          inet6 addr: fe80::219:86ff:fe00:78/64 Scope:Link
          UP POINTOPOINT RUNNING MULTICAST  MTU:1280  Metric:1
          RX packets:65 errors:0 dropped:0 overruns:0 frame:0
          TX packets:98 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6339 (6.1 KiB)  TX bytes:8122 (7.9 KiB)

eth0      Link encap:Ethernet  HWaddr b8:27:eb:d8:d5:d6  
          inet addr:192.168.0.3  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: 240f:1:6c14:1:d709:d6c2:f28f:a2d9/64 Scope:Global
          inet6 addr: fe80::7dec:ae50:4f54:7d90/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1147 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1164 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:123007 (120.1 KiB)  TX bytes:212157 (207.1 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:155 errors:0 dropped:0 overruns:0 frame:0
          TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:12940 (12.6 KiB)  TX bytes:12940 (12.6 KiB)

bt0はnRF52と接続しているBluetoothドングルのインタフェイス。プレフィックスが若干適当感がするけど、とりあえずOK。ここまで出来たら、radvdを起動すればBluetooth側にIPv6 Global側からping6で疎通できる。IPv6が大量に配布してくれるConoHaというクラウド(特に何の追加費用もいらずに16個もデフォでもらえる。IPv6使った簡単な疎通テストとか、IPv6使った何かをする時はめっちゃ便利と思われ)があって、そこからping6を投げて、RPi上のbt0でtcpdumpをとってみるとこんな感じ。

[Global IPv6 Server] [宅内ルータ] [RPi:BTドングル] [nRF52]

といった感じで、RPiのbt0の所でちゃんとnRF52側(240f:1:6c14:1:2b9:89ff:fe15:efb1)と行って戻ってきているのが分かるですね。NDP Proxyした方が接続したbtXに合わせて上位のrouterをGW(RPi)で選択できるし、開け閉め出来そうだから良いかなーとは思ったけど、ちゃんと据え置きGWにするならbrでも良い気もする。イメージしたのは、キャリアにIPv6を使うよう通達が出ているあれで、スマホでIPv6を/64で終端した時にスマホに接続したBTとかをGW(スマホ)を経由して流す感じの。まぁ、AndroidとかLinuxだしカーネルツリーにすでに6lowpanモジュールは入っていて、その辺は時間の問題だと思われ。
とりあえず、これは実験ってことでね。

「Nordic nRF5を使ってIPv6 Globalする」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください