OpenWrt 19.07.0: Mesh Network + WPA3

OpenWrtのメジャーアップデートがありました。今回の目玉となるのはWPA3です。まだクライアントでは対応していないのですが、WPA3 SAEでピンときました。以前メッシュネットワークでWPA2では暗号化に失敗してtincを使ってメッシュネットワークを構築しました。暗号化方式のSAEは詳しくはわかりませんがメッシュとは相性がいいので、もしかしたらと考えて試してみました。結果はすんなりと接続できました。150Mbit/sが限界ですが、以前よりシンプルにネットワークが構成できるようになりました。暗号化していないデバイスからアクセスしても繋がらなかったのでWPA3は機能しているようです。

不安なので調べてみました。RSNの項目をみるとCCMP、SAEとあり、WPA3は機能しています。

	TSF: 8139981344 usec (0d, 02:15:39)
	freq: 2437
	beacon interval: 100 TUs
	capability: (0x0010)
	signal: -32.00 dBm
	last seen: 1100 ms ago
	SSID: 
	RSN:	 * Version: 1
		 * Group cipher: CCMP
		 * Pairwise ciphers: CCMP
		 * Authentication suites: SAE
		 * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
	HT capabilities:
		Capabilities: 0x11ce
			HT20/HT40
			SM Power Save disabled
			RX HT40 SGI
			TX STBC
			RX STBC 1-stream
			Max AMSDU length: 3839 bytes
			DSSS/CCK HT40
		Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
		Minimum RX AMPDU time spacing: 8 usec (0x06)
		HT TX/RX MCS rate indexes supported: 0-15
	HT operation:
		 * primary channel: 6
		 * secondary channel offset: no secondary
		 * STA channel width: 20 MHz
	MESH ID: MyMesh

参考:Mesh化ルータリスト

対応済

  • Buffalo WZR-HP-AG300H
  • Buffalo WSR-1166DHP
  • Buffalo WZR-HP-G300NH2

未対応

  • Buffalo WMR-300

Allwinner H6とCryptography

Kernel 5.5.yになってAllwinner CPUでHW暗号化できるとのことで試してみました。私自身、HWの暗号化について全く知識はないのですが、作るだけは作ることができました。結論は全然だめでした。おそらくまだ開発途上なので、今使っているデバイス、WiFiやディスクの暗号化には使えないということです。いまのところaes-cbcが使えるようですが、残念ながら私の暗号化ディスクはaes-xtsでした。

LUKS header information for /dev/mmcblk2p2

Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096

カーネルオプションは次のようにしました。

ビルドしてdmesgのアウトプットです。

[   44.585722] sun8i-ce 1904000.crypto: Set mod clock to 300000000 (300 Mhz) from 24000000 (24 Mhz)
[   44.588565] sun8i-ce 1904000.crypto: will run requests pump with realtime priority
[   44.588767] sun8i-ce 1904000.crypto: will run requests pump with realtime priority
[   44.588915] sun8i-ce 1904000.crypto: will run requests pump with realtime priority
[   44.588991] sun8i-ce 1904000.crypto: will run requests pump with realtime priority
[   44.589053] sun8i-ce 1904000.crypto: Register cbc(aes)
[   44.591762] sun8i-ce 1904000.crypto: Register ecb(aes)
[   44.596913] sun8i-ce 1904000.crypto: Register cbc(des3_ede)
[   44.599894] sun8i-ce 1904000.crypto: Register ecb(des3_ede)
[   44.604083] sun8i-ce 1904000.crypto: CryptoEngine Die ID 0

あとは cat /proc/cryptoで暗号のリストを表示できます。

追記2

リサーチしてみました。aes-xtsが速くこれが正解のようです。サイトによるとaes-cbcがHW支援が有効ということですが、不可解なことにソフトウェアエンコードより遅くなっているという結果になってます。

kernel v5.5.y

$ cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       321649 iterations per second for 256-bit key
PBKDF2-sha256     569878 iterations per second for 256-bit key
PBKDF2-sha512     234896 iterations per second for 256-bit key
PBKDF2-ripemd160  185391 iterations per second for 256-bit key
PBKDF2-whirlpool   82643 iterations per second for 256-bit key
argon2i       4 iterations, 180486 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      4 iterations, 200539 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm | Key |  Encryption |  Decryption
        aes-cbc   128b    74.6 MiB/s    82.8 MiB/s
    serpent-cbc   128b    29.6 MiB/s    34.0 MiB/s
    twofish-cbc   128b    44.4 MiB/s    51.0 MiB/s
        aes-cbc   256b    69.4 MiB/s    77.3 MiB/s
    serpent-cbc   256b    30.1 MiB/s    33.9 MiB/s
    twofish-cbc   256b    46.3 MiB/s    51.4 MiB/s
        aes-xts   256b   385.2 MiB/s   375.9 MiB/s
    serpent-xts   256b    30.7 MiB/s    35.4 MiB/s
    twofish-xts   256b    50.7 MiB/s    54.1 MiB/s
        aes-xts   512b   351.0 MiB/s   357.8 MiB/s
    serpent-xts   512b    32.7 MiB/s    35.1 MiB/s
    twofish-xts   512b    51.4 MiB/s    54.6 MiB/s

kernel v5.4.6

$ cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       321649 iterations per second for 256-bit key
PBKDF2-sha256     569259 iterations per second for 256-bit key
PBKDF2-sha512     234896 iterations per second for 256-bit key
PBKDF2-ripemd160  185654 iterations per second for 256-bit key
PBKDF2-whirlpool   82435 iterations per second for 256-bit key
argon2i       4 iterations, 180833 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      4 iterations, 196031 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm | Key |  Encryption |  Decryption
        aes-cbc   128b   358.4 MiB/s   410.6 MiB/s
    serpent-cbc   128b    29.3 MiB/s    33.8 MiB/s
    twofish-cbc   128b    45.0 MiB/s    50.8 MiB/s
        aes-cbc   256b   310.0 MiB/s   375.8 MiB/s
    serpent-cbc   256b    30.1 MiB/s    33.7 MiB/s
    twofish-cbc   256b    46.0 MiB/s    51.4 MiB/s
        aes-xts   256b   372.4 MiB/s   381.5 MiB/s
    serpent-xts   256b    32.0 MiB/s    34.7 MiB/s
    twofish-xts   256b    49.6 MiB/s    54.8 MiB/s
        aes-xts   512b   355.7 MiB/s   355.5 MiB/s
    serpent-xts   512b    32.7 MiB/s    35.0 MiB/s
    twofish-xts   512b    52.0 MiB/s    54.4 MiB/s

リンク

https://linux-sunxi.org/Cryptographic_Hardware_Accelerators

Buffalo WSR-1166DHPのOpenWrt化

TV-boxが802.11ac対応なのでルータもアップグレードしてみました。TV-boxのWi-Fiチップはシングルアンテナなので433Mbpsまで可能です。802.11aだとシングルアンテナで150Mbpsなので約3倍くらい通信速度があがります。802.11aだとかなり遅くてストレスなのでちょっとした投資で快適なネットワーク化ができます。WSR-1166DHPは最上級機種ではありませんが、バランスから考えて使ってみることにしました。OpenWrtのインストールは各機種独特でやり方は検索等で調べるわけですが、この機種は比較的楽にインストールできます。できればサーバセットアップが必要なtftpブートやシリアル回線でインストールはしたくないですね。フォーラムによれば次の手順によります。

1.lede-ramips-mt7621-wsr-1166dhp-initramfs-factory.binをダウンロードします。オフィシャルレポジトリにopenwrt-18.06.5-ramips-mt7621-wsr-1166-initramfs-kernel.binというのがありますがこれでは使えません。

2.オフィシャルリポジトリから最新のFWをダウンロードします。openwrt-18.06.5-ramips-mt7621-wsr-1166-squashfs-sysupgrade.bin

3.ルーターのバッファロー製のダッシュボードでfactory.binをアップグレードします。メモリー上にインストールするので電源はそのままです。

4.scp等でsysupgrade.binを192.168.1.1にファイル転送します。

5.sshログインしてsysupgrade -v sysupgrade.binでファームウエアのアップグレードをします。

以上で簡単にできます。転送速度を検証してみましたが残念な結果でした。10mb/sを少し超えるくらいでした。以前より2,3mb/s速くなってますが、予想値の半分程度でした。Wi-Fiの接続速度はたしかに速くなってるのですが原因がわかりません。

追記1

802.11ac対応したのになぜ遅いのかいろいろ思いを巡らした結果、今のカーネル5.4.yは暗号のHWエンコード対応していないせいかもしれないと思いつきました。そこでパワーとHWエンコードできるインテル製PCで802.11anで接続してみたらかなりの速度が出たので、その線が濃厚のようです。HW暗号化対応は5.5.yからなのでしばらくリサーチしてみることにします。

WLI-UC-AG300Nドライバーのビルド

ビルトインのWiFiデバイスでWPAエンタープライズが使えなかったので比較するためにUSBのWiFIドングルを使ってみました。カーネルモジュールがなかったので作ることから始めます。

git clone https://github.com/shekhei/RT2870USB.git

ソースをダウンロードしてソースを編集します。ネットで調べてそれを参考にさせてもらいました。

common/rtusb_dev_id.c
..
        {USB_DEVICE(0x100D,0x9031)}, /* Motorola 2770 */
        {USB_DEVICE(0x0DB0,0x6899)},
        {USB_DEVICE(0x0411,0x012e)}, /* Buffalo WLI-UC-AG300N*/
#endif // RT2870 //
        { }/* Terminating entry */
..
os/linux/config.mk
# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y

# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

Armbianのカーネルヘッダーだけだとビルドできないのでソースをインストールします。

nano /usr/src/linux-source-5.4.6-sunxi64/include/generated/utsrelease.h
#define UTS_RELEASE "5.4.6-sunxi64"
/usr/src/RT2870USB
make -C /usr/src/linux-source-5.4.6-sunxi64 SUBDIRS=/usr/src/RT2870USB/os/linux modules

追記1

ソースをビルドしているときになにかおかしいことに気がついて見直してみました。そもそもネットの情報はかなり古い情報でソースも覗いてみたらかなり古そうでした。古いドライバーはたいていメインラインカーネルに組み込まれているはずなので、カーネルソースを調べてみました。

CONFIG_RT2800USB_UNKNOWN=y

このオプションを有効にして再ビルドしたら使えるようになりました。そしてこのデバイスでもやはりWPAエンタープライズは使えませんでした。ということはビルトインのデバイスの方も問題ない可能性が高いということになります。WPAエンタープライズ(eap-tls)の接続問題の原因の絞り込みはまだしばらく掛かりそうです。

追記2

問題の切り分けをしてどうもTLSの互換性に問題がありそうだったので整理してみました。

サーバ:
Debian Buster
クライアント:
Archlinux => OK
Ubuntu 18.04(派生含む) => NG

x86_64CPUとArm64CPUの2台UbuntuだけがともにNGでした。おそらくTLSバージョンが古いせいだと推論してみました。サーバのFreeradiusの設定を見てみるとTLSv1.2で設定してあり今まではArchlinuxのノートPCでは問題が起こりませんでした。しかしUbuntuはTLSv1.2に対応しておらず接続ができなかったようです。原因がわかってきたので次のようにFreeradiusを設定してみました。

/etc/freeradius/3.0/mods-available/eap
                tls_min_version = "1.1"
                tls_max_version = "1.2"

再起動してArmbianから接続してみたところ問題が解消しました。

追記3

もう少し調べてみたらUbuntu18.04のOpenSSLののバージョンは1.1.1でTLSv1.2に対応しているようです。Freeradiusに通らない原因は不明です。

 ldd /sbin/wpa_supplicant
libssl.so.1.1 => /usr/lib/aarch64-linux-gnu/libssl.so.1.1 (0x0000ffff85930000)

追記4

なんとなくしっくりこないのでもう一度、頭の中で整理してみました。debian busterはubuntu bionicより新しいopensslなので明示的に指定しないと最新のv1.2より上のTLSを使ってしまう。bionicのopensslはTLSv1.2対応である。ということは明示的にTLSv1.1でなくTLSv1.2を明示的に指定すれば良い。この推論でもう一度、freeradiusを設定してみたらうまく行きました。

/etc/freeradius/3.0/mods-available/eap
                tls_min_version = "1.2"
                tls_max_version = "1.2"

ついでにテストの過程でコマンドラインからの接続も試してみました。

/etc/wpa_supplicant/eap-tls.conf
network={
	ssid="MyNet"
	key_mgmt=WPA-EAP
	eap=TLS
	identity="orangepi"
	ca_cert="/etc/wpa_supplicant/Radius_Certificate_Authority.crt"
	client_cert="/etc/wpa_supplicant/orangepi@mynet.crt"
	private_key="/etc/wpa_supplicant/orangepi@mynet.pem"
	private_key_passwd="****"
} 
 wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/eap-tls.conf -D wext
dhclient