ICTSC2020の予選にご参加いただいた皆様、お疲れ様でした。
本戦に出場が決定した皆様、おめでとうございます。本戦で存分に力を発揮してもらいたいと思います。
また、残念ながら本戦出場ラインに到達できなかった皆様はぜひ経験をバネとし、次回以降のICTSCにご応募いただければと思います。
今回出題した問題の問題文、及び問題解説を公開します。
過去の問題を解いた上で学習し、ぜひ今後の研鑽にご利用いただければと思います。
ICTSC2020の予選にご参加いただいた皆様、お疲れ様でした。
本戦に出場が決定した皆様、おめでとうございます。本戦で存分に力を発揮してもらいたいと思います。
また、残念ながら本戦出場ラインに到達できなかった皆様はぜひ経験をバネとし、次回以降のICTSCにご応募いただければと思います。
今回出題した問題の問題文、及び問題解説を公開します。
過去の問題を解いた上で学習し、ぜひ今後の研鑽にご利用いただければと思います。
ICTSC2019 本選に参加してくださった皆さん、お疲れ様でした!また、参加していただきありがとうございました!!
以下はICTSC2019 本選で出題した問題の各解説へのリンク集です。ICTSC2019 本選に参加していただいたみなさんの復習や、次回以降参加する方の参考になれば幸いです。
各問題の解説は順次投稿します。2020年 3/1 中に投稿を完了する予定です。
問題文は以下の通りでした。
OSPFを用いて4つのルータ間で経路交換をしていたが、RT1とRT2の設定を書き換えたらRT4に対してR1から疎通ができなくなってしまった。原因を究明し、RT1・RT2の設定を直して疎通ができる状態に復旧してほしい。また、なぜ疎通ができなくなってしまったのかをまとめてほしい。
RT3のコンフィグ
interfaces { ethernet eth0 { address 192.168.2.2/24 hw-id 9c:a3:ba:30:9d:2c } ethernet eth1 { address 192.168.3.1/24 hw-id 9c:a3:ba:30:12:7a } loopback lo { } } protocols { ospf { area 0 { network 192.168.2.0/24 } area 2 { network 192.168.3.0/24 } parameters { abr-type cisco router-id 10.1.1.3 } } } service { } system { config-management { commit-revisions 100 } console { device ttyS0 { speed 115200 } } host-name RT3 login { banner { post-login "_____ _____ _______ _____ _____ \n|_ _/ ____|__ __/ ____|/ ____|\n | || | | | | (___ | | \n | || | | | \\___ \\| | \n_| || |____ | | ____) | |____ \n|_____\\_____| |_| |_____/ \\_____|" } user ictsc { authentication { encrypted-password **************** plaintext-password **************** public-keys ictsc { key **************** type ssh-rsa } } } user user { authentication { encrypted-password **************** plaintext-password **************** } } user vyos { } } ntp { server 0.pool.ntp.org { } server 1.pool.ntp.org { } server 2.pool.ntp.org { } } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo }
RT4のコンフィグ
interfaces { ethernet eth0 { address 192.168.3.2/24 hw-id 9c:a3:ba:30:c5:0e } loopback lo { } } protocols { ospf { area 2 { network 192.168.3.0/24 } parameters { abr-type cisco router-id 10.1.1.4 } } } service { } system { config-management { commit-revisions 100 } console { device ttyS0 { speed 115200 } } host-name RT4 login { banner { post-login "_____ _____ _______ _____ _____ \n|_ _/ ____|__ __/ ____|/ ____|\n | || | | | | (___ | | \n | || | | | \\___ \\| | \n_| || |____ | | ____) | |____ \n|_____\\_____| |_| |_____/ \\_____|" } user ictsc { authentication { encrypted-password **************** plaintext-password **************** public-keys ictsc { key **************** type ssh-rsa } } } user user { authentication { encrypted-password **************** plaintext-password **************** } } user vyos { } } ntp { server 0.pool.ntp.org { } server 1.pool.ntp.org { } server 2.pool.ntp.org { } } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo }
RT1・RT2間、RT2・RT3間は疎通ができるが、RT4への疎通ができない。
原因を究明し、RT1からRT4への疎通ができる。
この障害が発生した原因は3つあります。
passive-interfaceがeth1に設定されている限りRT2へHelloパケットが送信されず、経路交換ができないのでこれを削除、もしくは再設定します。
以下eth0に再設定する場合の例
RT1#delete protocols ospf passive-interface eth1 RT1#set protocols ospf passive-interface eth0
重複してはいけないrouter-idがRT1、RT2ともに10.0.0.1で設定されてしまっていました。なので、これを重複しないように再設定します。
以下RT2のrouter-idを10.0.0.2に再設定する場合の例
RT2#set protocols ospf parameters router-id 10.1.1.2
RT3とRT4のコンフィグを参照すると、RT3-RT4間である192.168.3.0のセグメントがエリア2になっており、RT2-RT3の192.168.2.0のセグメントをエリア0(バックボーン)とするような設定になっています。しかし、RT1とRT2のコンフィグを参照すると、RT1-RT2間の192.168.1.0のセグメントがエリア0となっていて、RT2-RT3間の192.168.2.0のセグメントがエリア1になるような設定になっています。
そこで、前提条件にあるエリアはバックボーン含めて最低3つ用意する
というものを考慮し、RT1、RT2のエリア設定を変更します。
以下RT1-RT2間(192.168.1.0)をエリア1、RT2-RT3間(192.168.2.0)をエリア0とする設定例
RT1#delete protocols ospf area 0 RT1#set protocols ospf area 1 network 192.168.1.0/24
RT2#delete protocols ospf area 0 RT2#delete protocols ospf area 1 RT2#set protocols ospf area 0 network 192.168.2.0/24 RT2#set protocols ospf area 1 network 192.168.1.0/24
解説は以上です。
みなさんよくできていたので、正答率は比較的高いものとなっていました。
あまりに問題の意図を汲み取って解答を送ってくださるので採点していてすごく嬉しかったです。
また、すごく丁寧な解答も多くとても採点がしやすかったです。ありがとうございました。
問題文の前提条件にある直接sshして設定できるのはRT1・RT2のみ
という一文について、踏み台サーバから直接RT2へsshができるという誤解を招いてしまい、それに関する質問を複数受けました。ミスリードを招くような表現となってしまったことをこの場を借りて謝罪いたします。申し訳ございませんでした。
みなさまのおかげで非常に楽しく採点ができました。限られた時間の中問題を解いてくださりありがとうございます。
問題文は以下の通りでした。
DockerでシュッとWordpressを構築しようとしています。どうしてもdocker-compose.ymlで指定したホスト名でデータベースに接続したいのですが、うまく立ち上がりません。原因を特定して修正してください。
~/wordpress/docker-compose.ymlを用いてdocker-compose upするとwordpressのコンテナがデータベース接続エラーのログを残して立ち上がらない。
curl localhost:8000 -Lで正常に200レスポンスが返ってくる。
任意のホスト名でコンテナの名前解決を行うにはエイリアスの設定が必要です。
networks: default: aliases: - database
今回の問題では下記のようにymlを編集すればhostname:
で設定したホスト名でデータベースに接続可能です。
version: '3.3' services: db: # DO NOT CHANGE THIS LINE image: mysql:5.7 hostname: database # DO NOT CHANGE THIS LINE volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: 8MvAMcDAirP8 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: DDzk6ERU33Rc networks: default: aliases: - database wp: depends_on: - db image: wordpress:latest hostname: wordpress ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: database:3306 # DO NOT CHANGE THIS LINE WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: DDzk6ERU33Rc WORDPRESS_DB_NAME: wordpress volumes: db_data:
想定回答以外の方法でも、終了条件を満たしている場合は満点となります。下記2つ紹介します。
linksを使う解法です。
この方法は古く、将来的に廃止される可能性があるので推奨されていないようです。
https://docs.docker.jp/compose/networking.html#links
version: '3.3' services: db: # DO NOT CHANGE THIS LINE image: mysql:5.7 hostname: database # DO NOT CHANGE THIS LINE volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: 8MvAMcDAirP8 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: DDzk6ERU33Rc wp: depends_on: - db image: wordpress:latest hostname: wordpress ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: database:3306 # DO NOT CHANGE THIS LINE WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: DDzk6ERU33Rc WORDPRESS_DB_NAME: wordpress links: - "db:database" volumes: db_data:
container_nameを使う解法です。
version: '3.3' services: db: # DO NOT CHANGE THIS LINE container_name: database image: mysql:5.7 hostname: database # DO NOT CHANGE THIS LINE volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: 8MvAMcDAirP8 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: DDzk6ERU33Rc wp: depends_on: - db image: wordpress:latest hostname: wordpress ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: database:3306 # DO NOT CHANGE THIS LINE WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: DDzk6ERU33Rc WORDPRESS_DB_NAME: wordpress volumes: db_data:
いかがでしたか?
回答にあたっての制約が現実的なケースとはやや離れていたとは思いますが、楽しんでいただけたなら幸いです。
問題を解いていただきありがとうございました!
問題文は以下の通りでした。
docker-composeを使って,NetBoxを運用していました. 運用サーバに新しくインターフェースを追加したところ,NetBoxがうまく起動できなくなりました. 原因を調査して,修復してください.
ネットワーク図
docker-composeが起動できない
app0でdocker-composeを使い,アプリケーションが起動できる
踏み台サーバから開発環境(172.16.0.2)にsshを行います.
まず,docker-composeが起動できない原因を調査します.
sudo docker-compose up Creating network "netboxdocker_default" with the default driver ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
dockerが新しくネットワークを作ることができないために,起動できていなことがわかります.
ネットワークの状態を確認してみます.
ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 9c:a3:ba:30:b2:ed brd ff:ff:ff:ff:ff:ff inet 172.16.0.2/12 brd 172.31.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::9ea3:baff:fe30:b2ed/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 9c:a3:ba:30:72:7d brd ff:ff:ff:ff:ff:ff inet 192.168.0.2/12 brd 192.175.255.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::9ea3:baff:fe30:727d/64 scope link valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:fd:82:d0:b5 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever
docker0とeth0のPrefixが被っていることが確認できます.
以下のコマンドでdocker0を停止して,削除します.
sudo systemctl stop docker sudo ip link set dev docker0 down sudo brctl delbr docker0
次に,/etc/docker/daemon.json
を以下のように変更します.
{ "default-address-pools" : [ { "base" : "10.0.0.0/8", "size" : 24 } ] }
最後にdockerを起動します.
sudo systemctl start docker
docker0のIPを変更したので,docker networkを新しく作れるはずです.
sudo docker-compose down sudo docker-compose up -d
解説は以上です。
docker-compose up
でコンテナが起動できる.まず、問題の文章に不備があったことにお詫び申し上げます。失礼しました。
様々な解答をしていただき,勉強になりました.
想定していなかった解答方法としては,docker-compose.override.yaml
にIP Addressを追記する方法やdocker networkを予め作っておいて docker-compose.yaml
で使用している解答などがありました.
問題を解いていただき,ありがとうございました.
問題文は以下の通りでした。
AS65000、AS65001、AS65002に所属するルータを3つ作成し、これらのルータすべてからフルルートをAS65010宛てに流した。
しかし、なぜかAS65010に所属するルータで経路を受け取れない。経路を受け取れない原因を詳しくわかる範囲で説明してください。
BGPから経路を受け取れない
終了状態は採点には影響しません。
メモリ不足による原因で、vyosのBGPプロセス全体が停止し経路を受け取ることが出来なくなります。。
解決方法としては、ルータ側のメモリを増やすことで解決する問題です。
/var/log/messageを見ると
Sep 3 17:02:41 vyos kernel: [ 497.957860] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/vyos-router.service,task=bgpd,pid=872,uid=110 Sep 3 17:02:41 vyos kernel: [ 497.957951] Out of memory: Killed process 872 (bgpd) total-vm:948964kB, anon-rss:804420kB, file-rss:1596kB, shmem-rss:0kB, UID:110 pgtables:1704kB oom_score_adj:0
となっており、BGPプロセスがメモリ不足で止まっていることがわかります。
あまりにも外部から、経路広告されるとメモリがオーバーフローすることによりこのような現象が発生します。
解説は以上です。
想定していたよりも問題が解けなかったチームが多いように感じました。
という回答のチームが多く、本質であるメモリのオーバーフローに関する説明が少なかったです。
これを機にL1からネットワークに触れてほしいと思います!!