/

ICTSC2020の予選にご参加いただいた皆様、お疲れ様でした。

本戦に出場が決定した皆様、おめでとうございます。本戦で存分に力を発揮してもらいたいと思います。
また、残念ながら本戦出場ラインに到達できなかった皆様はぜひ経験をバネとし、次回以降のICTSCにご応募いただければと思います。

今回出題した問題の問題文、及び問題解説を公開します。
過去の問題を解いた上で学習し、ぜひ今後の研鑽にご利用いただければと思います。

ルーティング

networkが作成できない?

経路を受け取れない

繋がらなくなっちゃった!

またビルド失敗しちゃった~…

ウェブ

WEBページが見れない

コンテナ

どこからもアクセスできなくなっちゃった

hostnameでつながらない!!

ダイエットしようぜ!

データベース

備品は何処へ

プログラミング

jsonが壊れた!!

 /

ICTSC2019 本選に参加してくださった皆さん、お疲れ様でした!また、参加していただきありがとうございました!!

以下はICTSC2019 本選で出題した問題の各解説へのリンク集です。ICTSC2019 本選に参加していただいたみなさんの復習や、次回以降参加する方の参考になれば幸いです。

各問題の解説は順次投稿します。2020年 3/1 中に投稿を完了する予定です。

一日目

コンテナ

ウェブ

トンネリング

パケットフィルタ

ルーティング

データベース

メール

その他

二日目

コンテナ

トンネリング

パケットフィルタ

ルーティング

データベース

IPv6

その他

 /
カテゴリー

問題文

問題文は以下の通りでした。

OSPFを用いて4つのルータ間で経路交換をしていたが、RT1とRT2の設定を書き換えたらRT4に対してR1から疎通ができなくなってしまった。原因を究明し、RT1・RT2の設定を直して疎通ができる状態に復旧してほしい。また、なぜ疎通ができなくなってしまったのかをまとめてほしい。

Imgur

前提条件

  • 直接sshして設定できるのはRT1・RT2のみ
  • OSPFを用いて経路を学習する
  • エリアはバックボーン含めて最低3つ用意する

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つあります。

  • 本来OSPFで経路交換をすべきeth1にpassive-interfaceが設定されてしまっている
  • RT1とRT2でrouter-idが重複してしまっている
  • RT1・RT2のエリア設定が不適切

passive-interfaceの削除・再設定

passive-interfaceがeth1に設定されている限りRT2へHelloパケットが送信されず、経路交換ができないのでこれを削除、もしくは再設定します。

以下eth0に再設定する場合の例

RT1#delete protocols ospf passive-interface eth1
RT1#set protocols ospf passive-interface eth0

router-idの再設定

重複してはいけない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

解説は以上です。

採点基準

  1. RT1-RT4の疎通性を復旧: 50%
  2. トラブルが発生した原因上記3点を記述(部分点無し): 50%

解答について

みなさんよくできていたので、正答率は比較的高いものとなっていました。

あまりに問題の意図を汲み取って解答を送ってくださるので採点していてすごく嬉しかったです。

また、すごく丁寧な解答も多くとても採点がしやすかったです。ありがとうございました。

お詫び

問題文の前提条件にある直接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:

採点基準

  1. 終了状態を満たしている: 100%
    ※回答文が明らかに不適切な場合は0点となります。

講評

解答について

想定回答以外の方法でも、終了条件を満たしている場合は満点となります。下記2つ紹介します。

別解1

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:

別解2

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 

解説は以上です。

採点基準

  1. 発生している問題に関して報告できている(30%)
    • docker0とinterfaceのIPアドレス帯が被っていることに言及されている
  2. 問題への適切な解決方法が報告できている(70%)
    • /etc/docker/daemon.jsonを用いて,docker0のインターフェースのIPアドレスが変更されている
    • 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プロセスがメモリ不足で止まっていることがわかります。
あまりにも外部から、経路広告されるとメモリがオーバーフローすることによりこのような現象が発生します。

解説は以上です。

採点基準

  1. BGPのデーモンが停止してる: 30%
    • 最初はメモリオーバーフローを書いているかいないかの0か100でしたがそれでは差が出すぎるためこの項目で採点基準を緩くしました。
  2. 経路が多すぎて、メモリがオーバーフローしてる: 70%
    • こちらが本来の想定解答です。

講評

解答について

想定していたよりも問題が解けなかったチームが多いように感じました。

  • BGPの設定が抜けていた
  • TCPのコネクションが張れていないので、対向のルータ側の設定がおかしい

という回答のチームが多く、本質であるメモリのオーバーフローに関する説明が少なかったです。

終わりに

これを機にL1からネットワークに触れてほしいと思います!!