木更津高専 Advent Calendar 2019 5日目担当、自称学寮ネットワーク委員顧問のぴーおかです。
委員会名の通り、学寮内のネットワークインフラの管理や障害対応の業務を 無給で しています。
先日サーバのリプレースが完了し、安定してきたので色々まとめようと思います。
寮ネット概要
ゲートウェイサーバが寮内サブネットと学内サブネット(外界)を繋いでおり、利用申請したMACアドレスだけを通すようにパケットを捌いています。
また、寮内の各居室及びゲートウェイサーバはL2で接続されていて、DHCPやDNSもこのサーバから配布しています。
利用者は申請書を提出し、それをネットワーク委員が承認・サーバに反映することで、外部ネットに接続できるようになります。
ところが利用申請は紙媒体のみ。そこで、「Web上で利用申請できるようにしよう!」というのが今回のリプレースの第一目標です。
従来のサーバにおける問題点
MACアドレス手打ち問題
申請を適用する際はサーバにSSHログインし、申請書の内容を独自規格のCSVファイルに手動で打ち込む作業をしなければなりませんでした。
しかも反映実行時にリスト内にMACアドレスの重複や申請台数の間違いが1つでもあれば、寮生全員の外部接続が断たれるシビアな仕様です。(相部屋で共同のルータを使う寮生も多く、MACの重複は結構起こります)
そんなわけで、年度始めは200件近い申請書を血眼になって処理するのがネットワーク委員の恒例行事でした。
秘伝のソース化した設定反映スクリプト
設定反映はシェルスクリプトひとつ実行すれば完了するように作られていて、作業自体は非常に簡単です。(申請リストのCSVファイルに不備が無いことが前提ですが)
いざ中身を読んで見ると、スクリプトから別のスクリプトを呼び出し、また別のスクリプトを呼び出し、iptablesを設定するスクリプトを生成し、それを呼び出し...といった具合に解読が困難な状態でした。
昔はそうするしかなかったのかもしれませんが、これもどうにかしたい。
既存のシステムを再現する手段がない
既存のシステムに変更を加えようにも、実稼働しているサーバ上で万が一のことがあって動かなくなっては本末転倒です。
しかし、同じ環境を別マシンで再現できないことには開発に着手できません。
これらの理由から、このゲートウェイサーバを一から再設計することにしました。
新サーバの設計
利用申請Webフォームの実装
申請リストはDBで管理されるので、MAC重複の心配が無くなります。
後述するファイアウォールのルール生成もこのWebアプリが行います。
ファイアウォール設定の簡素化
従来はiptables直接実行でしたが、簡潔にルール設定できるufwでファイアウォールを管理します。
Webアプリによって生成されたルールをcronで定期的に反映し、申請されたMACアドレスからの外部接続を許可します。
再現性、冪等性の確保
Ansibleを導入しました。
RedHat製の構成管理ツールで、各種パッケージのインストールや設定を自動実行でき、人的ミスも無くなります。
アプリはできるだけDockerコンテナで駆動させる
Webアプリ用の環境構築や監視アプリを動かすのはコンテナの方が容易だと感じたからです。
実行環境のバージョンがOSのバージョンに依存しないのも魅力です。
Prometheus+Grafanaによる監視
従来は監視にMuninを使っていたのですが、グラフの期間指定ができず不便だったので変更しました。
ざっくり説明すると、Prometheusが監視データを時系列に蓄積し、Grafanaがグラフ化して表示してくれます。
DataDogやNetDataも検討したのですが、保存期間が短かったりリアルタイム性重視でちょっと違うかなといった感じ。
リプレース当日に見舞われた主な障害
サーバが持つデフォルトルートのエントリが突然消える
再起動で直りましたが、原因が分からない上に立て続けに2度起こったので、安定稼働3日目の今でもちょっと怖いです。
原因分かる方コメントお願いします。
<2019/12/13追記>
どうやらNICオフロードが原因でインターフェースごと落ちてたみたいです。
詳細→RHEL6 公式ドキュメント
申請フォームのWebページが重い
申請フォームのWebページがGoogleFontsのCDNを参照していたのが原因でした。
未申請のユーザは外部へアクセスできないため、ブラウザがタイムアウトと判断するまで読み込みが終わらない仕様になってしまったようです。
寮生「なんか繋がらないんだけど」
それはだいたいルーターが悪い。
まとめ
色々使ったツールが多すぎて、一つ一つ掘り下げられなかったのが申し訳ないです。
リプレース自体はWeb申請の導入を目標として始まったのですが、それ以上にAnsibleを導入できたことのメリットが大きいなと感じています。
実際、サーバのセットアップ作業もコマンド一つで完結し、作業時間も10分ほどでした。
あとはこのシステムを今後のスタッフが使いこなせるよう、卒業までにドキュメントをしっかり書き上げたいと思います。
卒研?お察しの通りです...