参加記:JANOG55 NETCON 1位の取り組み方

ネットワークエンジニアのためのコンテスト [JANOG55 NETCON](https://www.janog.gr.jp/meeting/janog55/netcon/)で1位でした。大会中にどのように問題に取り組んだかを紹介します。参考になれば幸いです。

[取り組み方メモ](#参考-3-8-手元メモ)は実際に解きながら書いていたメモの例です。

NETCONとは: [JANOG55 NETCON開催のご案内](https://www.janog.gr.jp/meeting/janog55/nl-003/)より、

# 開始前の心構え
- 丁寧に解く。[手元メモ](#参考-3-8-手元メモ)みたいなのを書いて考える。
- 10分くらい考えても方針が分からなければ飛ばす。
- あやふやな部分がある技術は後に回す。今回はISIS, Tunnel, Multiarea OSPF, PIM-SM, Multicast MSDP、 EIGRP, DHCP。
- 全部解きたいのでレベルは気にしないで解く。

# day -1 : 5h
JANOG day -1である月曜の21:00からスタートしました。以下の記録はgitのログから再現していますが多少ずれているかもしれない。

`1-1`を開くとチュートリアルらしくlldpを打てば良いと書いてありAC。`E2`を考えて、題意からroute-mapで解く問題に誤認して90minくらい考え込む、SKIP。考えても解けないので心を落ち着かせるためにlv1,2を解く。`2-1`はぎょっとする見た目だが操作できるRTが1台でCostパズルに見えたので極端に大きい値と小さい値をいれてAC。雑な解法に見えるが他の真のコストが自明でないのでこれでよいだろう。`2-2`はEIGRPでdiffを取ると自明なので差分をいれてAC。

`3-1`を見る。ノードのConfig差分を見るとConfigがきれいに双子になっているのでConfig欠けはないと判断しルーティングを丁寧に見ていく。留意事項に対してはなにも作業が要らなかったがその考察を書くのに時間がかかった。ないことを証明するのは難しいと思いながら投げてAC。

少し得点したので`E2`に戻るがよく分からない。`E3`を見ると経路ハイジャック問題で手段を選ばなそうなので、現用では書かなそうなroute-mapを書いてAC。`E1`をみると前に見たことのあるl2vpn xconnectなのでMPLSだなと思い初手でldpを確認。LDPが確立していないのでldp autoするとACした。`E3`を解くときに経路集約を考えたのでそのまま`E2`に戻ると`advertise-only`のonlyの意味を考えていなかったことに気がつき消したらnull0がはいってくれてAC。aggregateしてdiscardを入れるか?をオプションで制御するのを考えたことがなかった。`E2`に150分くらい溶かした。もう数問眺める。`3-2`はISIS。苦手なので電車の中で見ることにしてshow系を保存してSKIP。`3-11`はどう見てもexplicit-path。問題の見た目からお楽しみ問題だったので最後に解くことにするSKIP。`3-4`はパケットダンプなのが見えたので、EIGRP Helloのhex dumpをまでとって翌日見ることにする。深夜にhex dumpを見てもあまり良いことがないだろうという判断をした。`E2`でハマりすぎたことに後悔しつつ2時くらいに寝る。

# day 0 1h + 2h + 4h
この日は9:30始業だったのでそれまで少し解く。
時間がないのでlv1を解く。`1-2`はvlan問題なのでdiffとってvlan差分をいれてAC(7min)。`1-3`も同じくvlanでdiffを取ってAC(5min)。`1-4`はログインと同時にk-value mismatchなのでmetricを入れるとAC(4min)。`1-6`はRTで"show route"すると経路がないのでstaticをいれて(7min)。`1-5`はOSPF典型なのでコストを触るとAC(5min)。`1-7`はshow routeすると経路がないので適切なstaticを書いてAC(7min)。`1-8`はetherchannelなのでdiffをとってそのままいれるとAC(7min)。`1-9`はSR-OSなのでなにも分からないと思いながらOSPF intをみるとloが入っていないので参考URLを見ながらOSPFを入れてAC(15min)。仕事をする。

新幹線移動のお昼休みを使って参加。酔うので手軽な問題を解きたい。崎陽軒のシウマイ弁当はおいしい。`1-10`はdiffを取るとpassiveが見えたので外してAC(4min)。`1-11`はdiffをとるとvlanが足りないのでいれてAC。`2-3`はlv2の3問目なので軽いかと思いつつちゃんとroute-mapをみないといけない。recvとadvをじっとにらむとおかしいroute-mapがあるので直してAC。`2-4`もルーティング問題なのでadvとrecvをじっとみるとhidden経路が明らかに見える。reasonをみるとmetric起因だからroute-mapで付けてAC。新幹線に酔いたくないので複雑な問題は解きたくないが、`3-9`はmultipathなので丁寧に`multipath-relax`を入れる。Linux側でFIBがLBしてくれなそうなので、あるあると思いながらsysctlで`fib_multipath_hash_policy=1`にしてAC。解いている途中、このコマンドをper packet ECMPだと思っていたが、per L4 flowだったことに気がつく。`3-10`はSpine-Leafで大好きなので解く。IP-CLOSっぽさと言うより順当にroutingを追うと解けた、AC。`2-7`はzone書き換えてAC(7min)。15minくらいお昼休みをオーバーしたのでこの後はしばらく発表のスライドと格闘していた。

新大阪から大阪会場に移動する最中に iPadでConfigを眺める怪しい人をしていた。`3-2`はとりあえずaddress familyいれてmetric入れればよさそう。`3-7`は検索するとSeirialローテーション典型なので`2^31-1`を頭に思い浮かべる。
会場が開いていなかったので近くで時間を潰しながらPCを開いてConfigを流す。`3-2`はいれたら通った、AC。`3-7`は1回目の伝搬は上手くいくのに2回目が伝搬しない。最初のSOAレコード的に3h待てば解決しないかなとおもってインスタンスを上げたまま発表へ向かう。後で分かったがこの判断は正解だった。普通だったら3h待てない。

発表が終わり京都へ向かう。阪急で座れたので手軽そうな問題を解く。`3-7`は寝かせたらレコード転送されていた。理由が全く分からない。首をかしげながら投げるとAC。結局なんだったんだ？`2-5`はルーティング典型っぽいのでMTUを合わせた後丁寧にroute-mapを書いてAC(20min)。ルーティングのroute-map系はすっきり解けるので気持ちが良い。`2-6`が問題設定が分からず方針に悩む。20min見て分からないのでSKIP。京都についた。

ホテルに移動してからお風呂に入ったりおやつを食べた。`2-11`は典型的にルーティングっぽいので丁寧に経路を追う。あんまり自分で0から書かないconfigだなと思いながら丁寧にroute-mapを書いてAC。問題が丁寧でハマらなかった。`2-8`は典型的なIPv6 peerのIPv4 NLRIなので設定をちゃんと確認してあげる。この題意設定であるあるなConfig欠けなので丁寧に直す。ext-community入れ忘れて少しハマった、AC(25min)。`2-9`がマルチポイントOSPF全く分からなくて90minくらい溶かす、SKIP。`3-3`はDHCPv6全く分からなくてgatewayの渡し方に悩む。pingが通ればいいよね、ということでルーティングプロトコルで解決してAC。明らかに嘘解法なので懺悔する。`2-10`は対向が見えないので質問を投げて寝る。`2-9`が夢に出そうだなと思いながら寝る。26時くらいまでやっていた。

# day1 3h + 30minくらい(現地)。
`2-9`は一晩経ったら方向性が分かったので検索する。そのままの図が出てきたのでshow ip ospf border-routersを打ってなるほどと思いながらospf multi-areaをうつ、AC(合計120minくらい)。`3-6`はRIPだ、と思い脊髄反射でno autoを入れたら解決しており問題点を把握せずにAC(5min)。`1-10`、EIGRPでdiffをとると見えるのでAC(5min)。そういえば`3-4`を解いていなかった、と思い出しINEを見ながらhex dumpを見る。src->dstを勘違いしており悩むがAC(合計120minくらい)。`3-5`は冗長系問題であり、問題文から前提がしっかりしていたので調べる前に片系を落としきったら解決した、これも原因が分かっていないがAC(5min)。明らかな片系の不良か、冗長化試験不備だろうとメタ読みした。`3-8`はaspath-filterのミスは誰もが一回はやるよねと思いながら直してAC。

考えないといけない問題が残ったので息抜きにお楽しみ問題の`3-11`を解く。こういう問題は楽しい。HeadEndでExplicit PathのLabelをpushする。explicit segment-listでLabelを付与する。楽勝！と思ったのだが、auto-routeが上手くいかず、経路がFIBに入らずハマった。Label付与がどうされるかの気持ちになると仮想I/Fにviaで転送したいのでstatic routeで指定できないか確認。まんまのvia sr-policy SR-TE_POLICYがあったので静的に焼いた、AC(60min)。

`2-6`は問題から読み解くゲームではなく、条件を満たせばいいゲームだと割り切ってallow loopsのような設定で強引に経路を学習させたが、題意を理解し切れておらず腑に落ちていない(合計80min)。`2-10`は対向見つからないのでcRPDの外側を探しに行ったりtcpdumpしたらpacketが見えたのでアドレスを適当に触った、AC。

現地着。14:30からの発表を聞きたいので30分勝負。`現地1`は新しい磨きツールに出会えた。`現地2`はDSCP値をTOSから求める問題かと思ったらそのままで良かった。`現地3`は現地っぽかった。`現地4`は大好きな伝送問題だった。解いてあり提出していない問題をすべて投げる。`現地5`は現地っぽい問題。`現地6`はsummary-onlyにするのではなくroute-mapしようとしてた。思い直してAC。`現地7`をshow runして頭が宇宙猫になった。Configを吸って退散。

懇親会に出てホテルに戻った。ここまでで残りは`現地7`。対向のConfigが分からないのでエスパーするしかない。ospfを張ったり、I/Fを落としたり、eBGP multihop変えたり、VRF route leakするConfigなどいくつかの種類を用意していくことにした。絶対解きたいのでそれぞれの切り戻し手順まで書いて丁寧に準備した。

# day2 (10min)
会場につき`現地7`を上から流す。eBGP multihopで通った。どうしてこういう挙動になるか分からず全完。


やったね。

# 反省
- `E2` は `advertise-only`を深く考えずにnull0経路が存在すると勘違いして時間を溶かした。分からないConfigに目を滑らせてはならない。深く反省。

- `3-11` HeadEndで`Explicit Candidate Path`を設定したが[3-11 公式解説](https://izuminmin.com/network/netcon55-ans3-11/)では`Automated Steering`で解いていた。こういう選択肢を知らないと方式が偏るんだよなと反省した。

- `現地7`はshow runから勝手にトポロジを類推しすぎた。現状を確認せよ。

# 参考: 3-11 - Explicit Candidate Path

https://izuminmin.com/network/netcon55-ans3-11/

と違い`Explicit Candidate Path`で解いたのでConfigメモ。

```
segment-routing
 traffic-eng
  segment-list SID_LIST
   index 10 mpls label 16002
   index 20 mpls label 16003
   index 30 mpls label 16004
   index 40 mpls label 16005
   index 50 mpls label 16001
   index 60 mpls label 16002
  !
  policy SR-TE_POLICY
   color 1 end-point ipv4 10.2.2.1
   autoroute
    metric constant 1
    include ipv4 all
   !
   candidate-paths
    preference 1
     explicit segment-list SID_LIST


router static
 address-family ipv4 unicast
  10.2.2.1/32 sr-policy SR-TE_POLICY
```

# 参考: 3-1 回答文面

https://izuminmin.com/network/netcon55-ans3-1/

はレポートが求められる問題だったので以下の通り回答しました。

```
申告のあった事象は、
1. 東京・大阪両方が両者の経路を広告していることにより、横渡回線が落ちていてもあるpeerが経路を吸い込み続けること
が問題でした。

対応としては、
1. 東阪で他方のprefixをoriginate(discard生成)することをやめた
を実施しました。

要件は達成しており、以下は制約条件の確認です。

- SV-01 ~ SV-02 の通信はインターネットを経由してはいけません。

私たちのネットワークではボーダールータにおいてEAST-WESTの経路受信をフィルタするようになっているため、これは気にしなくて良いです。以下の部分です。
> set policy-options prefix-list AS64500_EAST 192.0.2.0/24
> set policy-options prefix-list AS64500_WEST 203.0.113.0/24

- ISPと接続しているPeerルータは1台故障しても問題ないように設定してください。
の要件についてはこれらが仮想ルータであることから疑似が難しかったため、4台のボーダルータで
`deactivate protocol`を実施して擬似的な障害をエミュレートし通信に影響がないことを確認しています。

以上、よろしくお願いします。
```

# 参考: 3-8 手元メモ

大会中、すべての問題に対してこういうメモを書きながら解いています。解けないときに考察の誤りに気がつけたり見落としに気がつけます。

```
# RT1がなにもadvしていない問題について
- bgpテーブルにも存在しない
- サマライズが入っているのでRT2からサマリ対象が来ていない。RT1-RT2が悪い。
# RT2の何が悪い
- RT2が2.2.2.2しか広告していない。まずこれを解きたい。
- RT2の問題。BGP経路がない。show ip routeにdirectはある。BGP RIBにいれよう。
-------------
router bgp 65002
   redistribute connected
-------------

# RT1どう？
- /16がgenerateされた
RT-01#show bgp neighbors 192.168.1.2 received-routes
 >      10.2.0.0/16            192.168.1.2           -       -          -       -    
- でもRT3で受信していない。

# RT3みる
 RT-03# show bgp ipv4 uni neighbors 192.168.1.1 received-routes
   Network            Next Hop            Metric     LocPrf     Weight Path
* e10.1.0.0/16        192.168.1.1                                    0 65001 650
02 i
- 10.2.0.0/16どこいった？routemap?
- RT3
-------------
  neighbor 192.168.1.1
    remote-as 65001
    address-family ipv4 unicast
      route-map BGP-RT01-IN in
      route-map BGP-RT01-OUT out
      soft-reconfiguration inbound always
ip prefix-list AGGREGATE_ROUTE seq 5 permit 10.2.0.0/16
ip as-path access-list ASPATH-65001 seq 10 permit "^65001+$"
route-map BGP-RT01-IN permit 10
  match as-path ASPATH-65001
route-map BGP-RT01-OUT permit 10
  match ip address prefix-list AGGREGATE_ROUTE
-------------
あー...頑張ってほしい。
> ip as-path access-list ASPATH-65001 seq 10 permit "^65001.*$"

# 最終config
RT2
router bgp 65002
   redistribute connected

RT3
ip as-path access-list ASPATH-65001 seq 10 permit "^65001.*$"

# verify
(略)
```

# 参考: 賞状もらった
https://x.com/recuraki/status/1886771678791000146