見出し画像

「体験しながら学ぶネットワーク管理技術入門」のテストネットワークをtinetからcontainerlabへ変える実験:3日目

今朝は4時に自力で起きました。コーヒーを淹れにリビングに降りていくと助手の猫さんが眠そうに起きてきました。リビングが寒くなく、ご飯も残っていたので今朝は、起こしに来るのをサボったようです。

「体験しながら学ぶネットワーク管理技術入門」のテストネットワークをcontainerlabで起動する時に発生した問題の調査をすることにしました。
1つ目は、panicです。

WARN[0452] Failed to parse the command string: sed -i "/access_log/i \ \ \ \ \ \ \ \ log_format  custom  '\"\\" \"\\" \"\\" \"\\" \"\\" \"\\" \"\\"';" /etc/nginx/nginx.conf, EOF found when expecting closing quote
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1bfd8d1]

goroutine 38 [running]:
github.com/srl-labs/containerlab/clab/exec.(*ExecCmd).GetCmd(...)
	github.com/srl-labs/containerlab/clab/exec/exec.go:96
github.com/srl-labs/containerlab/runtime/docker.(*DockerRuntime).Exec(0xc000519770, {0x3aca9f0, 0xc000156e10}, {0xc00011d660, 0xd}, 0x0)
	github.com/srl-labs/containerlab/runtime/docker/docker.go:823 +0x1d1
github.com/srl-labs/containerlab/nodes.(*DefaultNode).RunExec(0xc000a291e0, {0x3aca9f0, 0xc000156e10}, 0x0)
	github.com/srl-labs/containerlab/nodes/default_node.go:455 +0x8e
github.com/srl-labs/containerlab/nodes.(*DefaultNode).RunExecFromConfig(0xc000a291e0, {0x3aca9f0, 0xc000156e10}, 0xc0009c7500)
	github.com/srl-labs/containerlab/nodes/default_node.go:237 +0x176
github.com/srl-labs/containerlab/clab.(*CLab).scheduleNodes.func1(0x0, 0xc0001681e0, 0xc000142b00?)
	github.com/srl-labs/containerlab/clab/clab.go:630 +0x8be
created by github.com/srl-labs/containerlab/clab.(*CLab).scheduleNodes in goroutine 1
	github.com/srl-labs/containerlab/clab/clab.go:686 +0x154

ログをよく見ると、execで実行しているsedコマンドが

sed -i "/access_log/i \ \ \ \ \ \ \ \ log_format  custom  '\"\\" \"\\" \"\\" \"\\" \"\\" \"\\" \"\\"';" /etc/nginx/nginx.conf

のようになっています。
元の定義をみると

sed -i "/access_log/i \ \ \ \ \ \ \ \ log_format  custom  '\"\$time_local\" \"\$remote_addr\" \"\$request\" \"\$status\" \"\$http_user_agent\" \"\$http_x_forwarded_for\" \"\$http_x_forwarded_proto\"';" /etc/nginx/nginx.conf

$time_localのような$で始まる部分がすっぽり抜けています。その結果、\と\の間が詰まって、\\になっています。これでエスケープシーケンスがおかしくなってpanicが発生したようです。
containerlabのexecコマンドの説明を読むと$で始まるものを環境変数で変換するという部分がありました。$をそのまま書きたい時には、$$とすると書いてありました。そこで、\$time_localのような部分を$$time_localに変更するとpanicは発生しなくなりました。
設定の動作が正しいかは不明です。

もう一つの問題デフォルトルートの問題ですが、tinetのネットワーク環境とcontainerlabの環境では、管理用のネットワークの自動追加が違っています。
ノードに
network-mode: none
という設定を追加すると管理用のネットワークが追加されないので、tinetの環境と同じになりました。
これで起動すると、とりあえず、外部との通信は遮断されたようです。
この設定で起動すると

INFO[0008] failed to disable TX checksum offload for eth0 interface for lb1 container

のログがでるようになりました。
どうやら、無効にしたeth0のオフロードをOFFにするコマンドをcontainerlabの内部で実行してエラーになっているようです。

この事件の問題は、containerlabでは発生しなように、よしなにやってくれているようです。

問題も解決して「体験しながら学ぶネットワーク管理技術入門」のテストネットワークをcontainerlabで実現できたと思って喜んでいましたが、
クライント(cl1)から

# ping www.example.com
ping: www.example.com: Temporary failure in name resolution

を実行しても名前解決で失敗します。
cl1のDNSの設定は問題ないようですが、テストネットワーク内のDNSサーバー(ns1)がうまく動いていないようなので調べようと思ったところに、
助手の猫さんが、「休憩!」と言って部屋に入ってきました。
リビングにいって、TVを観ながら撫でていたら、時間切れです。

ネットワーク環境のトラブルシューティングのようになってきて楽しくなってきました。

明日に続く



いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。