From d02d549b3d1a15c4c6fb74097addd6cada159705 Mon Sep 17 00:00:00 2001 From: Ruk Doe Date: Sun, 1 Nov 2026 00:29:15 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=8E=E3=83=BC=E3=83=89=E3=81=AE=E5=8F=97?= =?UTF-8?q?=E4=BF=A1=E3=81=AE=E9=98=B2=E7=81=AB=E5=A3=81=E3=82=92=20Cilium?= =?UTF-8?q?=20=E3=81=AE=20Host=20Firewall=20=E3=81=A7=E4=BD=9C=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Talos の防火壁は conntrack の invalid を捨てる規則を必ず入れ、Envoy の帰りを NOTRACK に する Cilium と噛み合わず、Pod からノード自身の IP の Gateway が捨てられた(#652)。 hostFirewall を有効にし、ノードを選ぶ CiliumClusterwideNetworkPolicy で外から通す ポートを決める。boot CI で、外から 443 は通り 10250 は通らない・LAN からは通る・ Pod からノードの IP の Gateway に届く、を見る。 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01T9PbUfqG4pPxus99UeLiJs --- .github/workflows/talos-boot.yml | 50 +++++++++++++++++++++++-- bootstrap/cilium-values.yaml | 5 +++ deploy/cluster/host-firewall.yaml | 62 +++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 deploy/cluster/host-firewall.yaml diff --git a/.github/workflows/talos-boot.yml b/.github/workflows/talos-boot.yml index 19da7b3d..267f8e97 100644 --- a/.github/workflows/talos-boot.yml +++ b/.github/workflows/talos-boot.yml @@ -281,14 +281,24 @@ jobs: echo "::error::Gateway を通らない(http=$H https=$S。期待は 301 / 200)" exit 1 - # 受信の防火壁は 2026-10-31 から外してある(bootstrap/talos.md)。外から 10250 が通らないことは見ない。 - # 戻したら「外から kubelet」の検査(期待は 000)も戻す(#646) - - name: 外と LAN から届く(443 と 10250) - timeout-minutes: 3 + # ノードの受信の防火壁は Cilium の Host Firewall(deploy/cluster/host-firewall.yaml)。ここで当てて、 + # 外から 443 は通り 10250 は通らない・LAN からは通る・Pod からノードの IP の Gateway に届く、を見る。 + # 後ろの段の talosctl(50000)・kubectl(6443)も LAN(SLIRP の 10.0.0.1)から通ることを見ている + - name: ノードの防火壁(Cilium の Host Firewall) + timeout-minutes: 6 run: | set -euo pipefail fail() { echo "::error::$*"; exit 1; } code() { curl -s -o /dev/null -w '%{http_code}' --max-time 10 "$@" || true; } + until kubectl apply -f deploy/cluster/host-firewall.yaml; do sleep 5; done + # 外からの kubelet が止まるまで待つ(ポリシーがホストに載るまで少しかかる) + for i in $(seq 24); do + KW=$(code -k --max-time 5 https://127.0.0.1:30250/healthz) + [ "$KW" = 000 ] && break + sleep 5 + done + echo " 外から kubelet: $KW" + [ "$KW" = 000 ] || fail "外から kubelet(10250)に届いた($KW)。防火壁が効いていない" # IPv4 の hostfwd は SLIRP の 10.0.0.1(家の LAN と同じ。private-tcp に当たる)から来る。kubelet は認証無しなら 401 K4=$(code -k https://127.0.0.1:20250/healthz) echo " LAN から kubelet: $K4" @@ -298,6 +308,38 @@ jobs: echo " 外から Gateway: $SW" [ "$SW" = 200 ] || fail "外から 443 が通らない($SW)" + # **Pod からノード自身の IP の Gateway に届くか。** Pod は fj.doany.io の AAAA(ノードの公開 IPv6)で Forgejo に来る + # (deploy/forgejo/runner.yaml)。防火壁があると conntrack の invalid として捨てられ、TCP はつながるが応答が来なかった + # (2026-10-31 に Talos の防火壁で踏んだ。今は Cilium の Host Firewall なので起きないはず。deploy/cluster/host-firewall.yaml) + - name: Pod からノードの IP の Gateway に届く + timeout-minutes: 4 + run: | + set -euo pipefail + cat > /tmp/curl.yaml <