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 をいじる機会は少ないかもしれませんが、皆様の知見を広げる一助になれていれば幸いです。