JANOG57 でも NETCON の作問や採点回りを担当しました!
こちらのブログでは、level 3-2 の問題について解説します。

DNS や CDN 等、NETCON では比較的珍しい L7 ネットワークにフォーカスしてみました。

level 3-2 問題の概要

トポロジ

問題文

あなたは前任者からお客様 Web サイトの CDN 化の案件を引き継ぎました。
要件や Origin Web サイトの仕様についていくつか引継ぎを受けていますが、十分とは限りません。

Origin Web サイトはお客様管理であり、設定を変えることはできません。
DNS Server はあなたにも設定変更の権限があります。

Origin-01 サイトの仕様

  • FQDN: origin.example.com
  • IP: 192.0.2.100
  • 認証: 「X-Auth-String: netcon」ヘッダの有無をチェック
  • 備考: 過去のテストの残骸で不要な Set-Cookie を応答する場合がある

DNS-01 の仕様

  • IP: 192.0.2.10
  • init システム: OpenRC
  • ミドルウェア: BIND
  • ゾーンファイル: /etc/bind/example.com.zone

CDN-01 の仕様

  • FQDN: www.example.com
  • IP: 203.113.1
  • init システム: OpenRC
  • ミドルウェア:Varnish
  • 設定ファイル: /etc/varnish/default.vcl

DNS-01 と CDN-01 の設定を調整し、以下の要件を満たす構成を完成させてください。

達成条件

  • Client-01 から curl http://www.example.com/ で Web サイトにアクセス可能 (200 OK) であること
  • Client-01 から http://www.example.com/ にアクセスした際、キャッシュが応答される (X-Cache: HIT が応答される) こと。
    ただし、強制的にキャッシュをするのではなく、Varnish のデフォルト条件に従ってキャッシュされる様な調整をすること。
  • Client-01 から http://www.example.com/now  にアクセスした際、キャッシュが応答されない (X-Cache: MISS が応答される) こと
  • Client-01 から http://www.example.com/now にアクセスした際、ブラウザでキャッシュが利用されない状態 (cache-control: no-store が応答される状態) であること

制約

  • DNS-01 の /etc/bind/example.com.zone について、既存の設定を削除してはならず、設定追加のみ可能です
  • hosts によって名前解決をしてはならず、DNS-01 を利用した名前解決のみ可能です
  • CDN-01 の /etc/varnish/default.vcl について、既存の設定を削除してはならず、設定追加のみ可能です

初期 Config

DNS-01

$TTL 3600
@ IN SOA ns1.example.com. admin.example.com. (
    2025010101
    3600
    900
    604800
    86400
)
 
        IN NS ns1.example.com.
 
ns1     IN A 192.0.2.10
@       IN A 192.0.2.100
origin  IN A 192.0.2.100

CDN-01

vcl 4.0;
 
backend default {
    .host = "origin.example.com";
    .port = "80";
    .host_header = "origin.example.com";
}
 
sub vcl_deliver {
    if (obj.uncacheable) {
    set resp.http.X-Cacheable = "NO";
    } else {
    set resp.http.X-Cacheable = "YES";
    }
 
    if (obj.hits > 0) {
    set resp.http.X-Cache = "HIT";
    } else {
    set resp.http.X-Cache = "MISS";
    }
}
Sponsor link




想定解答

① DNS-01 に www レコードの登録が必要です。

$TTL 3600
@ IN SOA ns1.example.com. admin.example.com. (
    2025010101
    3600
    900
    604800
    86400
)
 
        IN NS ns1.example.com.
 
ns1     IN A 192.0.2.10
@       IN A 192.0.2.100
origin  IN A 192.0.2.100
www     IN A 203.0.113.1  # 追加

②CDN-01 にて以下の設定及び再起動が必要です。

vcl 4.0;
 
backend default {
    .host = "origin.example.com";
    .port = "80";
    .host_header = "origin.example.com";
}
 
sub vcl_recv {
    # /now or /now/ の場合にキャッシュを回避する
    if (req.url ~ "^/now(/|$)") {
        return (pass);
    }
}
 
sub vcl_backend_fetch {
    # Origin アクセス時の Host ヘッダと X-Auth-String を変更
    set bereq.http.Host = "origin.example.com";
    set bereq.http.X-Auth-String = "netcon";
}
 
sub vcl_backend_response {
    # / にアクセスした場合に、レスポンスから Cookie を削除
    if (bereq.url ~ "^/$") {
        unset beresp.http.Set-Cookie;
    }
}
 
sub vcl_deliver {
    # ブラウザキャッシュを禁止
    if (obj.uncacheable) {
    set resp.http.X-Cacheable = "NO";
    set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";
    set resp.http.Pragma = "no-cache";
    set resp.http.Expires = "0";
    } else {
    set resp.http.X-Cacheable = "YES";
    }
 
    if (obj.hits > 0) {
    set resp.http.X-Cache = "HIT";
    } else {
    set resp.http.X-Cache = "MISS";
    }
}

解説

  • vcl_recv で、リクエスト受信時の処理を記述
    • /now についてはキャッシュせず Origin に直接アクセスするような設定を記載
  • vcl_backend_fetch で、 Origin へのリクエスト送信時の処理を記述
    • Host ヘッダの値を origin.example.com にセット
    • X-Auth-String の値を netcon にセット
  • vcl_backend_response で、Origin からレスポンス受信時の処理を記述
    • / については Set-Cookie を削除
    • Varnish は Cookie がセットされているページをキャッシュしない動作があるため
  • vcl_deliver で、クライアントへのレスポンス時の処理を記述
    • ブラウザキャッシュを禁止するためのヘッダを追加
    • 採点上は no-store のみで得点としているが、互換性も考えるといくつかヘッダを付与したほうが良い

おわりに

問題を解いていただいた皆様ありがとうございました!

ネットワークエンジニアとして CDN をいじる機会は少ないかもしれませんが、皆様の知見を広げる一助になれていれば幸いです。