hirotakaster のすべての投稿

ufwを可視化

最近のUbuntu Linuxはufw(User Fire Wall)でiptablesをサクッと管理できる。iptableはある一定の攻撃とかバーストしてきた物は遮断してログに出力する事ができる。ufwだと/var/log/ufw.logに出力されて…こんな感じで見れる。

Jan 15 06:54:07 xxxxxxxx kernel: [403471.687391] [UFW BLOCK] IN=eth0 OUT= MAC=02:AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:00 SRC=94.179.145.26 DST=AAA.AAA.AAA.AAA LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=16411 PROTO=TCP SPT=9807 DPT=23231 WINDOW=8192 RES=0x00 SYN URGP=0 
Jan 15 06:54:18 xxxxxxxx kernel: [403483.004926] [UFW BLOCK] IN=eth0 OUT= MAC=02:AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:00 SRC=203.189.152.165 DST=AAA.AAA.AAA.AAA LEN=44 TOS=0x00 PREC=0x00 TTL=240 ID=15727 PROTO=TCP SPT=62986 DPT=23 WINDOW=14600 RES=0x00 SYN URGP=0 
Jan 15 06:54:44 xxxxxxxx kernel: [403509.027416] [UFW BLOCK] IN=eth0 OUT= MAC=02:AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:00 SRC=203.189.156.28 DST=AAA.AAA.AAA.AAA LEN=44 TOS=0x00 PREC=0x00 TTL=240 ID=4355 PROTO=TCP SPT=2541 DPT=23 WINDOW=14600 RES=0x00 SYN URGP=0 

ufwの詳細ログについてはこちら

一部割愛しているけど、まぁこんな感じ。折角、アタックしてきてくれているから、このlogginデータを使わないわけにはいけないよね…何か楽しいし(w)と思うのは自然な感じ。現実的にはアタックログを残しておく事は有用になる。例えば、サーバ負荷との関連、アタックの頻度・トレンド、攻撃元IPアドレスのブラックリスト化などなど。
というわけで、構成はこんな感じでkibanaで可視化することに。

[ufw.log]->[fluentd]->[elasticsearch]->[kibana]

まずは結果から…データは2017/01/14-17のとある1個のサーバに対して。こんな感じ。

1) attack logging count
15,290(3.53 attack/min)。

2) TCP/UDP attack
TCP: 12,728, UDP:2,562

まぁ…TCPですよねー感はする。

2) port/tcp, udp attack top 20

イマドキtelnetかよ(w)的なツッコミをしたくなる。

3) attack country unique ip top 20

China                                   1076
Viet Nam                              367
United States                       334
Brazil                                     294
Korea, Republic of               274
Turkey                                  251
India                                      214
Taiwan, Province of China  210
Mexico                                  207
Russian Federation             196
Iran, Islamic Republic of     134
Argentina                             101
Romania                                 86
Italy                                        80
France                                    78
Ukraine                                   75
Thailand                                 74
Australia                                64
Poland                                    60
Colombia                                60

1位は断トツの中国。まぁこれはそうですね感はするけど、2位がUSを抜いてベトナムというのが何気にビリビリするものがある。あとはいっぱいIPアドレスのリストが取れて何か嬉しい(w)。

他にも攻撃してきたipをtracerouteして逆向きのIPアドレスの情報もロギングして取得している。例えばこんな感じに(超割愛しているw)

 
攻撃元
IP       101.204.212.118
Lon/Lat  30.6667, 104.067
国/街     China/Chengdu
+-----+-----------------+---------+---------+---------------+-------------------+
| ttl    | ip_addr           | lon       | lat        |country_name| city_name         |
+-----+-----------------+---------+---------+---------------+-------------------+
|   1  | 133.208.191.134 | 139.692 | 35.6895 | Japan         | Tokyo             |
|   2  | 62.115.63.101   | -87.65  | 41.85   | United States | Chicago           |
|   3  | 213.248.82.206  | 8.68417 | 50.1155 | Germany       | Frankfurt am Main |
|   4  | 219.158.25.29   | 116.397 | 39.9075 | China         | Beijing           |
|   5  | 219.158.103.97  | 116.397 | 39.9075 | China         | Beijing           |
|   6  | 219.158.110.222 | 116.397 | 39.9075 | China         | Beijing           |
+-----+-----------------+---------+---------+---------------+-------------------+

この場合は、中国->ドイツ->アメリカ->日本といった経路っすね。近いのに地球の反対側を通ってきているね。遠方よりはるばるお疲れさまです。このデータはDBに突っ込んでおいて使えるようにしていたりもする。

■ 設定
1) UFW
このufwはめっちゃ簡単にiptablesを管理できるからサラッと使っていたりする。例えば…

# ufw status 
状態: アクティブ
To                         Action      From
--                         ------      ----
443                        ALLOW       Anywhere
80                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

こんな感じで一覧でサクッと分かる。iptablesだと…標準だとこんな感じね。

# iptables -L 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ufw-before-logging-input  all  --  anywhere             anywhere            
ufw-before-input  all  --  anywhere             anywhere            
ufw-after-input  all  --  anywhere             anywhere            
ufw-after-logging-input  all  --  anywhere             anywhere            
ufw-reject-input  all  --  anywhere             anywhere            
ufw-track-input  all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ufw-before-logging-forward  all  --  anywhere             anywhere            
ufw-before-forward  all  --  anywhere             anywhere            
ufw-after-forward  all  --  anywhere             anywhere            
ufw-after-logging-forward  all  --  anywhere             anywhere            
ufw-reject-forward  all  --  anywhere             anywhere            
ufw-track-forward  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ufw-before-logging-output  all  --  anywhere             anywhere            
ufw-before-output  all  --  anywhere             anywhere            
ufw-after-output  all  --  anywhere             anywhere            
ufw-after-logging-output  all  --  anywhere             anywhere            
ufw-reject-output  all  --  anywhere             anywhere            
ufw-track-output  all  --  anywhere             anywhere            

Chain ufw-after-forward (1 references)
target     prot opt source               destination         

Chain ufw-after-input (1 references)
target     prot opt source               destination         
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-ns
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-dgm
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootps
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootpc
ufw-skip-to-policy-input  all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST

Chain ufw-after-logging-forward (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-input (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-after-output (1 references)
target     prot opt source               destination         

Chain ufw-before-forward (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ufw-user-forward  all  --  anywhere             anywhere            

Chain ufw-before-input (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-logging-deny  all  --  anywhere             anywhere             ctstate INVALID
DROP       all  --  anywhere             anywhere             ctstate INVALID
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc
ufw-not-local  all  --  anywhere             anywhere            
ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns
ACCEPT     udp  --  anywhere             239.255.255.250      udp dpt:1900
ufw-user-input  all  --  anywhere             anywhere            

Chain ufw-before-logging-forward (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-input (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-before-output (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-user-output  all  --  anywhere             anywhere            

Chain ufw-logging-allow (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW ALLOW] "

Chain ufw-logging-deny (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ctstate INVALID limit: avg 3/min burst 10
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-not-local (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type MULTICAST
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST
ufw-logging-deny  all  --  anywhere             anywhere             limit: avg 3/min burst 10
DROP       all  --  anywhere             anywhere            

Chain ufw-reject-forward (1 references)
target     prot opt source               destination         

Chain ufw-reject-input (1 references)
target     prot opt source               destination         

Chain ufw-reject-output (1 references)
target     prot opt source               destination         

Chain ufw-skip-to-policy-forward (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-input (7 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            

Chain ufw-skip-to-policy-output (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-track-forward (1 references)
target     prot opt source               destination         

Chain ufw-track-input (1 references)
target     prot opt source               destination         

Chain ufw-track-output (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             ctstate NEW
ACCEPT     udp  --  anywhere             anywhere             ctstate NEW

Chain ufw-user-forward (1 references)
target     prot opt source               destination         

Chain ufw-user-input (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     udp  --  anywhere             anywhere             udp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:http

Chain ufw-user-limit (2 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "[UFW LIMIT BLOCK] "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain ufw-user-limit-accept (2 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain ufw-user-logging-forward (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-input (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-output (0 references)
target     prot opt source               destination         

Chain ufw-user-output (1 references)
target     prot opt source               destination      

まぁ..iptablesはパッと見で意味不明っすね。ってことで、ufwは適宜設定しておく。

2) fluentdの設定
ノリでこんな感じ。ufwからは他にも色々と取れたりするから適宜取得しておく。ぶっちゃけ、これ書いて設定とか終わりな感はする。ufwで必要なログを取って、fluentdでelasticsearchに流す設定をするだけ。

<source>
 type tail
 time_key time
 format /(?<time>[^\]]*).*SRC=(?<src>[^ ]*).*PROTO=(?<proto>[^ ]*).*DPT=(?<dpt>[^ ]*).*/ 
 time_format %b %d %H:%M:%S 
 path /var/log/ufw.log
 pos_file /var/log/td-agent/ufw.pos
 tag ufw.combined
</source>
<match ufw.*>
 type elasticsearch
 host hogehoge.host
 port 9200

 index_name ufw_log
 type_name ufw_log
 logstash_format true
 logstash_prefix ufw_access
 logstash_dateformat %Y%m
</match>

3) elasticsearch/kibanaの設定
これはググればOK。突っ込んで見るだけ。

■ おわりに…
こういうデータを持っておいて可視化しておくと、攻撃元IPのブラックリスト化、攻撃の傾向/トレンドの把握とかで、まぁちょろっとは使えるでしょう。まぁ、あとはpub/sub系のに流して、ブラウザで攻撃があったら情報がリアルタイムで見れるようにしておくとかね。これ系のは何となくそれなりっぽい規模の会社に1個くらい、可視化しれ見れるよーにしておくと、何となく後々幸せになれるような気がちょっぴりする。
あとtracerouteをかけて、経路のデータ/IPアドレスを取得してDBにまるごと突っ込んで簡単に使えるようにもしている。何となくDBにも入れておけば後々便利だし(esだけでも良いけどね)。

ESP32 with Arduino how to work

I got a ESP32-S from US friend kaduhi. Thank you!! I will enjoy this exciting device and experiment/create codes:)

ESP32-S spec is here.
CPU : Xtensa® 32-bit LX6 Dua-core processor
ROM/SRAM: 448 KByte ROM, 520 KByte SRAM
WiFi : 802.11 b/g/n/e/i
Bluetooth : Bluetooth v4.2 BR/EDR and BLE
And others amazing spec is hardware accelerated encryption: AES / SHA2 / Elliptical Curve Cryptography / RSA-4096. This hardware encryption is very useful for IoT and TLS networking. I thinking ESP32 is powerful PC including networking spec.

手持ちの歴代ESPとのサイズ比較な感じだと。右下がESP32-S、左上がESP-WROOM-02、右上はESP8266、左下がESP12。

基板に付けるとこんな感じに。

開封して基板にとりあえず付けるとこんな感じ。前のESP8266に比べて圧倒的にピン数が多いっすね。「これだけのだし、何でも面白いものを作れるだろ?」という暗黙のプレッシャーを感じるです…

ここで、この子にピンヘッダをおもむろに付けようと思ったけど、2列だからブレッドボードに指したりしようとすると何かと不都合が…
そういう時に活躍するのが、スルホール用テストワイヤとか。ただ、自分は後でピンの抜き差しを自由に出来るように、2列10ピンのピンソケットの1個を抜いて使うことに。

完成

Arduinoで使ってみる

すでにESP32 Arduinoが公開されている。ESP8266と一緒な感じでArduino IDEから使えると非常に便利で、開発者も一気に広まるというのもあるからね。ということで、このgitを使う。

記載の通り進める。自分の環境はMacOS 10.11.6でPythonは2.7というのもあって、pyserialを入れる必要があった。

cd /Applications/Arduino.app/Contents/Java
cd hardware
mkdir espressif
cd espressif
git clone https://github.com/espressif/arduino-esp32.git esp32
cd esp32/tools
python get.py
# pyserialを入れる。pyenvとかpipを使っている場合は、それに合わせて入れる
wget https://pypi.python.org/packages/1f/3b/ee6f354bcb1e28a7cd735be98f39ecf80554948284b41e9f7965951befa6/pyserial-3.2.1.tar.gz
tar -zxvf pyserial-3.2.1.tar.gz
cd pyserial-3.2.1
sudo python setup.py install 

次にArduinoの起動〜利用。Arduinoを起動してESP32を選択。

次にESPとシリアルの結線。これはそのまんま。自分はFT232RL搭載小型USB-シリアルアダプタ 3.3Vをいつも使っているんだけど、3.3V/GND, TXRXをESP32側とつなげるとOK。

起動時のログはこんな感じでシリアルから見れる(既にArduino化されているのだけど)。

そして問題の書き込み。これはムチャクチャ簡単。

1. RESET + IO0を同時押し
2. RESETを離す
3. Arduino IDE上からFlashをポチる

以上な感じ。この辺はムチャクチャ簡単に出来る。2の時点でシリアルを見るとこんな感じの表記が出ている。

そして書き込みをすると、Arduino IDEではこんな表記が出る。

そしてLEDピカー

上向きにピンソケットを出せば良かったかな…と2秒くらい後悔したw FT232RLだけでサクサクっと動かして使えるのはめっちゃ良い。

あと不明な所はESP32 forumを見れば解決すると思われ。最後に、FCCは通っているけど現時点ではTELECは通って無いっすね。WiFiのlibとかは上記のgitに普通に入っている。ここではWiFiを出しているとは何も書いていないんでお察しでw

追記で…WiFiに接続しようとすると、このままだと接続できない。というのも、このESP32はピークで500mA消費するようで、このFTDIの3.3Vでは到底供給できない。WiFiのプログラムを有効にして接続するとブチっと切れる。
そこで、こんな感じで3.3V 500mAのTA48m033Fを使って供給してあげたら良い感じに、WiFiも使えてフルで何でも出来るようになる。

ESP32-S and Arduino

kaduhiさんからESP32-Sを米国から頂いて…中国〜米国〜そして日本へ遠路はるばるようこそ。ありがとうございます!!感謝です、実験&コードを作ったり遊んでみます。

ESP32のスペックはざっくりだと。詳細はググると出てくるけど、本家のはこちら
CPU : Xtensa® 32-bit LX6 Dua-core processor
ROM/SRAM: 448 KByte ROM, 520 KByte SRAM
WiFi : 802.11 b/g/n/e/i
Bluetooth : Bluetooth v4.2 BR/EDR and BLE
他には、RTC、そして自分的に凄いと思うのが、ハードウェア暗号化アクセラレーション。TLSが(実装すれば)サクッとつかえるー!!AES-HASH(SHA-2) library-RSA-ECC-Random Number Generator。凄い、これ凄い。言ってしまえばNWにつながる小さいPCっすね。

手持ちの歴代ESPとのサイズ比較な感じだと。右下がESP32-S、左上がESP-WROOM-02、右上はESP8266、左下がESP12。

基板に付けるとこんな感じに。

開封して基板にとりあえず付けるとこんな感じ。前のESP8266に比べて圧倒的にピン数が多いっすね。「これだけのだし、何でも面白いものを作れるだろ?」という暗黙のプレッシャーを感じるです…

ここで、この子にピンヘッダをおもむろに付けようと思ったけど、2列だからブレッドボードに指したりしようとすると何かと不都合が…
そういう時に活躍するのが、スルホール用テストワイヤとか。ただ、自分は後でピンの抜き差しを自由に出来るように、2列10ピンのピンソケットの1個を抜いて使うことに。

完成

Arduinoで使ってみる

すでにESP32 Arduinoが公開されている。ESP8266と一緒な感じでArduino IDEから使えると非常に便利で、開発者も一気に広まるというのもあるからね。ということで、このgitを使う。

記載の通り進める。自分の環境はMacOS 10.11.6でPythonは2.7というのもあって、pyserialを入れる必要があった。

cd /Applications/Arduino.app/Contents/Java
cd hardware
mkdir espressif
cd espressif
git clone https://github.com/espressif/arduino-esp32.git esp32
cd esp32/tools
python get.py
# pyserialを入れる。pyenvとかpipを使っている場合は、それに合わせて入れる
wget https://pypi.python.org/packages/1f/3b/ee6f354bcb1e28a7cd735be98f39ecf80554948284b41e9f7965951befa6/pyserial-3.2.1.tar.gz
tar -zxvf pyserial-3.2.1.tar.gz
cd pyserial-3.2.1
sudo python setup.py install 

次にArduinoの起動〜利用。Arduinoを起動してESP32を選択。

次にESPとシリアルの結線。これはそのまんま。自分はFT232RL搭載小型USB-シリアルアダプタ 3.3Vをいつも使っているんだけど、3.3V/GND, TXRXをESP32側とつなげるとOK。

起動時のログはこんな感じでシリアルから見れる(既にArduino化されているのだけど)。

そして問題の書き込み。これはムチャクチャ簡単。

1. RESET + IO0を同時押し
2. RESETを離す
3. Arduino IDE上からFlashをポチる

以上な感じ。この辺はムチャクチャ簡単に出来る。2の時点でシリアルを見るとこんな感じの表記が出ている。

そして書き込みをすると、Arduino IDEではこんな表記が出る。

そしてLEDピカー

上向きにピンソケットを出せば良かったかな…と2秒くらい後悔したw FT232RLだけでサクサクっと動かして使えるのはめっちゃ良い。

あと不明な所はESP32 forumを見れば解決すると思われ。最後に、FCCは通っているけど現時点ではTELECは通って無いっすね。WiFiのlibとかは上記のgitに普通に入っている。ここではWiFiを出しているとは何も書いていないんでお察しでw

mbedTLSの組込で分かったこと

I implement mbedTLS to the Particle environment community library, TlsTcpClient and MQTT-TLS. This 2 library could connect to AWS/Azure…etc IoT cloud platform with certificate/private key.

Now cipher suite is here.
TLS_RSA_WITH_AES_128_GCM_SHA1
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA512
TLS_RSA_WITH_AES_256_GCM_SHA1
TLS_RSA_WITH_AES_256_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA512

Here is TLS 1.2 sequence.

I test this library with Particle Photon on the several IoT Platform(AWS IoT/Azure/mosquitto/eclipse iot…etc), I would note the “How to implements mbedTLS to embedded IoT platform”.
Here is the Particle Cloud API and MQTT(TLS)/TlsTcpClient network communications image.


Particle Cloud API is official API from Particle very useful for developer, it is easy to use on the application with Cloud IoT Platform and low price(free Device Cloud access for first 100 devices). But if Particle cloud system will down, device could not pub/sub data with other Cloud IoT Platforms. MQTT(TLS)/TlsTcpClient area community library could connect to the AWS/Azure…etc directly, developer could use this for second choice.
And Particle provid firmware api TCPClient for the TCP network communication. If developer want secure TCP connection, TlsTcpClient could be used for it.

Next, my point of the implementation of the Photon and mbedTLS.

1) I want to use OpenSSL on the Particle but can’t

OpenSSL is powerful SSL/TLS library used on the several application, server, pc…etc.(SSLSocket is very useful for programmer). Maybe talking about the SSL, many developer think OpenSSL. But OpenSSL library size is very fat. I build openssl-1.1.0c on my Ubuntu x64 total library size is 9,227,602byte!!
Then I found the following open source TLS library for implementation.

wolfTLS(CyaSSL)
mbedTLS(polrSSL)
axTLS
matrixSSL

I choice the mbedTLS because of mbedTLS could use the Apache 2.0 license or the GPL 2.0 license, and I think the future possibilities with the this library.
mbedTLS could work on the several CPU(x86/64…etc) platform not only the ARM core. And Particle Photon have a STM32F205RGY6 120Mhz ARM Cortex M3, so maybe think “you could build/compile the mbedTLS on the Photon easily, hahaha…”. That’s fault. I did the following work.

1. There were very lot of compile error happen on the mbedTLS with Particle IDE, I modify source code and debug.
2. There are some libc function needed by mbedTLS did not found on the Particle environment, I added that functions to the mbedTLS source code.

2) embedded cpu power.

Particle Photon have a STM32F205RGY6 120Mhz ARM Cortex M3 cpu. This spec is powerful for embedded IoT platform, but I’m afraid TLS/RSA/some cipher alogorithm could not work on the this CPU spec. As a result, there is nothing to worry about that.

Photon with webserver TLS handshake total network time(see the this blog entry WireShark packet capture image) is under 20ms!! on the case of the TLS_RSA_AES_128_GCM_SHA256. And TLS data communication(AES128 cipher) encrypt/decrypt is high speed too. Photon cpu(Cortex-M3) is enough for TLS working!!

Next version Particle device ARGON(BT Mesh, WiFi) including ESP32 chip. ESP32 have a hardware acceleration AES/SHA-2/RSA/ECC/RNG maybe ARGON enable very fast TLS communication.

3) firmware size.

I think this firmware size limitation is really important. Here is MQTT-TLS a1-sample build result.

Application firmware size limit is about the 128Kbyte with library, so it’s hard to use a lot of library even if developer want to use. If library use 96Kbyte size in the application, developer could use only 32kbyte for own application. Because of that, library have to shape the size as far as possible for developer application.

mbedTLS library have a several Cipher Suites, option algorithm, which one be used is important for the size and security. Of course all cipher suite could include to the library, but library would be size over the flash size. On the other hand, if it use the weak cipher(DES/MD5) only for the flash size, that’s security would be vulnerable. Balance of the security and flash size would be very important.

Thne here is latest library size with sample application.

MQTT-TLS 0.2.13, Photon firmware 0.8.0-rc2 : 71200byte
TlsTcpClient 0.2.11,Photon firmware 0.8.0-rc2 : 72768byte

Now cipher is TLS_RSA_WITH_AES_[128|256]_GCM_SHA[1|256|512], if remove SHA1/512 size will be about 50Kbyte. I choice this cipher suite because of certification compatibility/security strength.

4) etc.

1st version TlsTcpClient/MQTT-TLS programing with mbedTLS is about 2-3 days. mbedTLS is very useful and having possibilities in IoT environments.
I think TLS would be more needed in IoT/embedded platforms. A lot of IoT/embedded platforms use non ciphered TCP communication now because of low power MCU/firmware size limitation, but mbedTLS works well like a this MQTT-TLS/TlcTcpClient library.

TLS client library for Particle Photon

TlsTcpClient for Particle Photn, Now release version 0.1.0.

TLS TCP client library cloud not use on Particle Photon WebIDE, but NOW we can use TLS TCP simple client library based by mbedTLS. Here is sample source code. Developer can connect to every TLS web/server using that Root CA pem file.

#include "application.h"

#include "TlsTcpClient/TlsTcpClient.h"

// Photon connect Let's Encrypt Website in this example.
#define LET_ENCRYPT_CA_PEM                                              \
"-----BEGIN CERTIFICATE----- \r\n"                                      \
"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\r\n"  \
"-----END CERTIFICATE----- \r\n"
const char letencryptCaPem[] = LET_ENCRYPT_CA_PEM;

void setup() {
    Serial.begin(9600);
}

void loop() {
    unsigned char buff[256];

    TlsTcpClient client;

    // setup Root CA pem.
    client.init(letencryptCaPem, sizeof(letencryptCaPem));
    
    // connect HTTPS server.
    client.connect("www.hirotakaster.com", 443);
    
    // send to HTTPS request.
    int len = sprintf((char *)buff, "GET /robots.txt HTTP/1.0\r\nHost: www.hirotakaster.com\r\nContent-Length: 0\r\n\r\n");
    client.write(buff, len );

    // GET HTTPS request.
    memset(buff, 0, sizeof(buff));
    while(1) {
        if (!client.available()) {
            delay(100);
        } else {
            int ret = client.read(buff, sizeof(buff) - 1);
            if (ret > 0) {
                Serial.println((char *)buff);
                break;
            }
        }
    };
    delay(5000);
}

This library already add to Particle WebIDE contribute library, it can use very easy.

This is my web server(this blog) and Photon TLS sequence and cipher spec captured with Wireshark. Cipher suites are AES128/256 based.

ポスト君 – Renew LINE version

iBeacon, WiFi版のポスト君を作って時間が経ったけど、地味にまだやっていたりしている。ESP8266やLINE Messaging APIが使えたり環境面の変化に合わせて改良したりでrenew.



– 基本機能
ポストにポスト君を設置して、LINEメッセでポストへの投函を確認する。
暇な時に話かけると、話相手になってくれる。(ポストと会話をする)

– 使い方
1. ポスト君をポストに設置
2. LINEでポスト君と友達になる
3.1. 「開始」「はじめて」でポストの監視をはじめる。
3.2. 「終了」「おわり」でポストの監視が終了する。
3.3. 「XX秒間隔」「XX分間隔」でチェック間隔の時間を調整できる。(省電力対策)
4. 何か話すと雑談相手になってくれる。

雑談時はこんな感じ。この手のAI的なのと自分は会話が見事に噛み合わない。ポスト君の設定は19歳、女性、B型にしている。この設定自体、自分(39歳 男性)と会話が噛み合うのか?という問題もあるけど。



– 構成
ESP, 距離センサ, 自動応答雑談AI, LINE Messaging API, MQTT Broker

– 動作動画

もちろん旧版の通知方法も使えて、iBeacon(BLE)、またはメール版も手元で動いている。このポスト君、「毎日郵便箱を開けて確認する手間を省く」というのがあるけど、毎日郵便が来る人はそうは居なくて「ポストを開けた時に空っぽだった時の残念感」を解消する部分もあったりする。

どう使われるのか?という利用シーンとしては、以下な感じ。郵便箱や宅配ボックスにポスト君を設置すると、簡単にIoT化する事ができる。
1. いつでもポストへの投函をチェックできる。(LINE、メール、iBeacon通知)
2. 郵便箱を開けて確認する必要が無くなる。
3. 家でゴロゴロしている時でも、郵便が来たら通知をしてくれる。


— 以下技術的な部分
LINEメッセ部分の全体的な構成は以下な感じ。

ポスト君[ESP/IR] サーバ[MQTT Broker/Web AP] [LINE] ユーザ[LINEアプリ]

ユーザからのコマンド(開始、終了、XX間隔)とかはLINE側からのcallbackをWebAPで受けてMQTTに変換、MQTT通知としてポスト君に司令を与える。
逆にポスト君(ESP)はポストへの投函チェックを行って、投函が発生した時にMQTTメッセージ送信、サーバ側で受信したらLINE Messaging APIに変換して通知をユーザに行う。MQTT Brokerはmosquitto、MQTT/Web APの部分はgolangでサクサクっと作っていて、この部分がLINE/MQTTの変換GWとしての役割になる。またコマンド以外のメッセージについては、雑談API側に転送して応答を戻している(Chatbot化)。
LINE Messaging APIはムチャクチャ簡単で、こういった環境とモノを接続して制御、センサーデータを解析したり動きを与える場合の構成、そしてIoTなプロトコルとしてよく言われるMQTTを利用する場合の構成として、このような構成はアリでしょう。
そしてESPの激安パワーのおかげで、素材費用だけで1,000円以下になった。これはとってもメリットがある点の一つでもあると思う。

Hololens使ってみる

触ってみた感想を書くのを忘れて数ヶ月、Hololensを触ってちょっとした召喚アプリを作ってみた感想など。

Hololensといえば…これですね。

どーんw

MSのサイトにあるようなイケメンっぽく装着できず、被ってます感がモリモリだけど。

Hololensを使って適当にUnityで開発をすると、デスク上に召喚しちゃったり色々と遊べる。慣れた人なら使い始めてから、1時間もかからず、すぐアプリを書いて動かせると思われ。

他にも床の上に物を置いたり…

空中に浮かばせたり…

お約束のゲームっすね。

他にもSLAMというか、Hololensを被ってそこらじゅうを歩き回ると、自動で部屋の3Dモデルを生成してくれるという凄まじい機能もあったり。

ホロ部分はこんな感じ

いわゆるARメガネ物とは一線を画す性能というか、メガネというよりはWindows PCっすね。
何がビビるか?というと、バッテリー搭載で動かしても暑くならないし、2時間とか楽勝で動くという省電力。外向きにカメラが大量に付いてセンシングしつつ、空間処理を行いレンズに投影しつつアプリが動いて2時間くらいは楽勝でサクサク動いていたはず。しかも、暑くならない(これ重要)。Windows10 MobileがHololensでは動いていて、これはセンサー類が大量に付いたモバイルPCと思っても良い。

これはメガネ物じゃなく、頭に装着するモバイルPC。ただし、大量センサーつき、ホロレンズな投影で空間上にオブジェクトが見える…という新しい端末っすね。よくOculus/PS VRモノの全ての視野を奪った映像を見せるVRとは違って、MRって言うのか実空間の物とのインタラクションがあるような物っすね。視野角が狭いというのはよく聞く感じだけど、それすらも凌駕する空間上に「ここにある感」が凄い感じ。こればっかりは、実際に装着して感じるしかなくって、文字や机上で考えるより、体験して感じてみると凄さが分かると思われ。
他にも似たようなものに、metaとかもあったり。

micro:bit互換機を使ってみる

まだ触りはじめの段階だけど、スイッチサイエンスさんがmicro:bit互換機のモニターを募集していて、勢いで応募してみたら…当たりました!! ちなみに、自分はクジ運とか一切ないです。宝くじは当たっても300円が最高とかだけど、なぜかこういう時に運を発動するようで…ありがとうございます!! Maker Faire Tokyoでも販売されるようで、期待度高いっす。

まず、micro:bitってなーに?という方はこちらを…
BBCのMicro:bitがイギリスのすべての11歳と12歳の子どもたちに無料配布される
BBCのMicro:bitは子どもたちにぴったりのプログラミング端末
英国でチビッコに無料!!で配られている端末で、これを使ってプログラミングの勉強をしたり遊んだり出来るというステキ端末です。LED、BLE、加速度センサ…etcが付いて無料!!無料っすよ。こういう物を配れるというのは、既に日本とは環境的にヤバイ違う感がするですね。
ちなみに、今年のMaker Faire Bay AreaでMicrosoftさんブースでmicro:bitを使ったワークショップか何かをやっていたり、日本では何で…?といった所は感じていたですね。

まずは開封の儀、こちらはオモテ面

こちらは裏面。一部の方はパット見でご存知的なBLEモジュールが付いていますね。

すぐUSB 2.0 microとPCを繋げて、micro:bitのHPからCreate Codeをポチって適当にビルドしたのをダウンロード、そしてOS上からはmbedと見えているディスクにコピーすれば…動きます。この間、ぶっちゃけ1分かからないっす。初めに動かしたのはこちら。

正確に測っていないから分からないけど、マジで1分はかからないと思われ。そこでファーストインプレッションの感想は…

1. 凄い、凄いっす。半端ないっす。感動です。言葉で表現するのが難しい感動です。

2. 上記の写真の通り、光らせたいLEDの所をクリックでポチるだけで光る!!お手軽で直感的。

3. Arduinoとかと比較するのもだけど、チビッコ向けにLEDを買ってきて...といった事が必要なく、「箱から出す。USBにつなげる。Web上でコンパイル。ファイルをコピーして動く!!」という恐ろしいまでの簡単さ。

4. "百聞は一見にしかず"とは良くいったもので、PC上でプログラムしてアプリが動く、Webが作れる...といった画面やモニターの中で起きる事より、手元で実際に書いたプログラム(ブロック)がLEDで光って見えるという現実感に勝るもの無し。しかも超カンタンでお手軽。素晴らしい。

5. micro:bitのHPのプログラミング環境(Code Kingdoms:JavaScript, Microsoft Block Editor, Touch Develop)のUIが秀逸です。ビビります。

総じて…凄い!!の一言。こんな素晴らしい環境を英国だとチビッコに配って使わせているというのは、教育のベースの部分で歴然たる差が(既に…)出ているんじゃ?と思えるほど。2020年からプログラムを小学校で必修とか言っている場合じゃないんじゃないの?的な感じがちょっぴり。
ちなみに…チビッコに触らせてみたら、実際に適当にLEDを光らせて動かすまで、説明は殆ど不要で直感的に使えた。恐ろしいほどの簡単さだぞmicro:bit。これはヤバイ。

■ PCから使ってみる

PCから使う場合は特に説明がいらない気もするけど、以下な流れで。

1) micro:bitのHPでcreate codeをポチる

2) 好きな環境を選ぶ

3) 適当にコードを書く。これはBlock Editor。

4) コンパイルして出来たファイルを保存。

5) micro:bitをPCにつなげるとmbedという外部diskとして見えるので、そこに保存したファイルをコピー。mbedで作るときと一緒のノリっすね。

■ スマホから使ってみる

ちょっと使ってみた感じで。BLEという事は、スマホのアプリがあってiPhoneと接続してビルドとかも出来るんじゃん?と思ったら…やっぱりありました。
iPhoneはこちら
Androidはこちら

ピアリングして使うにはちょっぴりコツが必要で、以下の流れにて。

1) アプリを立ち上げる。

2) Connectionsをポチる

3) Pair a new micro:bitをポチる

4) ここで記載の通りmicro:bitのA、Bボタンを押しながらリセットを押して離す

5) micro:bitの実機にLEDのパターンが表示されるので、その通りに画面のLED表記も埋めてあげる。これがある意味、認証の役割になっているですね。
こちら実機

こちら画面の表記

そしたらNext

6) micro:bitを探してくれる。んでペアリングの画面が出てくる。

7) micro:bitの実機でAボタンを押せって指示が出ていたと思うから、実機のAボタンを押すと…数字がLEDで表示される。その数字の通りにスマホの画面に数字を入力する。実機だと左矢印が出ていて、明示的にAボタンを押してねといった感じで分かる。細かい所まで案内が行き届いていて気持ちが良い。

8) ペアリング完了!!

以下、さらさらっとアプリでプログラムする。ブロックを組めば直感的にプログラムが出来る。

1) アプリのトップからCreate Codeをポチる。

2) ここではMicrosoft Block Editorを起動して、適当にブロックを組み立てる。ノリでOK!!これは端末をシェイクすると表示が消えて、Aボタンを押すと画面にAと表示するような感じのプログラム。

この時、iPhoneの場合でSafariが起動すると、プライベートモードで起動しないで!!って警告が表示されると思われ。そういう時は、Safariの設定でプライベートモードをOffっておけばOK。

4) 上の左から3番目のボタンをポチってコンパイルする。

5) ファイルのダウンロード。自分は「次の方法で開く…」をポチって出てくる画面から、「micro:bitにコピー」を選択する感じで。

6) いきなりFlash画面(w)。プログラムには自動で名前が付けられるようで(もちろん、自分でも可)、不思議なほどスクリプトという名前に。Flashボタンをポチって、micro:bitにプログラムを転送。

7) micro:bitを探してくれて…

書き込み…完了!!

8) ぴーかー!!

iPhoneでやってみたんだけど…画面が小さくて心が折れる可能性が。スマホでも可能だと思うけど、この辺はPad物を使った方が良いと思われ。

■ mbedもあるよ

最後に…mbedという事は、そっすね。やっぱりやりたくなるこちら。サンプルいっぱいヒャッハー状態です。mbed使いな人はサクサク行けると思われ。さすがにこっちは、いきなりチビッコにレッツトライ!!は難しいとは思うけど、MicroBitクラスでサクサクいける感じ。BLEでプログラムとかメンドイんじゃ…って思った人とか、初めてやってみる人にはオススメ。

■ 追記…

ふと思って追記で。UIや使い勝手が洗練されていてコンパクトにまとまっていて、かなり素晴らしいです。こんな素晴らしい環境を使ってプログラム&開発をしている子供が大きくなったら、どんな新しい物を作るんだろうか?という期待が生まれてくる。そして、エンジニアな自分目線だと、こういう環境を使って大きくなった開発者と肩を並べて勝負していく、同じような感性で競い合っていくという事になる。様々な点で学びが大きいから、熟練した開発者から初めてこういう物に触ってみるひと、そしてちびっ子にはマジで使って欲しいと思ったりした。

そして…このBLE(Nordic nRF51822)が搭載されているということは…多分、次のことが出来ると思われ。
Google Eddystoneが動く&ビーコンになる。
– IPv6(6LoWPAN)が使えて、IPv6をmicro:bitに振って通信できる。
とかとか。多分だけど、どっちも出来ると思われ。

Maker Faire Bay Area

今年は参加してきました、Maker Faire Bay Area 2016。去年はフライト当日に入院の刑でキャンセルだったけど、今年は謎の病気になることもなく行けました。

所感

Bay AreaのMaker Faireはザックリだと世界各地のギークや、いわゆるシリコンバレー周辺のギークやらガレージで作った変な物(人)が集まって見せ合うイベントだと思われ。そしてちびっ子向けのワークショップや体験物があったり、KickStarter, Indiegogoといった所に出しているような新しいデバイスも大集合みたいな。ただ、フェス感はハンパない。そこら辺で音楽がなっていたり、展示やイベントが行われている。来場者数も半端無くて、13万人以上が一気に来る。実際会場は人・人・ひーーーーーとーーーー!!で溢れている。全体の会場はこんな感じ。

広いっす。やたらと広いっす。去年は不明だけど、一昨年に比べて駐車場を潰して巨大なテントを立てていたり(Zone.10)、Zone.6あたりも拡張されているような。広さ的にちょっと調べてみたら…東京ドーム3個分らしい。

何にしてもやたらと広い、人も大量、物や展示も大量というイベントですね。シャボン玉をボーンとやっている毎年、恒例的な感じ。開放的で気持ちいいですね。

Zone.3の暗闇エリアにある超巨大な造形物。恐ろしく美しかった。

一番混む会場のメインステージ前。向こうに怪獣が見える…それにしても人が凄い。土日はこんな状態がエンドレスで続くと思っても良い。

んで全体的な雑感は、ドローン物の展示がほぼゼロ(だと思われ)なのがビックリ。あと3Dプリンターはメーカー寄りの所が多かったような。数年前はドローンは大小様々大量、3DプリンターやCNCも超大量!!って感じだったけど、「あれ…無いの?」と思える感じ。あれだけ出ていたのに、どこに行ってしまったのか、主要なプレイヤーが限られてきたと言っても良いのかも知れないけど。あと、IoT、IoTしてなかったのが良かった。メイカームーブメントとかIoTなる言葉の震源地で、そういう言葉よりも「色んなのを持ってきたったぜ!!」みたいな感じは良い。印象としては、半導体メーカーのエリアが広かった感がする。Qualcomm, MicroChip, Cypress, Nordic, Atmel/NXP/ST/nvidia(このあたりはいつもの…)とかね。
大量の色んなドローンの出展は無いかわりに、ドローンレースやドローンバトルはあった。これはドローンレース会場。やたらと広い、そして当然激混み。背の小さい自分はモニター越しに見る感じ。

このドーム全体でレースをする感じ。操縦者はHMD装着がデフォのようで、こりゃ楽しげだよね。

こっちはドローンバトル。ガチで落とし合いで、ぶつかって羽が飛び散ったり、ネットに絡まる、墜落なんのその。ネットを放出するドローンもあったり様々で、放出する瞬間は「パシュッ!!」とかって良い音がなっていた(外してたけどw)。

初日の終わりには恒例のパエリアパーティ。出展者はビール飲み放題、パエリア食い放題、そしてなぜかハーゲンダッツも食べ放題だった。こんな感じの開放感。

そんなパーティ中もロボットが練り歩いていたり。こちらはアスラテックさん変形ロボ、J-Deite。女の子と握手していた。

Make:の発起人で、Maker Faire創設者のDaleさんがしれっとパエリアを出していたり、開放的なパーティ:)

自分のところ

持っていったのは、LEDロッド、ふわふわ浮遊もの、Drone、コロコロ、キーボードマシンでブースはこんな感じ。

コロコロでピコピコ音を出しながら踊る右のちびっこ

コロコロ中

LEDロッドを繋げて遊んでいたり

キーボードマシンをボコボコ叩きまくり

キーボードマシンは完全にギーク向け。ソレノイドが大量にあって、5Vで動いているという謎構成だし。ただ、何故か普通の人たちにウケた。タイプライターが文化としてあるというのもあると思われ。
色々持っていったけど、ちょっとした反省が…いっぱいあると説明が大変というところ。一人だし、こっちで説明したり相手をしていて、反対側でWhat’s this?といった感じ。多くても2本くらいに絞らないと、人の流れでどっと来るとめっちゃ大変だった。ゆるふわ浮遊物は面白くって、ちびっ子もその親も「これ知ってる、磁石でしょ。」とか、見た瞬間に磁石だよこれ!!と言ってくるという、仕組が既にパレているっぷり。ただ、実際に知っているのとやるのは難しくて、浮かべようとトライしてみるとうまくいかない…こんなの簡単だぜ!!と意気込んでも浮かない…そう、これわりとバランスが難しいのよね。
そしてコロコロの説明が難しかった。そもそもコロコロの認識が現地で何かおかしい…と思ったら、使われていないという事実が。説明するのがめっちゃ大変だった。”コロコロは掃除用具である”という前提で光ったり音が鳴るというギャップが楽しいのであって、そういう前提が崩れるとタダの回って光って音が鳴るというアイテムになってしまう。最後の方は面倒だったから、rolling music itemとかってノリで説明することにした。

面白いものとか

ここからは見てきた面白いもの。
まずは浮遊もの。Cosmic Dance。底に磁石が仕掛けられてるですね。

地元の美大からの出展

暗闇エリアにて。ロボに乗ってギーガー!!と操作して動かしていたり。ちびっ子が並んでいた…自分も並んで乗ってみたかった…

今年で5年連続受賞の寺崎さんのGlue Motor。おめでとーございまっす!! 初日から空港ピックアップ、最後まで毎日本当にお世話になりました。

Nova。寝っ転がってみる感じ。

Dream Catcher。恐ろしく美しかった。

彫刻家のテオ・ヤンセンさんの作品。丁度、exploratoriumでもやっていたよう。

大盛況のヘボコン

MESHはかなり良い場所で人もいっぱい。

Bezelieとちびっ子

水野さんのところ

カマキリしゃー!!!!

The Dancing Serpent。正面入口に入ってすぐの所に火ボーボーで。

食べ物を売っている所も大きくあったり

原点とも思えるクラフトエリアでの物販もいっぱい

ひたすらフラフープを回している人達

暗闇エリアで。HMDとヘッドフォンで洗脳感が半端無かった

写真だけじゃ伝えきれない楽しさがあるですね。
他では出来ない&見たことがないような、火を吹いたり、音楽ガンガンとか…もちろん技術的に深い所をやっていたり面白い仕組みのも沢山、作品もいっぱい。やたらと広いから、個別にみたら1日じゃ見きれないほど。IT的な技術者だけじゃなく、クリエイターや色んな人にほんとオススメなイベントっすね。

番外

イベントが終わったあとに、色々と行脚に誘って頂いて行ってきました。行った所もだけど、色んなことを話せて楽しかった&飯うまかった。ありがとーございます!!

あと全然関係ないけど、サンフランシスコで出国の朝に教会めぐり&ブラリしていたら、こんな感じで人やら記者らしき人がわらっといて何かと思って見てみたらクリントンさんだった。

思わず…自分も握手してきたった。謎のエンカウントだった。

SoracomでIPv6を使う

この記事はSORACOMさんのSoftware Design巻頭特集記念リレーブログ 5/4日の記事です。

何か面白い使い方を?というのを考えて、やはり自分と言ったらIPv6じゃん(w)ということで、SoracomのNW上でIPv6を使うことに。

なぜIPv6か

普通に使うとMVNOのNWで端末にはIPv4プライベートが降ってくるですね。まぁ、Global IPv4が降ってきたらちょっぴりビックリはするけど、プライベートIPということで、上位のNWから直接何か攻撃されるとかってリスクは防げている。
ただし、やっぱりあれだよね、IoTというかM2M的というか、はるか昔からそれ系のと言ったら…IPv6(藁)だーよーね。IPv6 Globalを降るとIPv6 NW側から直接端末にリーチする事が出来るようになる。これはこれで便利。ただし、Global IP直撃アタックのリスクも出てくる。その辺は、NWがNativeでIPv6に対応していて、上位のFWで選択的にACLを書けたら素敵だなーとは思うけど、とりあえずは端末に直撃で振って使う事に。

使うもの

使うものはRPi3、L-02C、soracom simです。

ここで、端末にどーやってIPv6を振るか…というと、トンネル、VPNものですね。ただし、NAT越えか上位ルータでのプロトコル番号41番を通したりが必要になったりする。

1) Hurricane Electric IPv6ブローカを使ってみる
これはうまくいった。上位のNWで41番通してくれているのね(多分)。本当は6to4とか残っていたらなーとか思ったけど、見つけられなかった。もうこの手のトンネルものはIPv6の普及と共に少なくなってきたもんね。
このHurricane Electricのは適当にメアドで登録するとブローカが使えるようになる。ただし、1日にGlobal IPに対して2個の設定しか食わせられない…そう、仮に上位のNWのGlobal IPが変わると割り当てされるブローカ、IPv6が変わるというか再設定をするハメになるから、ちょっとなぁ…といった感じだった。

2) SoftEther IPv6割り当てサービスを使う
これはたまに使っているIPv6接続サービス。素晴らしいっす。これを使うと構成は次のようになる。

RPi用のARM SoftEtherクライアントでIPv6サーバに接続することで、IPv6のNWを引き込むことができる。これで別のIPv6 NW上のサーバから直撃でアクセスも可能になる。実際に接続した状態はこちら。

ppp0はsimで接続したもので、vpn_soracomはSoftEther VPN IPv6接続で作ったinterface。ちゃんと2001から始まるGlobal IPv6が振られてますね。(あ、もうこのIPにアクセスしてもムルポッス。止めてるから:)
これでやりたい事は出来た。次に実際データを流してみる。

パケット圧縮を使う

SoftEtherにはパケット圧縮という機能が付いていて、これを利用するとNW上に流れるパケットを事前に圧縮する事が出来る。もちろん、Plain Textとかだと効率がいいけど、バイナリだと効率が悪くなる。とわ言え、流したデータ量に対して従量課金が発生すると思うと、この辺はできるだけ抑えたくなる。
ということで、IPv6サーバから毎秒ping6を流して、圧縮、非圧縮じのデータ量比較を確認してみる。

結果はこちら。これはSoracomさんの時間毎データ量から見ることができる。

1) 一番右のもっともデータ量が大きい : 非圧縮
2) 右から2番目のもの : 圧縮
3) 右から3番目より左 : ping6も何も投げない定常接続

ということで、ping6のデータ(64byte文字)だと当然っちゃ当然の結果になった。何もしないで接続だけの場合だと1MByteくらいのデータ量で、毎秒ping6(64byte)の圧縮だと2MByte、非圧縮だと3.1Mbyteという結果に。SoftEtherのパケット圧縮が効いてますねー。
もちろん、圧縮処理をすると端末もパケットを投げる時に、圧縮/解凍が走るからその分重くなるけど、RPi3 quad-core ARMのハイスペックだと毎秒64byteなんて投げても負荷はもちろんゼロ。

まとめ

ということで、IoT/M2M的にはやっぱIPv6だーよーねー、というのは将来的な部分や可能性として6LoWPANという利用もあるから、何にしてもIPv6を引き込みたくなる(気がする)。
とりあえず、HurricaneとSoftEther IPv6を使ったけどSEの方が自分は便利だと思う。軽快に動くし、パケット圧縮という機能で流量を圧縮することができる。これは従量課金という部分にヒットする所だけど、IoT/M2M的なデータ流通ってそんなにサイズ的・頻度もあるかどうか…だし端末への圧縮/解凍負荷をどう考えるか?という部分にも効いてくる。全部が全部、RPi3ほどのハイスペックじゃないからね(と言っても、たまにデータを投げるくらいでテキストとかなら軽めの圧縮をした方が良いと思われ)。
こうやって、IPv6をトンネル/VPNで通さなくてもNativeでIPv6が使えるよーになったら、何かもっとテンションが上がるよーな気がする:-)