# ICTSC2020 本戦 https://contest.ictsc.net/problems チーム名: elab パスワード: 7KT3rMucFc [TOC] ## 事前作業 ### 踏み台サーバにssh-copy-id パスワードログインは面倒なので鍵を登録してしまう(?) パスワードログイン: `7KT3rMucFc` `ssh user@103.202.216.16 -p 20008` ## 鍵一覧 ``` ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHrWpQSq+z1Rb19+cPS+nuQAYWwl7I/IHILDuCkfXDoK akky.supernova@gmail.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoTMt6Hnr/7o6pAueCEEgmA84aXAMSkatzuChQLkqurBADrPmo4DlXWJKnH6muRN5pWy2ym0jAMQKo4xq+wEve2mCtT8K9Us/6Y9+jAsdaSJquCEq3HOhwsKdX6Tj1yi9w3TP+hA34qaZgpjf421XoTM15ivYTiScc2yCw3m92u577H0f4q54GCr+SopAL9QoPYOyNcJKluBj2pf9zHZG10GNi4dp+81tq/1bT2cKB1rD4omUsbVsIDYjUUBFH0o3o6l6eo19MMe81zMwMQ6i+A8VyxIOExNRdBG1ckSE0hKn3KIHudK40di6Z82MSkVWyxJKW7OQBtZO4qRnR9ON9 hyuga@hyuga-SP3 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDIwe8kFMjPx+DWRsFwXyz0aybPpYno/B52FS0O+wr7O hide@hide-H5-CML ``` ## テンプレ ``` お世話になっております。〇〇です。 この問題ではxxxxxが原因でトラブルが発生したと考えられました。 そのため、以下のように設定を変更し、○○が正しく動くことを確認いたしました。 確認のほどよろしくお願いします。 ## 手順 ### 1. /etc/hoge/hoo.bar の編集 ``` # 2日目 ## それなんて読むの?(10) ## あれ、、、おかしい(100) お世話になっております。elabです。 Client, R1, R2からのはじめの経路は以下のとおりでした。 - Client->R1->192.168.22.62->...->胡散臭いサーバ - R1->192.168.22.62->...->胡散臭いサーバ - R2->R1->192.168.22.62->...->胡散臭いサーバ どれも192.168.22.62/30を通るが、そこでよくパケットが落ちるので、192.168.22.54/30経由で胡散臭いASに接続します。 そこで、static routeをR1, R2に設定し、経路を以下のように変更します。 - Client->R1->R2->192.168.22.54->...->胡散臭いサーバ - R1->R2->192.168.22.54->...->胡散臭いサーバ - R2->192.168.22.54->...->胡散臭いサーバ clientから`192.168.22.54` にpingを飛ばすと,行きは必ず下の専用線で行くが,帰りは上の専用線経由で echo replyが返ってくる しかも不安定 ## いつの間にか復活している君 (50) masao 回答: ``` お世話になっております.チームelabです. この問題では Docker Engine のサービスの自動起動が無効化されていることが原因でトラブルが発生したと考えられます. そのため,以下のように設定を変更し,再起動後に自動で Docker 上で動く nginx が正常に起動することを確認しました. 確認のほどよろしくお願いいたします. ## 手順 ### 1. docker.service を enable する `sudo systemctl enable docker` により `docker.service` の自動起動を有効化. ### 2. 再起動して確認 `sudo reboot` より再起動後,しばらくして自動で踏み台から `curl -I 192.168.17.1` してレスポンスコードが正常であることを確認. ``` ## Webサーバーに繋がらない! (50) hyuga ``` お世話になっております。elabです。 この問題では apparmorの設定 ゾーンファイルの問題 ことが原因でトラブルが発生したと考えられました。 そのため、以下のように設定を変更し、DNSが正しく動くことを確認いたしました。 確認のほどよろしくお願いします。 apparmorの設定変更 ログを確認すると /etc/bind/managed-keys.bind.jnl の作成に,permission denied のエラーで失敗していることがわかります. /etc/bind のパーミッションを確認すると,bindユーザに書き込み権限を持っているため単純なパーミッションのエラーでないことがわかります. そこでapparmarの設定を疑います. 現在の設定を確認すると,named に関して設定されていることがわかります. $ apparmor_status ... 3 processes are in enforce mode. /usr/sbin/chronyd (488) /usr/sbin/chronyd (490) /usr/sbin/named (750) ... 設定ファイル /etc/apparmor.d/usr.sbin.named を確認すると,/etc/bind/* は読み取り権限のみが設定されており,書き込み権限は設定されていないことがわかります. したがって,/etc/apparmor.d/usr.sbin.named を編集して書き込み権限を追加します. - /etc/bind/** r, + /etc/bind/** rw, 変更を適用します. # apparmor_parser -r /etc/apparmor.d/usr.sbin.named namedを再起動して,エラーが起きていないことを確認します. # systemctl restart named ゾーンファイルの編集 NSレコードの修正 NSレコードの名前の指定において末尾のピリオドが存在しないので /etc/bind/ex.zone を以下のように修正します. - IN NS ns.example.com + IN NS ns.example.com. wwwレコードの追加 webレコードは存在していますが,wwwレコードが存在していないので追加します. /etc/bind/ex.zoneに以下の行を追加します. + www IN A 192.168.8.1 変更を適用します # rndc reload 確認 digコマンドで「www.example.com」「ns.example.com」が名前解決できる。 DNSサーバから確認 root@jnn-dns:/etc/bind# dig www.example.com +short 192.168.8.1 root@jnn-dns:/etc/bind# dig ns.example.com +short 192.168.8.2 Webサーバから確認 user@jnn-web:~$ dig www.example.com +short 192.168.8.1 user@jnn-web:~$ dig ns.example.com +short 192.168.8.2 systemctlコマンドでbindが正常に起動でき、systemctlコマンドのstatusオプションを用いて正常に起動していることを確認できる。 root@jnn-dns:/etc/bind# systemctl status named ● named.service - BIND Domain Name Server Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-03-07 12:21:35 JST; 21min ago Docs: man:named(8) Main PID: 750 (named) Tasks: 5 (limit: 1168) Memory: 15.3M CGroup: /system.slice/named.service └─750 /usr/sbin/named -f -u bind -4 Mar 07 12:40:44 jnn-dns named[750]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA Mar 07 12:40:44 jnn-dns named[750]: automatic empty zone: EMPTY.AS112.ARPA Mar 07 12:40:44 jnn-dns named[750]: automatic empty zone: HOME.ARPA Mar 07 12:40:44 jnn-dns named[750]: none:100: 'max-cache-size 90%' - setting to 883MB (out of 981MB) Mar 07 12:40:44 jnn-dns named[750]: configuring command channel from '/etc/bind/rndc.key' Mar 07 12:40:44 jnn-dns named[750]: reloading configuration succeeded Mar 07 12:40:44 jnn-dns named[750]: reloading zones succeeded Mar 07 12:40:44 jnn-dns named[750]: all zones loaded Mar 07 12:40:44 jnn-dns named[750]: running Mar 07 12:40:44 jnn-dns named[750]: managed-keys-zone: Key 20326 for zone . is now trusted (acceptance timer complete) エラーメッセージがなくなっていることが確認できます. システム再起動時にbindが自動的に立ち上がる。 再起動後に systemctl status named が正常であることを確認しました. 以上よろしくお願いいたします. ``` ## Server Sent Eventsが動作しない‼ (50) masao 回答: ``` お世話になっております.チームelabです. この問題では `/etc/nginx/nginx.conf` におけるリバースプロキシの設定で `proxy_buffering` が `on` になっていたことが原因でトラブルが発生したと考えられます. そのため,以下のように設定を変更し,正しくリバースプロキシ上で SSE が動作することを確認しました. 確認のほどよろしくお願いいたします. ## 手順 ### 1. `/etc/nginx/nginx.conf` の `proxy_buffering` の設定を変更 `proxy_buffering on;` から `proxy_buffering off;` へ変更 ### 2. nginx の再起動 `sudo systemctl restart nginx` により nginx を再起動 ``` ## このOpenstackなんか変だよぉ…(100) shin - ~~クソ問題か…?~~ - configファイル内にUnicode文字が(コメントであっても)含まれるとコンフィグパーサでエラーが出る…? - 日本語消せ ### 回答 お世話になっております。elabです。 この問題では`cinder.conf`にUnicode文字が含まれていることが原因でトラブルが発生したと考えられました。 そのため、以下のように設定ファイルを変更し、Cinder volumeコマンドが正しく動くことを確認いたしました。 確認のほどよろしくお願いします。 #### 手順 ##### 0. エラーの確認 ```bash root@vm1 user(keystone)# openstack volume list Internal Server Error (HTTP 500) ``` このとき`/var/log/apache2/cinder_error.log`にコンフィグ変換時のASCIIコードに関するエラーが発生している ``` tail -f /var/log/apache2/cinder_error.log 2021-03-07 13:23:19.610890 return self._parse_config_files() 2021-03-07 13:23:19.610901 File "/usr/lib/python3/dist-packages/oslo_config/cfg.py", line 2919, in _parse_config_files 2021-03-07 13:23:19.610907 ConfigParser._parse_file(config_file, namespace) 2021-03-07 13:23:19.610918 File "/usr/lib/python3/dist-packages/oslo_config/cfg.py", line 1604, in _parse_file 2021-03-07 13:23:19.610924 parser.parse() 2021-03-07 13:23:19.610934 File "/usr/lib/python3/dist-packages/oslo_config/cfg.py", line 1559, in parse 2021-03-07 13:23:19.610940 return super(ConfigParser, self).parse(f.readlines()) 2021-03-07 13:23:19.610951 File "/usr/lib/python3.8/encodings/ascii.py", line 26, in decode 2021-03-07 13:23:19.610956 return codecs.ascii_decode(input, self.errors)[0] 2021-03-07 13:23:19.610983 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 12: ordinal not in range(128) ``` ##### 1. `/etc/cinder/cinder.conf`の編集 - コンフィグファイルからUnicode文字(日本語)を削除する ```/etc/cinder/cinder.conf [DEFAULT] #---------------------------------------- # Change: change comment # team: elab #---------------------------------------- # Set host ip-addr my_ip = 192.168.9.1 rootwrap_config = /etc/cinder/rootwrap.conf api_paste_confg = /etc/cinder/api-paste.ini state_path = /var/lib/cinder auth_strategy = keystone #---------------------------------------- # Change: change comment # team: elab #---------------------------------------- # Set RabbitMQ info transport_url = rabbit://openstack:password@192.168.9.1 enable_v3_api = True #---------------------------------------- # Change: change comment # team: elab #---------------------------------------- # Set Glance server glance_api_servers = http://192.168.9.1:9292 #---------------------------------------- # Change: change comment # team: elab #---------------------------------------- # This value can be empty enabled_backends = lvm #---------------------------------------- # Change: change comment # team: elab #---------------------------------------- # Set MariaDB info [database] connection = mysql+pymysql://cinder:password@192.168.9.1/cinder #---------------------------------------- # Change: change comment # team: elab #---------------------------------------- # Set Keystone auth info [keystone_authtoken] www_authenticate_uri = http://192.168.9.1:5000 auth_url = http://192.168.9.1:5000 memcached_servers = 192.168.9.1:11211 auth_type = password project_domain_name = default user_domain_name = default project_name = service username = cinder password = servicepassword [oslo_concurrency] lock_path = $state_path/tmp [lvm] target_helper = tgtadm target_protocol = iscsi target_ip_address = 192.168.9.1 volume_group = cinder-volumes volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver volumes_dir = $state_path/volumes ``` ##### 2. 動作確認 ```bash openstack volume list # (なにも表示されない) ``` ```bash openstack volume service list +------------------+---------+------+---------+-------+----------------------------+ | Binary | Host | Zone | Status | State | Updated At | +------------------+---------+------+---------+-------+----------------------------+ | cinder-scheduler | vm1 | nova | enabled | up | 2021-03-07T04:45:25.000000 | | cinder-volume | vm1@lvm | nova | enabled | up | 2021-03-07T04:45:26.000000 | +------------------+---------+------+---------+-------+----------------------------+ ``` ## ??? ## DNSサーバを作りたかったらしい (50) hyuga ``` お世話になっております。elabです。 この問題ではslaveのゾーンファイルの場所が重複していることが原因でトラブルが発生したと考えられました。 そのため、以下のように設定を変更し、slaveのDNS serverが正しく動くことを確認いたしました。 確認のほどよろしくお願いします。 ## ゾーンファイルの場所の重複 ### 問題の確認方法 以下のコマンドで設定ファイルを検証します root@ns02:/etc/bind# named-checkconf named.conf /etc/bind/named.conf.prob:72: writeable file '/var/lib/bind/prob.final.ictsc.net': already in use: /etc/bind/named.conf.prob:36 /etc/bind/named.conf.prob:81: writeable file '/var/lib/bind/alice.prob.final.ictsc.net': already in use: /etc/bind/named.conf.prob:43 /etc/bind/named.conf.prob:87: writeable file '/var/lib/bind/text.prob.final.ictsc.net': already in use: /etc/bind/named.conf.prob:48 /etc/bind/named.conf.prob:93: writeable file '/var/lib/bind/tower.prob.final.ictsc.net': already in use: /etc/bind/named.conf.prob:53 /etc/bind/named.conf.prob:99: writeable file '/var/lib/bind/home.prob.final.ictsc.net': already in use: /etc/bind/named.conf.prob:58 /etc/bind/named.conf.prob:105: writeable file '/var/lib/bind/study.prob.final.ictsc.net': already in use: /etc/bind/named.conf.prob:63 view "internal" と view "external" でゾーンファイルの場所が重複していることがわかるので,以下のように修正します. 修正方法 named.conf の修正 /etc/bind/named.conf.probを以下のように編集します.以下はdiffになります. diff --git a/named.conf.prob b/named.conf.prob index d192fd2..0b36610 100644 --- a/named.conf.prob +++ b/named.conf.prob @ -27,40 +27,40 @@ view "internal" { recursion yes; zone "18.168.192.in-addr.arpa" { type slave; file "/var/lib/bind/18.168.192.in-addr.arpa"; file "/var/lib/bind/internal/18.168.192.in-addr.arpa"; masters { 192.168.18.1; }; allow-query { any; }; }; zone "prob.final.ictsc.net" in { type slave; - file "/var/lib/bind/prob.final.ictsc.net"; + file "/var/lib/bind/internal/prob.final.ictsc.net"; masters { 192.168.18.1; }; allow-query { any; }; allow-notify { 192.168.18.1; }; }; zone "alice.prob.final.ictsc.net" in { type slave; - file "/var/lib/bind/galice.prob.final.ictsc.net"; + file "/var/lib/bind/internal/alice.prob.final.ictsc.net"; masters { 192.168.18.1; }; }; zone "text.prob.final.ictsc.net" in { type slave; - file "/var/lib/bind/gtext.prob.final.ictsc.net"; + file "/var/lib/bind/internal/text.prob.final.ictsc.net"; masters { 192.168.18.1; }; }; zone "tower.prob.final.ictsc.net" in { type slave; - file "/var/lib/bind/gtower.prob.final.ictsc.net"; + file "/var/lib/bind/internal/tower.prob.final.ictsc.net"; masters { 192.168.18.1; }; }; zone "home.prob.final.ictsc.net" in { type slave; - file "/var/lib/bind/ghome.prob.final.ictsc.net"; + file "/var/lib/bind/internal/home.prob.final.ictsc.net"; masters { 192.168.18.1; }; }; zone "study.prob.final.ictsc.net" in { type slave; - file "/var/lib/bind/gstudy.prob.final.ictsc.net"; + file "/var/lib/bind/internal/study.prob.final.ictsc.net"; masters { 192.168.18.1; }; }; }; bindの起動 以下のコマンドでbindを起動します. /etc/init.d/bind9 start 確認 digコマンドにより正しく名前解決ができるようになっていることを確認します. root@ns02:/etc/bind# dig @localhost red.prob.final.ictsc.net ; <<>> DiG 9.11.3-1ubuntu1.14-Ubuntu <<>> @localhost red.prob.final.ictsc.net ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26453 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 82816ab07daed6535249e2196044369901eb6fb236e81b45 (good) ;; QUESTION SECTION: ;red.prob.final.ictsc.net. IN A ;; ANSWER SECTION: red.prob.final.ictsc.net. 300 IN A 192.168.18.1 ;; AUTHORITY SECTION: prob.final.ictsc.net. 300 IN NS blue.prob.final.ictsc.net. prob.final.ictsc.net. 300 IN NS red.prob.final.ictsc.net. ;; ADDITIONAL SECTION: blue.prob.final.ictsc.net. 300 IN A 192.168.18.2 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Mar 07 02:12:41 UTC 2021 ;; MSG SIZE rcvd: 146 以上よろしくお願いいたします. ``` ## インターネット壊れた (50) hyuga R1-R2間の疎通がないので、BGPでの経路交換が出来ないのが問題 static routeを設定すれば簡単にできるが、動的経路制御を使えとのこと OSPFでうまくR1-R2で経路交換する ## docker-mailman (50) (hide) お世話になっております。elabです。 まず、dockerコマンドがuserから使えなかったので、dockerグループにuserを追加します。 dockerグループが存在しない場合は作成しますが、本環境では既に存在したので、作成せずにグループに追加します。そしてnewgrpコマンドでグループの設定をuserに適用します。 ``` sudo usermod -aG docker $USER newgrp docker ``` 次に、コンフィグを置くディレクトリを作ります。 ``` mkdir -p /opt/mailman/core mkdir -p /opt/mailman/web ``` 次に、mailman-webの8000/tcpポートを公開するための設定とSECRET_KEY・UWSGI_STATIC_MAPの設定を加えます。 ``` user@docker-mailman-vm:~/docker-mailman$ cat docker-compose.yaml version: '2' services: mailman-core: image: maxking/mailman-core:0.3 container_name: mailman-core hostname: mailman-core volumes: - /opt/mailman/core:/opt/mailman/ stop_grace_period: 30s links: - database:database depends_on: - database environment: - DATABASE_URL=postgres://mailman:mailmanpass@database/mailmandb - DATABASE_TYPE=postgres - DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase - HYPERKITTY_API_KEY=lCTSC2020 networks: mailman: ipv4_address: 172.19.199.2 mailman-web: image: maxking/mailman-web:0.3 container_name: mailman-web hostname: mailman-web depends_on: - database links: - mailman-core:mailman-core - database:database volumes: - /opt/mailman/web:/opt/mailman-web-data environment: - DATABASE_TYPE=postgres - DATABASE_URL=postgres://mailman:mailmanpass@database/mailmandb - HYPERKITTY_API_KEY=ICTSC2020 - SECRET_KEY=ICTSC2020 - UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static ports: - 8000:8000 networks: mailman: ipv4_address: 172.19.199.3 database: environment: POSTGRES_DB: mailmandb POSTGRES_USER: mailman POSTGRES_PASSWORD: mailmanpass image: postgres:9.6-alpine volumes: - /opt/mailman/database:/var/lib/postgresql/data networks: mailman: ipv4_address: 172.19.199.4 networks: mailman: driver: bridge ipam: driver: default config: - subnet: 172.19.199.0/24 ``` 最後にdocker-composeで起動します。 docker-compose up 手元のPCからダイナミックフォワードした上で、ブラウザからSOCKSプロキシを利用してhttp://172.19.199.3:8000にアクセスすると、webページが見れます。 ## リバースプロキシが動かない (50) masao 実環境のドメイン名 `gwn.2020-final.ictsc.net` 原因1: `ssl-default-bind-ciphers` に謎の改行 原因2: mozilla SSL Configuration Generator の HAProxy のバージョンがおかしい (`ssl-default-bind-ciphersuites` はない) 原因3: haproxy に与える証明書に秘密鍵が含まれていない 原因4: haproxy に与える証明書にCA証明書が含まれていない `cat server.pem chain.pem server.key > haproxy.pem` 原因5: `acl is_gwn_local hdr_end(host) -i ictsc.net` に変更 ``` お世話になっております.チームelabです. この問題では以下の原因でプロキシが正常に動作していませんでした. そのため,以下のように設定を変更し,設定変更後踏み台サーバから正しくことを確認しました. 確認のほどよろしくお願いいたします. ## 原因と修正 ### 1. `ssl-default-bind-ciphers` に謎の改行がある `ssl-default-bind-ciphers` の文中に謎の改行があったため取り除きました. ### 2. mozilla SSL Configuration Generator の HAProxy のバージョンがおかしい TLS関連の設定を生成する mozilla SSL Configuration Generator に与える HAProxy のバージョンに誤りが合ったため,正しいバージョン (1.8.8) を与えて生成し直しました. 該当バージョンに `ssl-default-bind-ciphersuites` はなかったため削除しました. ### 3. HAProxy に与える証明書に秘密鍵・CA証明書が含まれていない HAProxy に与える証明書に秘密鍵・CA証明書が含まれていなかったため含めるようにしました. また,HAProxy に与える証明書ファイルの所有者とグループを `haproxy` としました. ### 4. `frontend` セクションの `acl` に誤りがある HAProxy の設定の `frontend` セクションに誤りがあったため,`acl is_gwn_local hdr_end(host) -i ictsc.net` に変更しました. ### 5. 踏み台からの疎通確認 `curl https://gwn.2020-final.ictsc.net` によりページが表示されることを確認しました. ``` ## なぜか動きません! (50) masao 解答 ``` お世話になっております.チームelabです. この問題では `docker-compose.yml` 及び `Dockerfile` で指定されたイメージのアーキテクチャが誤っていたこと,及び`Dockerfile` 内に全角スペースが入っていたこと,また MariaDB にて接続用パスワード/パスワードレスの設定が行われていなかったことが原因でトラブルが発生したと考えられます. そのため,以下のように設定を変更し,再起動後に自動で docker-compose で定義された nginx 及び MariaDB が正常に起動することを確認しました. 確認のほどよろしくお願いいたします. ## 手順 ### 1. `Dockerfile` 内の全角スペースを削除 `FROM` ディレクティブの隣に全角スペースがあったため,削除して半角スペースにした. ### 2. `Dockerfile` 及び `docker-compose.yml` 内のイメージを正しいアーキテクチャのものに修正 `Dockerfile` 及び `docker-compose.yml` で指定されていたイメージのアーキテクチャが誤っていたため,`x86_64 (amd64)` のものに変更した. ### 3. MariaDB にパスワードレス接続を許可する設定を追加 `docker-compose.yml` の `environment` に `MYSQL_ALLOW_EMPTY_PASSWORD=yes` を追加 ### (4. `docker-compose.yml` に `ports` を追加) 念のため疎通を確認するためにローカルマシンの `127.0.0.1` へのポートバインドを追加. ``` ## 証明書の取得が出来ない!! (100) hide ## Nginxが展開できない (50) ☓~~akky~~ #### 怪しい点 - kubernetesで永続ストレージの確保が上手くいっていない - ``` user@kzz-k8s-master:~$ kubectl get po NAME READY STATUS RESTARTS AGE nginx-deployment-64c5ffb9fd-666ct 0/1 Pending 0 6d16h nginx-deployment-64c5ffb9fd-vgsdz 0/1 Pending 0 6d16h nginx-deployment-64c5ffb9fd-wfcqf 0/1 Pending 0 6d16h user@kzz-k8s-master:~$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d18h nginx LoadBalancer 10.104.33.237 192.168.12.100 80:31343/TCP 6d16h ``` ``` user@kzz-k8s-master:~$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 0/3 3 0 6d16h kubectl describe pod nginx-deployment-64c5ffb9fd-666ct Name: nginx-deployment-64c5ffb9fd-666ct Namespace: default Priority: 0 Node: <none> Labels: app=nginx pod-template-hash=64c5ffb9fd Annotations: <none> Status: Pending IP: IPs: <none> Controlled By: ReplicaSet/nginx-deployment-64c5ffb9fd Containers: nginx: Image: nginx:1.7.9 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: /usr/share/nginx/html from nginx-data (rw) /var/run/secrets/kubernetes.io/serviceaccount from default-token-8jgmm (ro) Conditions: Type Status PodScheduled False Volumes: nginx-data: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: cephfs-pvc ReadOnly: false default-token-8jgmm: Type: Secret (a volume populated by a Secret) SecretName: default-token-8jgmm Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 3m43s (x559 over 11h) default-scheduler 0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims. ``` ``` $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cephfs-pvc Pending csi-cephfs 6d16h $ kubectl describe pvc cephfs-pvc Name: cephfs-pvc Namespace: default StorageClass: csi-cephfs Status: Pending Volume: Labels: <none> Annotations: volume.beta.kubernetes.io/storage-provisioner: rook-ceph.cephfs.csi.ceph.com Finalizers: [kubernetes.io/pvc-protection] Capacity: Access Modes: VolumeMode: Filesystem Used By: nginx-deployment-64c5ffb9fd-666ct nginx-deployment-64c5ffb9fd-vgsdz nginx-deployment-64c5ffb9fd-wfcqf Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ExternalProvisioning 3m23s (x2741 over 11h) persistentvolume-controller waiting for a volume to be created, either by external provisioner "rook-ceph.cephfs.csi.ceph.com" or manually created by system administrator Normal Provisioning 1s (x146 over 11h) rook-ceph.cephfs.csi.ceph.com_csi-cephfsplugin-provisioner-558b4777b-bbk6z_2090b12f-f41f-482f-bf01-250f5f93ac72 External provisioner is provisioning volume for claim "default/cephfs-pvc" ``` # 1日目 ## ボク わるいフレームワークじゃないよ(50) hyuga https://deep-blog.jp/engineer/4287/ ``` お世話になっております。elabです。 この問題ではDjangoのallowed hostsが原因でトラブルが発生したと考えられました。 そのため、以下のように設定を変更し、正しく動くことを確認いたしました。 確認のほどよろしくお願いします。 # ALLOWED_HOST の追加 Djangoの設定ファイルである `/home/user/ictsc/ictsc/settings.py` を以下のように編集し,`192.168.7.2` からの通信を許可します -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ['192.168.7.2'] 保存すると自動で再読込が行われ,設定が反映されます. # 確認 以下のコマンドで確認を行います. user@vm:~/ictsc/ictsc$ curl http://192.168.7.2:8000/message/ 以下のメッセージが得られます. Excellent!! If you're able to see this, report back now!! ``` ## あれ、、、おかしい(100) ## とんとんとんねる(100) ~~akky~~ <!-- `gNodeB`から`192.168.21.50`にpingを飛ばすと,`gtptun@gNodeB`からecho request が飛んでいるっぽい 確かに,`gNodeB`のrouteを見ると`192.168.21.48/28`はgtptunを通るように設定されている ということは相手側とトンネリングが繋がっていなさそう? `gNodeB`から`192.168.21.` | ping from | gNodeB | UPF | DN | | -------- | -------- | -------- | ---- | |192.168.21.33| o| o | x | |192.168.21.34| o| o | x | |192.168.21.49| x| o | o | |192.168.21.50| x| o | o | まあそれはそう UPFのiptablesには何も書かれていない --> `~/gtp5g`, `~/libgtp5gnl`に書いてあるが,これを見るのか...? https://github.com/PrinzOwO/libgtp5gnl ``` $ sudo ./tools/gtp5g-tunnel list pdr [PDR No.1 Info] - Precedence: 1 - Outer Header Removal: 0 [PDI Info] - UE IPv4: 10.0.0.1 [Local F-Teid Info] - In Teid: 100 - Local GTP-U IPv4: 192.168.21.33 - FAR ID: 1 [PDR No.2 Info] - Precedence: 2 [PDI Info] - UE IPv4: 10.0.0.1 - FAR ID: 2 ``` ``` $ sudo ./tools/gtp5g-tunnel list far [FAR No.2 Info] - Apply Action: 2 [Forwarding Parameter Info] [Outer Header Creation Info] - Description: 0 - Out Teid: 100 - Next GTP-U IPv4: 192.168.21.34 - Port: 2152 - Related PDR ID: 2 (Not a real IE) ``` ## 何かがおかしい。。。。(150) ~~hyuga~~ ``` ~/go/src/github.com/yoneyan/ictsc-ace/pkg/routing/router/router.go ``` のどこかを編集したらよさそう. カーネルパラメータはいじっちゃだめとか言っているので,パケットのチェックサムあたりを疑ったがよくわからず. パケット処理のライブラリは `gopacket` を使っているので,そのドキュメントを読めば何かわかるかも? https://pkg.go.dev/github.com/google/gopacket@v1.1.19 編集したらビルドして再起動. ``` ~/go/src/github.com/yoneyan/ictsc-ace/cmd/routing$ go build . ~/go/src/github.com/yoneyan/ictsc-ace/cmd/routing$ sudo ./routing start eth1 eth2 eth3 eth4 ``` デバッグのために処理しているパケットのsrcIP -> dstIPをプリントするように編集している. ## 部署を統合したが…(150) ~~masao~~ SELinux の問題っぽい... **現在の SELinux コンテキスト** - staff (user): `staff_u:staff_r:staff_t:s0-s15:c100,c200` - employee2 `user_u:user_r:user_t:s0-s2:c200` - employee1 `user_u:user_r:user_t:s0-s1:c100` `ls -Z`でSELinuxのファイルのセキュリティコンテクストを見たいが,多分全部解除した状態じゃないとpermission deniedされそう 一回解除してみたい `setenforce 0` します ## まだだ,まだ終わらんよ(150) shin - ~~これでいいのか…?~~ - `/dev/sdb`を修復しないとダメでした ### 回答 (Take 2) お世話になっております。elabです。 この問題では昔のプロジェクトで使用していたディスク`/dev/sdb`のパーティションテーブルが損傷しており認識されていないため、 Webページデータにアクセスできない状態になっていると考えられました。 そのため、以下の手順でパーティションテーブルを修復し、Webサーバーが復旧されていることを確認いたしました。 確認のほどよろしくお願いします。 #### 手順 ##### 0. (確認) エラーの確認 ###### 403エラーの確認 ```bash curl -I 192.168.11.1 HTTP/1.1 403 Forbidden ... ``` ```bash sudo tail /var/log/nginx/error.log ... 2021/03/06 xx:xx:xx [error] xxx#xxx: *1 directory index of "/mnt/data/" is forbidden, client: 192.168.11.1, server: _, request: "GET / HTTP/1.1", host: "192.168.11.1" ``` - `/mnd/data`に関して403エラーが返ってきている ###### ディスクの確認 ```bash sudo cat /etc/fstab ... /dev/sdb1 /mnt/data ext4 defaults 0 0 ``` ```bash sudo lsblk ... └─sda15 8:15 0 106M 0 part /boot/efi sdb 8:16 0 16G 0 disk sdc 8:32 0 368K 0 disk ``` - `/dev/sdb1`を`/mnt/data`にマウントしたいが、`/dev/sdb1`が認識されていない ##### 1. パーティションテーブルの修復 ```bash sudo gdisk /dev/sdb ``` ```gdisk GPT fdisk (gdisk) version 1.0.5 Caution: invalid main GPT header, but valid backup; regenerating main header from backup! Warning: Invalid CRC on main header data; loaded backup partition table. Warning! Main and backup partition tables differ! Use the 'c' and 'e' options on the recovery & transformation menu to examine the two tables. Warning! Main partition table CRC mismatch! Loaded backup partition table instead of main partition table! Warning! One or more CRCs don't match. You should repair the disk! Main header: ERROR Backup header: OK Main partition table: ERROR Backup partition table: OK Partition table scan: MBR: not present BSD: not present APM: not present GPT: damaged Found invalid MBR and corrupt GPT. What do you want to do? (Using the GPT MAY permit recovery of GPT data.) 1 - Use current GPT 2 - Create blank GPT Your answer: 1 Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): Y Command (? for help): n Partition number (1-128, default 1): [ENTER] First sector (34-33554398, default = 2048) or {+-}size{KMGTP}: [ENTER] Last sector (2048-33554398, default = 33554398) or {+-}size{KMGTP}: [ENTER] Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): [ENTER] Changed type of partition to 'Linux filesystem' Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): Y OK; writing new GUID partition table (GPT) to /dev/sdb. The operation has completed successfully. ``` - [ENTER]部分は何も入力せずにENTERキーを押下する ##### 2. ディスク復旧の確認 ```bash sudo lsblk ... └─sda15 8:15 0 106M 0 part /boot/efi sdb 8:16 0 16G 0 disk └─sdb1 8:17 0 16G 0 part /mnt/data sdc 8:32 0 368K 0 disk ``` ##### 3. マウントする ```bash sudo mount -a ``` ```bash ls /mnt/data/ index.html lost+found ``` ##### 4. 復旧確認 ```bash curl 192.168.11.1 ``` ```index.html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="style.css"> <title>タイトル</title> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> </head> <body> <main> <p>ICTSC WEB!!!</p> </main> <script> $(function(){ }); </script> </body> </html> ``` ### 回答 (Take 1) お世話になっております。elabです。 この問題では昔のプロジェクトで使用していたディレクトリ配下に一切のデータが存在せず、 indexページファイルが存在しないためアクセスできない状態になっていると考えられました。 そのため、エラーページを表示させないためには、少なくとも以下の2つの方法が考えられます。 確認のほどよろしくお願いします。 #### 手順 ##### 0. (確認) エラーの確認 ```bash curl -I 192.168.11.1 HTTP/1.1 403 Forbidden ... ``` ```bash sudo tail /var/log/nginx/error.log ... 2021/03/06 xx:xx:xx [error] xxx#xxx: *1 directory index of "/mnt/data/" is forbidden, client: 192.168.11.1, server: _, request: "GET / HTTP/1.1", host: "192.168.11.1" ``` ```bash ll /mnt/data ``` - `/mnd/data`に関して403エラーが返ってきている - `/mnt/data`上に一切のデータが存在しない ##### 1. エラーページを表示させないための設定 ###### (方法1)indexページが存在しないディレクトリではディレクトリ下のファイル一覧を表示させるようにする - Nginxの設定ファイル(`/etc/nginx/sites-enabled/ictsc`)を書き換える ```/etc/nginx/sites-enabled/ictsc # ... server { listen 80 default_server; listen [::]:80 default_server; # ... # 以下を追加 autoindex on; autoindex_exact_size off; autoindex_localtime on; # ... ``` - Nginxリロード ```bash sudo nginx -s reload ``` ###### (方法2)適当なindexページを`/mnt/data/`下に作成する - 新規作成してもよいが、すでに存在しているデフォルトファイルのどちらかを利用してもよい - `/var/www/html/index.nginx-debian.html` - `/usr/share/nginx/html/index.html` ```bash sudo ln -s /usr/share/nginx/html/index.html /mnt/data/index.html ``` ##### 2. ステータス確認 ```bash curl -I 192.168.11.1 HTTP/1.1 200 OK ... ``` ## FTPが壊れちゃった!(50) hide user/ictsc2020でログイン お世話になっております。elabです。 `/etc/vsftpd.conf`を参照すると以下の設定がありましたが、`/etc/vsftpd.chroot_list`というファイルが存在しなかったので、作成しました。 ``` chroot_list_file=/etc/vsftpd.chroot_list ``` `/etc/vsftpd.chroot_list`を以下の内容で作成しました。 ``` user ``` これによってFTPサーバーにログインできるようになりました。 ``` user@vm1:~$ lftp -u user 192.168.3.1 Password: lftp user@192.168.3.1:~> pwd ftp://user@192.168.3.1 lftp user@192.168.3.1:~> exit ``` ## GREが繋がらない!(100) hide (hyuga) encaplimitの問題 トンネルインタフェースのencaplimit=noneにする必要があるが,vyosではnoneにできないのでipコマンドでトンネルインタフェースを作った ## 名前解決ができない?(100) ~~akky~~ <!-- まず ssh 192.168.2.128.131/25のキャッシュサーバ兼クライアントにSSHが繋がらない 権威サーバからルータに対してpingが通るが,権威サーバからキャッシュサーバ兼クライアントに対してpingが通らない 権威サーバ ``` default via 192.168.2.126 dev eth0 proto static metric 100 192.168.2.0/25 dev eth0 proto kernel scope link src 192.168.2.20 metric 100 ``` | ping from | ルータ | 権威サーバ | キャッシュサーバ | | -------- | -------- | -------- | ---- | | ルータ | o | o | o | |権威サーバ | o | o | o | |キャッシュサーバ| o| x | o | 権威サーバのデフォルトゲートウェイが `192.168.2.126`になっているので,そちら側に向いていそう これってどうするんだ...? --> `dig @192.168.2.131 pc1.ictsc.net`をクライアントから実行すると名前解決できない `/var/named/data/run.log` - `named(BIND)`で動作している - `named-chroot` [KSKロールオーバーについて \- JPNIC](https://www.nic.ad.jp/ja/dns/ksk-rollover/) 「3.1. キャッシュサーバの運用者、ネットワーク運用者」で,DNSSEC利用者 `named-chroot.service`が起動している [Internet Week 2015 T5 今日から始めるDNSSECバリデーション \- JPNIC](https://www.nic.ad.jp/ja/materials/iw/2015/proceedings/t5/)が一番分かりやすい資料な気がする #### debug方法 - `/var/named/data/named.run`を見る - `/etc/named.conf`を書き換える - `systemctl restart named-chroot.service` - `rdnc reload`(コマンド違うかも) - `dig @192.168.2.131 pc1.ictsc.net` ### 回答 ``` お世話になっております。elabです。 この問題ではキャッシュサーバにおいて, validating ictsc.net/DNSKEY: verify failed due to bad signature (keyid=63829): RRSIG has expired validating ictsc.net/DNSKEY: unable to find a DNSKEY which verifies the DNSKEY RRset and also matches a trusted key for 'ictsc.net' というログが存在していました. そのため, `.root.key` `dig @192.168.2.20 ictsc.net DNSSEC` に依って返ってくる値を用いてトラストアンカーの鍵を登録して再起動したところ,正しく問い合わせが行えるようになるようでした. 確認のほどよろしくお願いします。 ``` ## FTPなんも分からん(50) masao 回答者: masao とりあえず中に入ってFTP接続してみるとLISTが失敗している? -> active mode を用いることで解決 しかしアップロードできない -> vsftp の write_enable=YES にすることで解決 ``` お世話になっております.チームelabです. この問題ではNAT状況下で特定のポートのみがFTPサーバにフォワードされている状況で,FTPのパッシブモードを用いて転送を行おうとしていることが原因であることが判明しました. そのため,以下の手順でFileZillaの設定を変更し,正しく該当FTPサーバに接続できることを確認しました. ## 手順 ### 1. FileZilla の設定において,優先的にアクティブモードを使用する Edit->Settings から開かれる設定画面において,"Connection -> FTP" タブにおける "Transfer Mode" を Active に変更. ### 2. FileZilla の保存された接続に,該当FTPサーバを追加 GUI画面左上にある "Site Manager (アイコン)" ボタンを押して開かれる Site Manager において,今回接続対象となるFTPサーバを保存済み接続として追加. (ISCTC FTP という接続名で保存されております.) また,この問題ではパーミッションが適切であるにもかかわらず,ファイルをクライアントから一切アップロードできないという事象も発生しておりました. そのため,以下の手順でFTPサーバの設定を変更し,ファイルアップロード機能を有効化しました. ただし,有効化しても接続ユーザに編集権限のないディレクトリやファイルは編集不能です(例: 他人のhomeディレクトリなど) ### 3. /etc/vsftp.conf の変更 `/etc/vsftp.conf` を編集し, `write_enable=YES` に変更. ### 4. vsftpd の再起動 以下のコマンドにより,`vsftpd` を再起動. `sudo systemctl restart vsftpd` 以上2件の対応より,クライアントから FileZilla を用いて該当FTPサーバにファイルアップロード及びダウンロードが可能となったことを確認しました. ``` ## コンテナに繋がらない(50) shin (hyuga) 回答者:shin (hyuga) - 自分で`docker network`を作成しているものの、未完成っぽい - `docker network ls`ででてくる`40c3b553b46a none null local`が問題のネットワーク ### 回答 お世話になっております。elabです。 この問題ではNginxコンテナに正しいdockerネットワークに接続されていないことが原因でトラブルが発生したと考えられました。 そのため、以下のように設定を変更し、疎通が取れることを確認いたしました。 確認のほどよろしくお願いします。 #### 手順 ##### 0. (確認) Nginxコンテナのネットワークを確認する ```bash docker inspect nginx ``` - `NetworkSettings->Networks` 下が `"none"` になっている ##### 1. Dockerネットワーク一覧を確認する ```bash docker network ls NETWORK ID NAME DRIVER SCOPE xxxxxxxxxxxx bridge bridge local xxxxxxxxxxxx host host local xxxxxxxxxxxx none null local ``` - `none`ネットワークではなく`bridge`ネットワークに接続し直せばよい ##### 2. 正しいDockerネットワークに接続し直す ```bash docker network disconnect none nginx docker network connect bridge nginx ``` ##### 3. 疎通確認 ```bash curl 127.0.0.1:8080 ``` ```html <!DOCTYPE html> <html> <head> <title>Welcome to ICTSC2020!</title> </head> <body> <h1>Welcome to ICTSC2020!</h1> </body> </html> ```