こんにちはこんにちは、KMC45代の id:crashrt です。 コーディング合宿は温泉に入ったり雑談したりコーディングしたりして進捗を生むイベントです。 進捗をたくさん生むためにはインターネットが必要です。 さらに今年はKMC1回生である49代の部員が16人も参加してくれているなど後輩が多く、ネットワーク技術を布教する絶好のチャンスでした。 そこで後輩を巻き込みつつ合宿Wi-Fiを構築してみました。 設計から一緒にやる時間はなかったので、準備は僕の方で済ませて、構成を解説しながら一緒に作業する、という形で進めました。
前回のコーディング合宿のときの様子は以下のブログにあります。 大まかな構成は今回も同じです。
前提
今回宿泊したあわら温泉政竜閣には、既設のWi-Fiが一応あります。 しかしこのWi-Fiがあまり強くはないため、前回同様自分たちでWi-Fiを構築します。 会議室で提供されている有線LANと、合宿用にレンタルしたホームルータの2つを上流として使うことにしました。
構成
以下のような構成で構築しました。


上流
上流はレンタルしたホームルータと既設の有線LAN(壁に情報コンセントがありました)の2つです。 メインのルーターは部室に転がっていたIX2105(haruka)です。 上流側は以下のような設定を入れて、2つの回線にロードバランシングしています。 ほとんど前回と同じですが、IX2105はWANの口が一つしかないので、LAN側のポートであるGE1でVLANを切って一つをWAN用として使っています。
ip multipath per-flow ip route default GigaEthernet0.0 dhcp ip route default GigaEthernet1:1.0 dhcp ! device GigaEthernet0 ! device GigaEthernet1 vlan-group 1 port 1 vlan-group 2 port 2 3 4 ! interface GigaEthernet0.0 description kabe ip address dhcp receive-default ip tcp adjust-mss auto ip napt enable no shutdown ! interface GigaEthernet1:1.0 description home-router ip address dhcp receive-default ip tcp adjust-mss auto ip napt enable no shutdown
下流
DHCPはIX2105で動かして、DNSはミニPC (debussy) で動かしたKnot Resolver、APはAironet 1852 (aquarius) を使いました。 APはTP-LinkのPoE+スイッチ (capricornus) に繋いでいます。
ip dhcp profile user assignable-range 192.168.220.128 192.168.220.254 default-gateway 192.168.220.1 dns-server 192.168.220.3 lease-time 300 ! interface GigaEthernet1:2.0 ip address 192.168.220.1/24 ip dhcp binding user no shutdown
Knot Resolver は以下のブログと同じように構築しました。
運用・監視
せっかくミニPCがあるので、Grafana + Prometheus を使って監視基盤も構築してみました。 node_exporterでミニPCから, snmp_exporterでIX2105とAironet 1852からメトリクスを取得しました。 DNS系のメトリクスはKnotResolverのAPIから取得しています。

トラフィック
壁コンセントの有線回線が想定していたよりも品質が良く、200Mbps程度出ていました。 逆にホームルータの方は夕方の時間帯(20時~24時頃)はあまり速度が出ず数Mbps程度でした。 合宿期間中は雨が降っていたので、その影響もあるかもしれないです。 NAPTセッション数はホームルータ側は600程度、有線回線側は1500程度でした。 26人が参加していたのでまあこれくらいかなという感じです。 帯域に余裕があった有線回線側に多くのセッションが振られていますが、細かい設定は特に入れていないため、IXが適切に処理してくれたのかなと思います。


DNS
実は合宿期間中にこっそりDNSのキャッシュサイズを変えて少し遊んでいました。 初期値の100MB→1GB→8GBへと変えていったのですが、キャッシュヒット率は以下のグラフのとおりあまり変わらず5-6割程度でした。 もっと改善する方法があるのか、それともこういう会場ではこれが限界なのか...まだまだ勉強が必要ですね。

ちなみにこのグラフは以下のPromQLで取得していて、直近1分間の応答のうちキャッシュ済みだったものの割合です。
sum(increase(resolver_answer_cached_total{job="knot_resolver"}[1m])) / (sum(increase(resolver_answer_total{job="knot_resolver"}[1m])))
キャッシュサイズの変更の他に、先にクエリを投げてキャッシュに入れておく、というのも試してみました。 クエリリストはCisco Umbrellaの以下のドメインリストを使ってみました。
このリストにあるドメインについてのクエリをdnsperfで流しています。 9/19 0時頃の極端にキャッシュヒット率が下がっている部分が試していた時間ですが、キャッシュヒット率はあまり改善しませんでした。 全世界と部員とではクエリの傾向がきっと違うのであまり影響しなかったのかなと思っています。 そもそもこれくらいが限界なのかもしれないですが、他に良い方法があればまた試してみたいです。
まとめ
今回のコーディング合宿で構築したWi-Fiを紹介してみました。 規模は小さいですが実際に誰かに使われるネットワークを作ってみるのは楽しくていいですね。 利用者が全員身内で比較的気軽に構築できたので、色々試したり練習の場したりできる貴重な機会でした。
また、後輩もネットワーク構築に興味を持ってくれたのでやって良かったなと思います。 普段あまり意識せずに使っているインターネットも裏では色々やってる人がいるんだなというのが伝わっていたら嬉しいですね。 今後ネットワーク面白そう、やってみようかなと思ってくれる人がいたらさらに嬉しいです。