IEEE 802.11s Meshネットワーク+tinc VPNをセットアップする

UPDATE:18 JAN 2019

OpenWRT 18.06.1では”wpad-mesh-openssl – Supplicant (with 802.11s mesh and SAE support)”というパッケージがありSAEサポートのあるWIFIだと使えるらしいです。私の機種は古いので使えませんでした。ということでTincをアップデートしました。遅いですが安定しています。(1MB/s)

ずい分前に802.11sのmeshネットワークのセットアップの記事を書きましたが、セキュリティがないため使えませんでした。ところが先日LibreELECのtinc VPNをセットアップして、すこし調べていたらスイッチモードでVPNを構築できることが分かりました。どういうことかというとLANのハブみたいにネットワーク同士を同じセグメントで繋ぐことが出来ます。meshネットワークととても相性が良くtinc VPNを組み合わせればセキュアなmeshネットワークが出来上がります。

次の図は構築イメージです。

ネットワーク図

tinc VPN (Network A + B + C: 192.168.1.0/24)
+---------------------------------------------+
|  +---------------+      Mesh Network        |
|  | Network A     |      10.0.0.0/16         |  Network A: Router A
|  |192.168.1.1/24 |                          |  Network B: Router B
|  +---------------+      +---------------+   |  Network C: Router C
|                         | Network C     |   |
|  +---------------+      |192.168.1.3/24 |   |
|  | Network B     |      +---------------+   |
|  |192.168.1.2/24 |                          |
|  +---------------+                          |
+---------------------------------------------+

構築手順

  1. Meshネットワークの設定
  2. インターフェースの設定
  3. Firewallの設定
  4. Dropbearの設定
  5. tincのインストール
  6. ダッシュボードの設定
  7. tincの設定
  8. ポストインストレーション

今回、使用したルーター、FirmwareはOprnWRT 15.05

  • Buffalo WZR-HP-G300NH2 x1
  • Buffalo WZR-HP-AG300H x2

1.Meshネットワークの設定

Mesh対応のWi-Fiアダプターはiw listを使って調べます。mesh pointがあれば対応しています。

/etc/config/wireless:

config wifi-iface 
        option device 'radio0' 
        option mode 'mesh' 
        option mesh_id 'mesh' 
        option encryption 'none' 
        option network '80211s'

Meshネットワーク用のIPアドレスを設定します。

/etc/config/network:

config interface '80211s' 
        option proto 'static' 
        option ipaddr '10.0.0.1' 
        option netmask '255.255.0.0'

2台のルータのIPアドレスは例として10.0.0.1と10.0.0.2として設定しています。設定が済んだらWi-Fiとネットワークを再起動します。

wifi
/etc/init.d/network restart

Meshネットワークが動作しているか以下のようにテストしてみます。

iw dev wlan0 station dump

-- stationリストの出力 ---

stationリストが出力されたらMeshネットワークが機能しています。つぎにIPアドレスを割り当ててssh等でアクセスしてみます。接続できれば次のコマンド打ってみます。

iw dev wlan0 mpath dump 
 
DEST ADDR         NEXT HOP          IFACE       SN      METRIC  QLEN    EXPTIME         DTIM    DRET    FL$ 
a0:b5:35:2c:f0:1b c0:d3:65:8a:c3:6f wlan0       2       106     0       0       0       0       0x14

このようにHWアドレスのリンク情報が得られます。手動で行う場合は次のようにします。

iw dev wlan0 interface add mesh type mp mesh_id mesh

または

iw phy phy0 interface add mesh type mp mesh_id mesh

チャンネルはデフォルトで1ですが変更する場合はセットします。

iw dev mesh set channel 6
ifconfig wlan0 down
ifconfig mesh up
ifconfig mesh 10.0.0.1/16

2. インターフェースの設定

OpenWRTのダッシュボードNetwork>Interfacesでインターフェースを作ります。

今回は80211sというインターフェースを作ります。1.Meshネットワークの設定ですでに出来上がっているはずです。Physical SettingsWireless NetworkMeshにリンクしていることを確認します。

3. Firewallの設定

オープンなネットワークなのでダッシュボードでFirewallの設定をします。基本的にWANと同じ設定です。WANの設定を使ってもいいのですが、今回はメッシュ専用の80211sのZoneを作成します。

Advanced SettingsForce connection trackingをオンにします。

保存して/etc/init.d/firewall restartで再起動します。

つぎに必要最小限のポート開放します。今回はping、tincで使う655ポート、そしてssh用の2222ポートです。sshはデフォルトの22ポートでもいいのですが、変更を加えた時にアクセス不能になった場合、修復が大変なのでポートを追加することをおすすめします。

設定が済んだらfirewallを再起動します。

4. Dropbearの設定

/etc/config/dropbearを編集します。RSAキーによるアクセス設定にします。

config dropbear 
        option PasswordAuth 'on' 
        option Port '22' 
        option Interface 'lan' 
 
config dropbear 
        option PasswordAuth 'off' 
        option Port '2222'

次に各ルータにRSAキーが必要なので、RSAキーがない場合には作成します。RSAキーは/root/.sshに作成します。

ssh-keygen -b 4096

各ルータに公開鍵を登録します。

nano /etc/dropbear/authorized_keys

dropbearを再起動してテストして見ます。

ssh -p2222 root@10.0.0.2

5. tincのインストール

sshでmeshネットワークからアクセスします。

例)

ssh -p2222 root@10.0.0.2

接続できること確認したらルータ同士をつないでいるLANケーブルを抜きます。tincをセットアップしてIPパケットが輻輳するのを防ぐ措置です。

パッケージインストールプログラムのopkgでtincをインストールします。

opkg update
opkg install tinc

/etc/config/tincを編集します。

config tinc-net myvpn 
        option enabled 1 
 
        ## Daemon Configuration (cmd arguments) 
        option generate_keys 1 
        option key_size 4096 
        option logfile /tmp/log/tinc.NETNAME.log 
        option debug 3 
  
        ## Server Configuration (tinc.conf) 

        option AddressFamily ipv4 

        list ConnectTo node_2
        list ConnectTo node_3

        option Mode switch 
        option Name node_1 
 
 config tinc-host node_1 
        option enabled 1 
        option net myvpn 
        list Address 10.0.0.1 
        option Port 655
        option PMTU 1472

tinc VPNを起動します。

/etc/init.d/tinc start

RSA鍵を作成した後、tincが起動します。

起動用設定ファイルは/var/tinc以下に出来ます。またデバッグをオンにしてあるので接続状況を確認できます。

各ルータの自分以外の/var/tinc/myvpn/hosts以下の情報を/etc/tinc/myvpn/hostsにコピーします。

tincを再起動します。

次にダッシュボードのInterfacesLAN(br-lan)を編集してVPNアダプタをブリッジします。

 

ターミナルから確認してみます。

brctl show 
bridge name     bridge id               STP enabled     interfaces 
br-lan          7fff.b0c7456ed04e       no              eth0.1 
                                                        wlan0-1 
                                                        myvpn

pingを使って相互に接続を確認してみます。

ping 192.168.1.1
...

ping 192.168.1.2
...

6. ポストインストレーション

デバッグのログが溢れるとシステムが止まるので抑制します。

/etc/config/tincを編集してコメントアウトします。

#       option logfile /tmp/log/tinc.NETNAME.log 
#       option debug 3

保存して再起動します。

Nodeを調べる

psでPIDを調べます。

kill -USR2 <PID>
logread

問題点

  • ネットワークが遅い

スループットが大体600~700kb/sくらいしかありません。ダッシュボードのAssociated Stationsを見るとmeshネットワークの速度は130.0 Mbit/sでてるので、単純に計算して16Mb/sくらいでそうですが、やはりSSL接続のオーバヘッドでしょうか。大きなファイルの移動は有線LANを使うしかありません。

  • メッシュノードの追加が煩雑

3台のルータで運用していますが、試しにトラベルルータをmeshネットワークに追加してみました。

hostsの情報を各ルータから取りせるのと、トラベルルータのhosts情報を各ルータに送らなければなりません。台数が増えれば煩雑さは増えていきます。ssh用の公開鍵も追加しなければなりません。

設定例

/etc/config/wireless

config wifi-device 'radio0'
        option type 'mac80211'
        option hwmode '11g'
        option path 'pci0000:00/0000:00:11.0'
        option legacy_rates '1'
        option country 'JP'
        option channel '11'
        option htmode 'HT40'

config wifi-device 'radio1'
        option type 'mac80211'
        option hwmode '11a'
        option path 'pci0000:00/0000:00:12.0'
        option channel 'auto'
        option htmode 'HT40'
        option country 'JP'
        option legacy_rates '1'

config wifi-iface 'default_radio1'
        option device 'radio1'
        option mode 'ap'
        option network 'lan'
        option ssid 'MyPlace'
        option encryption 'wpa2+ccmp'
        option auth_server '10.0.0.1'
        option auth_secret '*password*'
        option disabled '1'

config wifi-iface 'mesh0'
        option device 'radio0'
        option encryption 'none'
        option ifname 'mesh0'
        option mode 'mesh'
        option mesh_fwding '1'
        option network '80211s'
        option mesh_id 'mesh'

Referrences