LFCS — Linux Foundation認定システム管理者
アドレス・名前・経路を設定して読む
目標
静的アドレスの設定ファイルを書き、名前解決の経路を区間ごとに確認し、ソケットとルーティングを読んで要約を作ります。
なぜ重要なのか
このラボのステップ1–2は、筆者のホームラボで実際にクラスターを停止させた事故の、再発防止手順そのものです。DHCPのリース更新でコントロールプレーンのアドレスが変わると、証明書のSANとずれて、apiserverが起動できなくなりました。そのとき学んだのは、dhcp4: falseだけでは固定にならないことです。cloud-initが起動のたびにネットワーク設定を再生成するので、その生成も一緒に止める必要があり、ルーター側のDHCP予約までセットで行って、初めてアドレスが固定されます。
残りのステップは、診断の順序を身につける過程です。getentとdigの結果が分かれるところが、そのまま問題の区間で、ssのソケットの状態とip routeのデフォルトルートは、「ここまでは正常」を確定してくれる根拠です。この環境では、pingとiptablesが塞がれているので、到達性の確認の代わりに、設定ファイルと観察ツールだけで判断する訓練をします。
ステップ
/root/lfcs-net/01-static.yamlに、netplanの設定を書いてください。network.versionは2、インターフェースはenp3s0、dhcp4: false、アドレスは10.0.0.120/24、デフォルトルートはto: defaultとvia: 10.0.0.1、ネームサーバーは10.0.0.1と1.1.1.1です。/root/lfcs-net/99-disable-network-config.cfgに、cloud-initのネットワーク設定の生成をオフにする内容を書いてください。実際のサーバーなら、このファイルは/etc/cloud/cloud.cfg.d/の下に置きます。/etc/hostsに、アドレス10.0.0.120、正規名cp-1.homelab.internal、エイリアスcp-1のエントリを追加し、getent hosts cp-1の出力を/root/lfcs-net/getent.txtに保存してください。/root/lfcs-net/resolv-summary.txtに、nameservers=<nameserver 줄 개수>とndots=<옵션 값 또는 none>の2行を、/etc/resolv.confを基準に書いてください(プレースホルダーは順に、nameserver行の数、オプションの値またはnoneです)。127.0.0.1:8087で待ち受けるTCPリスナーを1つ起動し、現在LISTEN中のソケットのローカルアドレスを、/root/lfcs-net/listen.txtに1行ずつ入れてください。/root/lfcs-net/route.txtに、default_via=<기본 경로의 게이트웨이 또는 none>とprimary_iface=<기본 경로가 나가는 장치>の2行を書いてください(プレースホルダーは順に、デフォルトルートのゲートウェイまたはnone、デフォルトルートが出ていくデバイスです)。/root/lfcs-net/nsswitch.txtに、hosts=<'/etc/nsswitch.conf' 의 hosts 행 값들>の1行を書いてください。値の間は、空白1つで区切ります(プレースホルダーは、'/etc/nsswitch.conf'のhosts行の値です)。/root/lfcs-net/firewall-plan.txtに、ルール5行を<동작> <프로토콜> <포트> <출발지>の形式で、下の順序のとおりに書いてください(プレースホルダーは順に、動作、プロトコル、ポート、送信元です)。
allow tcp 22 10.0.0.0/24
allow tcp 6443 10.0.0.0/24
allow tcp 80 0.0.0.0/0
allow tcp 443 0.0.0.0/0
deny any any 0.0.0.0/0
参考
- リスナーは、
python3 -m http.server 8087 --bind 127.0.0.1をバックグラウンドで起動すれば作れます。 ss -ltnHは、ヘッダーなしでLISTEN中のTCPソケットだけを表示します。ローカルアドレスは4番目の列です。getentは、ネームサービススイッチの全経路を通りますが、digはDNSだけを見ます。2つの結果が違うなら、犯人はDNSではありません。- よくある間違い: デフォルトの遮断ルールを先頭に置くと、後ろの許可ルールに届く前に、自分の接続が切れます。
netplanの静的アドレス設定
/root/lfcs-net/01-static.yamlに、netplanの設定を書いてください。network.versionは2、インターフェースはenp3s0、dhcp4: false、アドレスは10.0.0.120/24、デフォルトルートはto: defaultとvia: 10.0.0.1、ネームサーバーは10.0.0.1と1.1.1.1です。
netplanはYAMLで、最上位のキーはnetworkです。インターフェースの下に、DHCPをオフにするキーとアドレスの一覧、ルートの一覧、ネームサーバーが入ります。アドレスには、プレフィックス長も一緒に書きます。
cloud-initのネットワーク設定をオフにする
/root/lfcs-net/99-disable-network-config.cfgに、cloud-initのネットワーク設定の生成をオフにする内容を書いてください。実際のサーバーなら、このファイルは/etc/cloud/cloud.cfg.d/の下に置きます。
1行で十分です。cloud-initがネットワーク設定を再び作れないようにするキーを、無効の値にしてください。
hostsのエントリとgetentの確認
/etc/hostsに、アドレス10.0.0.120、正規名cp-1.homelab.internal、エイリアスcp-1のエントリを追加し、getent hosts cp-1の出力を/root/lfcs-net/getent.txtに保存してください。
hostsファイルの1行は、アドレス、正規名、そしてエイリアスの順です。確認は、DNSだけを見るツールではなく、ネームサービススイッチの全経路を通るツールで行ってください。
リゾルバー設定の要約
/root/lfcs-net/resolv-summary.txtに、nameservers=<nameserver 줄 개수>とndots=<옵션 값 또는 none>の2行を、/etc/resolv.confを基準に書いてください(プレースホルダーは順に、nameserver行の数、オプションの値またはnoneです)。
nameserverで始まる行の数を数え、options行からドットの数のしきい値を探します。その項目がなければ、noneと書いてください。
リスナーを起動してソケット一覧を作る
127.0.0.1:8087で待ち受けるTCPリスナーを1つ起動し、現在LISTEN中のソケットのローカルアドレスを、/root/lfcs-net/listen.txtに1行ずつ入れてください。
Pythonの組み込みモジュールで簡単なサーバーを起動でき、アドレスをループバックに縛るオプションがあります。ソケット一覧は、ヘッダーなしで取り出すオプションを使うと、加工が楽です。
デフォルトルートのパース
/root/lfcs-net/route.txtに、default_via=<기본 경로의 게이트웨이 또는 none>とprimary_iface=<기본 경로가 나가는 장치>の2行を書いてください(プレースホルダーは順に、デフォルトルートのゲートウェイまたはnone、デフォルトルートが出ていくデバイスです)。
デフォルトルートだけを選んで見るサブコマンドがあります。出力から、次のホップと出ていくデバイスを示すキーワードの後ろの値を取り出してください。
名前解決の順序の記録
/root/lfcs-net/nsswitch.txtに、hosts=<'/etc/nsswitch.conf' 의 hosts 행 값들>の1行を書いてください。値の間は、空白1つで区切ります(プレースホルダーは、'/etc/nsswitch.conf'のhosts行の値です)。
hostsで始まる行の値を、空白1つで区切って、そのまま書き写します。この並びの順序が、そのまま問い合わせの順序です。
ファイアウォールルールの設計文書
/root/lfcs-net/firewall-plan.txtに、ルール5行を<동작> <프로토콜> <포트> <출발지>の形式で、下の順序のとおりに書いてください(プレースホルダーは順に、動作、プロトコル、ポート、送信元です)。
ルールは上から評価されます。管理用の接続ポートを先に開けて、デフォルトの遮断は一番最後に置かないと、リモートから自分自身を締め出してしまいます。