子供のYoutube閲覧時間を制限したく、ただYoutube以外のアクセスは許可したいという要望が我が家では出てきたので仕組みを作ることにした。
条件例
条件は色々と追加できるようにしたいがとりあえずこんなことができたら面白そう
- Youtubeのみ1日30分しか閲覧できない
- マイクラなど他のゲームや、調べ物には影響を与えない
- 算数の問題を解いたら10分延長できるw
- 親が管理画面で時間が自由にコントロールできる(見守りSwitch的な)
仕組み検討
Windowsの親子アカウントを使えばPC時間制限はできるがYoutubeのみの制限ができない。
Chromeのプラグインを使えばできそうなものがあるが、Microsoft Edgeを使われると無意味。
その辺りを考えて、DNSでYoutubeのクエリだけ制御するか、HTTP ProxyサーバでYoutubeのアクセスだけ制御するのが良さそう。
HTTP Proxyの場合はPacファイルでYoutubeドメインの時のみProxyを使うという設定ができるので、あとはProxyサーバを制御すれば良いが、証明書の問題が出て解決するためにオレオレ証明書と認証局の情報をセットしないといけないため面倒そう。
最近DNSの仕組みに詳しくなってきて、やるならDNSかなという感じでとりあえずDNSフルリゾルバ(キャッシュサーバ)を作ることにした。
調査
Windows10でYoutubeを再生させながらDNSを127.0.0.1など無意味なものに変更したらどうなるか実験した。
- Youtubeで再生中のものはそのまま再生される(バッファがある限り?)
- 次の動画など別動画は再生できない
1日30分という制限が厳密にコントロールできないが、まぁこれで良いかなという感じ。再生途中に突然止まると発狂するのでw
仕組み
子供のWindows起動時に自作DNSキャッシュサーバを起動。Windowsが参照するDNSサーバはそのローカルのサーバ。
サーバの仕様はこんな感じ
- DNSパケットを受け取るとどのドメインの問い合わせか確認
- Youtube以外はすべて他のフルリゾルバー(8.8.8.8とか)に中継
- Youtubeの場合は条件を確認して、通さない場合は何も返さない
実装の中身はこんな感じ
- Windowsからの問い合わせ時は、Questionのドメイン、src IP、srcとdstポート番号、トランザクションIDを記録
- 同じトランザクションIDで上位のフルリゾルバーに転送
- 戻ってきたパケットをそのままsrc,dstポートを入れ替えて同じトランザクションIDで返す
ステップ
こんな感じで実装していこうかと思う
- DNSの再帰問い合わせの中継サーバを実装
- Questionを見て条件を付けられる機能を実装
中継サーバの実装に時間がかかりそう。