「体験しながら学ぶネットワーク管理技術入門」のテストネットワークをtinetからcontainerlabへ変える実験:4日目
今朝は3時16分に自力で起きました。助手の猫さんはリビングにいませんでした。寒すぎて、かみさんの布団に潜っているのかもしれません。「休憩!」とも言いに来ないようです。
さて、今朝早く目が覚めたのは、昨日のDNSの問題を調べるためです。トラブルシュートは何となく好きです。
まずは、問題のおさらい
家庭内のPC(cl1) からインターネットのwww.example.com(fw1)にPINGしました。DNSで名前解決できないエラーになりました。
# ping www.example.com
ping: www.example.com: Temporary failure in name resolution
cl1のDNS設定を確認してみました。
root@cl1:/# cat /etc/resolv.conf
nameserver 192.168.11.254
rt1がcl1のDNSサーバーに設定されてました。
そこで、rt1でpingを実行してみると同じDNSのエラーです。どうやらrt1のDNS設定に問題があるようです。設定を確認してみると
root@rt1:/# cat /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.
nameserver 192.168.1.1
でした。どうやら Docker Engineが私の自宅のローカル環境のルーターをDNSサーバーに設定しているようです。昨日、network_mode: noneに設定したので、ネットワークは分離されていて、このルーターとは通信できません。なるほど!
そこで、本来設定されるテストネットワークないのDNSサーバーを
root@rt1:/# cat /etc/resolv.conf
nameserver 10.1.2.53
のように設定するとrt1からは名前解決できようになりました。
cl1からは、まだできませんでしたが
root@rt1:/# /etc/init.d/dnsmasq stop
* Stopping DNS forwarder and DHCP server dnsmasq [ OK ]
root@rt1:/# /etc/init.d/dnsmasq start
* Starting DNS forwarder and DHCP server dnsmasq [ OK ]
のようにDNSをリレーするサーバーを再起動して解決です。
「体験しながら学ぶネットワーク管理技術入門」のP36にゴールと書いている
root@cl1:/# curl -k https://www.example.com
sv1.example.com
もできました。めでたし、めでたし。
DNSの設定に関してtinetのspecファイルを見直すと、
- name: rt1
image: frr-iptables-dnsmasq_arm_nm
buildfile: Dockerfile_rt1
interfaces:
- { name: net0, type: direct, args: rt2#net0 }
- { name: net1, type: direct, args: sw1#port4 }
dns: 10.1.2.53
mounts: /mnt/c/tinet:/tmp/tinet
のようにdnsの設定がありました。この部分に変換ツールは対応していませんでした。これが原因でした。
containerlabのDNS設定は
なので変換できるように対応しました。
その他変換ツールでいろいろ見つけた問題を修正しました。
network_modeをnoneにする
execコマンドの\$を$$にする
dnsの変換に対応
mountsをbindsに変換する
ポートの公開に対応する
docker buildはコメントで追加する
これで「体験しながら学ぶネットワーク管理技術入門」のネットワーク構成ファイルは、うまく変換できるはずです。
ネットワーク管理対応したファイルもいけるはずです。
これからやってみようと思いますが、今朝はここまで
明日に続く
夜追記
やってみたら、あっさり動きました。
変更したソースコードは
です。
とりあえず、目的達成です。
も書きました。