オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

メッシュWiFiとDHCPでスタティックルートを配布する方法

»

久しぶりにIT関連の話題でも・・・

自宅は細長い土地に3階建てで、リビングは2階にあり、光回線はリビングに引き込んであるため、ONUルーターは2階のリビングに設置してあります。WiFiのAPもONUルーターの近くに設置したため、リビングから遠い側の1F,3FではWiFiがほとんどつながらない状態でした。そこでまずはWiFiエクステンダーを設置してみました。

WiFiエクステンダーは既設のAPとの間に入って中継するのですが、クライアントのMACアドレスの先頭3オクテットを書き換えて既設APと通信する仕組みでした。設置してから気がついたのですが。。我が家では不正接続検知・排除のIntraGuardian2+を設置してあるため、許可登録していないMACアドレスは検知・排除してしまうため、先頭3オクテットを書き換えたMACアドレスもIntraGuardian2+に登録しないとならず、とても不便でした。

SSIDも既設のAPとWiFiエクステンダーで異なるものを使いますので、どちらにつなぐのかをクライアント側で選択しなければならず、さらに、明らかにWiFiエクステンダーを介する方が通信速度が遅くなりました。

ということで、自社でも使っているメッシュWiFi化をしてみました。

C478D343-05DC-462F-B5CF-E04D3FC19186.jpeg

1つ目をリビングに設置し、

4BD34B9E-1E76-490B-9A7B-20545C2D6342.jpeg

2つ目はリビングから遠い側の部屋に設置しました。

メッシュWiFiでは片側だけ有線でつないでおけば、もう片側は無線でつないでくれます。WiFiエクステンターと違ってメッシュWiFi間の通信は通常の対クライアントのWiFi通信とは別に中継してくれるため、それほど通信速度に影響が出ませんし、SSIDも全体で1つだけでOK。クライアントとしては部屋を移動していっても自動で近い側につないでくれ、通信断もおきません。これはやっぱり便利!

さて、ここまでは単にメッシュWiFiの製品を買ってきて設置しただけですが、WiFiが快適になると別の部分が気になってきました。

我が家と会社の間はVPNで常時接続をしていますが、ONUルーターにはVPN機能がありません。本当はONUとルーターを分けて欲しいのですが、一般家庭用のサービスでは一体型しか提供してもらえないのでした。仕方ないので、YAMAHAのルーターを更にONUルーターの下に1台設置し、会社へのVPNを張っています。

自宅内とはいえWiFiにつなげるクライアントも多いため、固定IPアドレスでの運用はさすがに面倒ですので、DHCPにしています。ONUルーターもYAMAHAルーターもDHCPサーバ機能を持っていますが、スタティックルートのDHCP配布指定ができないため、とりあえずデフォルトルートをYAMAHAルーターにして、YAMAHAルーターのデフォルトルートをONUルーターに向けて使っていました。同一セグメントなのにパケット中継が余計に行われるので実に気分が悪い構成でした。

DHCPでのスタティックルート配布はOption33(static-routes)が使えそうなものなのですが、実際はこのオプションはクラスフルルーティングを対象にしているため、大抵無視されます。調べてみたところ、RFC3442のclassless-static-routesを使えば良さそうです。

とはいえ、ONUルーターもYAMAHAルーターもそんなオプションを設定できませんので(実はできたのですが)・・・

IMG_7863.jpegBE868A46-3E4F-4BA4-B908-9AB22B08F936.jpeg

以前ProDHCPが快適に動いたNanoPiを設置しました。ルーターのDHCPサーバはどちらも停止し、NanoPiでProDHCPを動かしました。

option rfc3442-classless-static-routes code 121 = string;

と、Option121を定義し、

option rfc3442-classless-static-routes 18:c0:a8:00:c0:a8:11:01;

とセグメント定義内で記述すれば配布できます。18進数が並んでいるところはネットワークアドレス・ネットマスク・ゲートウェイアドレスをバイナリー表記したもので、この例では192.168.0.0/24宛は192.168.17.1をゲートウェイに、というのを、24,192,168,0,0,192,168,17,1という順番で記述しています。バイナリー表記への変換はhexrouteというツールで簡単に生成できます。複数のルーティングを指定することも可能です。

$ ./hexroute
Usage: hexroute [-v|-h] target/bits [gw] gateway [target/bits [gw] gateway ...]

ie: ./hexroute 172.16.0.0/16 gw 192.168.1.1

なお、厳密にはRFC3442ではこのオプションを使う場合はデフォルトルートのOption3も無視してここに記述すべきとあります。クライアントのOSにより無視するものとそうでないものがあるようです。デフォルトルートも後ろに追記するなら、0.0.0.0/0宛でルーターを指定すればよく、0.0.0.0/0は0で良いので、0,192.168.17.254という感じに追加すればOKです。

option rfc3442-classless-static-routes 18:c0:a8:00:c0:a8:11:01:00:c0:a8:11:fe;

ちなみに、以下のような書き方もできます。

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

Option121を符号なし8ビット整数配列と定義して、

option rfc3442-classless-static-routes 24, 192,168,0, 192,168,17,1, 0, 192,168,17,254;

こちらの方が数値を直感的に理解しやすいかもしれませんね。どちらも同じ値を配布できます。

ISC-DHCPとほぼ全く同じ設定で使えるのがProDHCPの便利なところです!

speed.jpeg

VPN以外の余計な中継がなくなったおかげか、通信速度はかなり改善されました。とくに上りスピードは全然違いますね〜

と、ここまでやってから気がついたのですが、YAMAHAルーターはファームウェアを新しいものにするとこのオプションの配布ができるという情報がありました。。

dhcp scope option 1 classless_static_route=18,c0,a8,00,c0,a8,11,01,00,c0,a8,11,fe

こんな感じに指定できます。

ということで、NanoPiを使わなくてもスタティックルートをDHCPで配布することができてしまったので・・・NanoPiのProDHCPは停止し、またなにか複雑な設定をしたくなったときに使うことにしました。

ProDHCPは自分で作ったプログラムですので、何が起きても簡単に調べられますし、改良することも簡単なのでよいのですが、やっぱり常時つけっぱなしにしなければならない機器は増やさない方が管理が楽ですものね・・・

Comment(0)