ICTSC2022参加記
概要
初めましてごっちです。3/4,5で行われたICTSC2022(トラコン)に、結束baudというチームで参加しました[^baud]。MMAと工学研究部の人で構成されています[^mma-koken]。たぶんチーム全員が初参加で、結果は3位でした。
メンバーのnakanokurenaiさんの参加記はこれです。難しい問題をめちゃくちゃ解いてくれてました。感謝。
解いた問題
1日目
gwe
サーバにFRRをインストールして、IPv6のアドレスをSLAACでもDHCPv6でもいいからクライアントに配布すればいいらしいです。
FRRはdockerイメージが配布されてるのでこれを使いました。ビルドめんどいので。FRRのドキュメントを参考にRAで広報してやれば解けました。
mzr
IPv6閉域網の折り返し通信でGREトンネルを張ってその上でBGPのピアリングをするどこかでみた構成です。相手がBGPで広報している経路にトンネルの接続に使う対向アドレスが入っており、BGPが確立して経路がインポートされるとGREトンネルのカプセル化された通信がGREトンネルを通ろうとするので対向への通信ができなくなります。ちなみにこのとき下のようなログが記録されます。
kernel: ip6_tunnel: tun1: Local routing loop detected!
トンネルを張るための対向への通信が
eth1
を通って出るようにより優先される(マスクの長い)スタティックルートを設定すればよさそうですが、制約に新たにスタティックルートを設定してはならないとあります。Linuxにはルーティングテーブルを複数使い分けるVRFという機能があるので、これを使ってBGPとトンネルの経路を分けるのかなと思いつつこの問題から逃げて後回しにすることにしました。ちなみにスタティックルートを指定した嘘解法を出してみたら0点でした。uct
何故かapplyが通らないk8sのマニフェストが渡されます。リソースの名前にw,x,yとか1文字が使われていました。
エラーメッセージをggると、なんとyamlでは
y
は予約語でtrue
とかと同じboolらしいです。このためname: y
がパースできずコケているようです。name: "y"
とするとapplyできます。一度これで満足して提出しまったのですが、まだingressへアクセスできない問題がありました。これはnginx ingressをkindのaddonから入れてやると解決しました。
lty
sudoでrootになったあとに
cd /
するとrestrictedとか出てcdさせてくれません。ggるとrbashというのが存在し、bashの機能を制限できるらしいです。chshでデフォルトシェルをbashにすると解けました。
vzx
2台のホストの間に1台のルータが存在しており、Host01→Router→Host02へのpingが通らないらしいです。
Routerには
ETH1-OUT
というFWがありTCP以外dropしています。ICMPも追加しましょう。またHost01にはHost02への経路が設定されておらず別のIFのデフォルトルートを使うようになっています。静的経路を追加すればpingが通るようになります。avu
k8sで動かしているnginxが動かないので直してほしいとのことです。これはcephのosdが全てコケているからです。
これと格闘していると1日目が終わっていました。何もわからん。2日目にチームメンバーに投げたところ無事解いて頂けました。
2日目
Beer
前回問題をパラパラ見て簡単そうだったBeerから取り掛かることにしました。FRRの設定をして対向とBGPピアを張るだけです。
FRRは
no bgp ebgp-requires-policy
という呪文を付けないと経路がインポートされないのでこれを忘れなければ問題なく接続できます。omu
ルータ3台にFRRを入れてOSPFの設定を直していい感じにしてとのことです。
router-id
の重複、不適切なufwの設定、必要のない静的経路が設定されていることが原因でした。この問題ではOSPFの設定を変えたあとにclear ip ospf process
を叩くとOSPFで経路を広報してくれなくなる問題が何故か起きており、かなり時間を使いました。clear ip ospf process
を絶対に叩かないようにするか、IFのIPアドレスを外したり付けたりすれば広報してくれました、よくわかりません。あとマシンを再起動すれば広報してくれたらしいです。なお自分は静的経路について回答に書き忘れており、175/250ptと部分点になっていました。気づいたnakanokurenaiさんに直してもらえました。感謝。mzr
昨日VRFかなとは思っていたので嘘解法ではなく頑張ってVRFでやることにします。BGPから入ってくる経路とトンネル接続に使う情報が入っている経路を別のテーブルに入れさえすれば
ip rule
で使うテーブルを切り替えれば済みます。BGPの経路はデフォルトのテーブルに入れて、トンネル接続に使うeth1
を適当なVRFに入れる方針でやることにします。しかしeth1
をVRFに所属させるとVRFじゃないtun1
がeth1
を使ってくれず3時間格闘しました。ほかの問題は全てチームメンバーが解いてくれており、これさえ解ければ全完という状況でした。しかしVRFは動かず、競技時間残り10分ぐらいで今度は別の嘘解法に逃げることにしました。BGPから経路受けとる際に経路フィルタ(route-map)を使い、問題を起こしている経路を破棄する方法です。この嘘解法は本当にギリギリ(16:29:22に提出、締切は16:30)に完成して提出できました。競技終了後しばらくお祈りしていたのですが、お情けで180/250ptを頂きました、運営の方ありがとう……:pray:まとめ
私がやっていたmzrが結局解けずにチームの全完を逃してしまったのが本当に悔しかったです。VRFは名前は知ってるけどまともに触ったことがない技術の筆頭だったので来年のICTSCはVRF筋を鍛えて出直してきます。しかし結果として3位を頂けたのはとても嬉しかったです。私はネットワーク問に主に対応していて、他にも難しい問題はいろいろあったのですがチームメンバーが解いてくれてました、感謝……:pray:。
ICTSCは初めてだったのですが、一度触ったことあればそこで躓くのあるあるだよねという問題(omu)から、そんなことあるんだって笑ってしまう問題(uct, lty)、方針はいくつか立てられても難しい問題(mzr)など色々な種類の問題がありとても楽しいコンテストでした。運営の方々ありがとうございました。
[^baud]: ぼっち・ざ・ろっくを見てください[^mma-koken]: MMA3人工研3人の5人です。