diff --git a/.github/workflows/talos-boot.yml b/.github/workflows/talos-boot.yml index 61b8512b..e5912ec3 100644 --- a/.github/workflows/talos-boot.yml +++ b/.github/workflows/talos-boot.yml @@ -27,6 +27,9 @@ concurrency: env: # 本番と同じアドレス。SLIRP の網をこれに合わせて、machine config の住所は書き換えない NODE: 10.0.0.2 + # 受信の防火壁を「外」から見るための 4 枚目の NIC(CI だけ)。198.51.100.0/24 は文書用でプライベートでない + WAN_NODE: 198.51.100.2 + MAC_WAN: 52:54:00:00:00:05 TALOSCONFIG: /tmp/out/talosconfig KUBECONFIG: /tmp/kubeconfig # 3 枚の NIC の MAC。名前は maintenance mode で MAC から引く(VM の名前は QEMU の挿し方で変わる) @@ -151,12 +154,14 @@ jobs: -device virtio-scsi-pci,id=scsi0 \ -drive file=/tmp/vm/disk.raw,format=raw,if=none,id=d0,cache=unsafe,discard=unmap \ -device scsi-hd,drive=d0,bus=scsi0.0 \ - -netdev "user,id=up,net=10.0.0.0/24,host=10.0.0.1,dhcpstart=$NODE,ipv4=on,ipv6=on,ipv6-net=240f:6d:842b:1::/64,ipv6-host=240f:6d:842b:1::1,hostfwd=tcp:127.0.0.1:50000-$NODE:50000,hostfwd=tcp:127.0.0.1:6443-$NODE:6443,hostfwd=tcp:127.0.0.1:18080-$NODE:80,hostfwd=tcp:127.0.0.1:18443-$NODE:443" \ + -netdev "user,id=up,net=10.0.0.0/24,host=10.0.0.1,dhcpstart=$NODE,ipv4=on,ipv6=on,ipv6-net=240f:6d:842b:1::/64,ipv6-host=240f:6d:842b:1::1,hostfwd=tcp:127.0.0.1:50000-$NODE:50000,hostfwd=tcp:127.0.0.1:6443-$NODE:6443,hostfwd=tcp:127.0.0.1:18080-$NODE:80,hostfwd=tcp:127.0.0.1:18443-$NODE:443,hostfwd=tcp:127.0.0.1:20250-$NODE:10250" \ -netdev hubport,id=hub-up,hubid=0,netdev=up \ -netdev hubport,id=hub1,hubid=0 -device virtio-net-pci,netdev=hub1,mac=$MAC_ENO1 \ -netdev hubport,id=hub2,hubid=0 -device virtio-net-pci,netdev=hub2,mac=$MAC_ENO2 \ -netdev user,id=lan10,net=10.10.0.0/24,host=10.10.0.1,ipv6=off,restrict=on \ -device virtio-net-pci,netdev=lan10,mac=$MAC_ENO4 \ + -netdev "user,id=wan,net=198.51.100.0/24,host=198.51.100.1,ipv6=off,restrict=on,hostfwd=tcp:127.0.0.1:28443-$WAN_NODE:443,hostfwd=tcp:127.0.0.1:30250-$WAN_NODE:10250" \ + -device virtio-net-pci,netdev=wan,mac=$MAC_WAN \ -display none -serial file:/tmp/vm/serial.log \ -daemonize -pidfile /tmp/vm/qemu.pid @@ -172,6 +177,21 @@ jobs: # NIC は MAC で選ぶ(LinkAliasConfig)ので、実機の MAC を VM の MAC に差し替える。sysctl はカーネルの名前で書くので名前も sed -e "s/30:e1:71:60:fe:a8/$MAC_ENO1/g" -e "s/30:e1:71:60:fe:a9/$MAC_ENO2/g" -e "s/30:e1:71:60:fe:ab/$MAC_ENO4/g" \ -e "s/\beno4\b/$N4/g" /tmp/out/controlplane.yaml > /tmp/vm/controlplane.yaml + # 4 枚目(外の代わり)に住所を付ける。本物の config には無い + cat >> /tmp/vm/controlplane.yaml < /tmp/nft.yaml + P=$(yq -r 'select(.metadata.id == "ingress") | .spec.policy' /tmp/nft.yaml) + echo " nftables の ingress の既定: $P" + [ "$(echo "$P" | tr 'A-Z' 'a-z')" = drop ] || { cat /tmp/nft.yaml; fail "ingress の chain が既定で捨てる形(drop)でない"; } + # 以下は forwarding=1 のあとで見ないと意味が無い(talos.sops.yaml の accept_ra) F=$(talosctl read /proc/sys/net/ipv6/conf/bond0/forwarding) [ "$F" = 1 ] || fail "bond0 の forwarding が $F。前提が成り立っていない" @@ -415,7 +460,7 @@ jobs: echo "::endgroup::" echo "::group::talosctl services"; talosctl services; echo "::endgroup::" echo "::group::talosctl get links / addresses / routes" - talosctl get links; talosctl get addresses; talosctl get routes + talosctl get links; talosctl get addresses; talosctl get routes; talosctl get nftableschains -o yaml echo "::endgroup::" echo "::group::talosctl dmesg(末尾)"; talosctl dmesg | tail -300; echo "::endgroup::" echo "::group::serial(末尾)"; tail -200 /tmp/vm/serial.log; echo "::endgroup::" diff --git a/bootstrap/render.sh b/bootstrap/render.sh index bb3a327a..2a7af6fd 100755 --- a/bootstrap/render.sh +++ b/bootstrap/render.sh @@ -238,6 +238,7 @@ for n in "kube-apiserver:$K8S" "ghcr.io/siderolabs/kubelet:$K8S" \ 'name: cilium' cilium-operator KUBERNETES_SERVICE_PORT 'value: \"7445\"' 'cgroup-root: \"/sys/fs/cgroup\"' \ 'kind: GatewayClass' io.cilium/gateway-controller \ 'kind: RawVolumeConfig' 'kind: LVMVolumeGroupConfig' 'name: dm_thin_pool' \ + 'kind: NetworkDefaultActionConfig' 'name: public-tcp' 'name: private-tcp' \ 'name: lvm-localpv' lvm-localpv-node lvm-localpv-controller 'storageCapacity: false' 'doany.io/lvm-thinpool: ready' \ 'name: storage' 'name: local-path' 'provisioner: local.csi.openebs.io' 'volgroup: data' \ 'kind: VolumeSnapshotClass' 'name: lvm-thinpool' \ diff --git a/bootstrap/talos.md b/bootstrap/talos.md index 12b72349..1bdbc5e2 100644 --- a/bootstrap/talos.md +++ b/bootstrap/talos.md @@ -65,6 +65,15 @@ needle は `render.sh` の末尾の 1 か所だけに置く。 | `talos.sops.yaml` の先頭の Kubernetes の `# version:` | `render.sh` → `apply-config` → `talosctl upgrade-k8s --to <新しい版>` | 無し | | `talos.sops.yaml` の本文と、`bootstrap/` の残りの全部(`*-values(.sops).yaml`(2 つめのドキュメントの Secret も)・`apiserver-rbac.yaml`・`storage.yaml`) | `render.sh` → `apply-config` → `talosctl upgrade-k8s --to <今の版>`(下の「inlineManifests を直したとき」) | 場合による | +**ネットワークと受信の防火壁(`BondConfig`・`LinkConfig`・`NetworkRuleConfig` など)を変えたら `--mode=try` で当てる。** +間違えると Talos の API ごと届かなくなるが、`try` なら時間内に `--mode=no-reboot` で当て直さないと元に戻る: + +```shell +talosctl apply-config --mode=try --timeout 5m -f bootstrap/clusterconfig/controlplane.yaml +# 5 分のうちに確かめる(talosctl get members・kubectl get nodes・外からの Web・DoT・NetBird)。良ければ確定させる +talosctl apply-config --mode=no-reboot -f bootstrap/clusterconfig/controlplane.yaml +``` + ### inlineManifests を直したとき **Cilium・OpenEBS LVM(`storage.yaml` も)・`apiserver-rbac.yaml`・ArgoCD・infisical・ diff --git a/bootstrap/talos.sops.yaml b/bootstrap/talos.sops.yaml index 3b4f8cc1..754e2b49 100644 --- a/bootstrap/talos.sops.yaml +++ b/bootstrap/talos.sops.yaml @@ -537,6 +537,161 @@ sops: mac_only_encrypted: true version: 3.13.3 --- +# ホスト(Talos の API・etcd・kubelet・Cilium・Gateway の Envoy など)が受けるものの防火壁(Ingress Firewall)。 +# ルーターは DMZ と IPv6 ホスト公開で全部のポートをノードに流すので(../docs/router.md)、外に出すものはここで決める。 +# 既定は捨て、下の NetworkRuleConfig に当たるものだけ通す。lo・確立済みの戻り・ICMP / ICMPv6(5 個/秒まで)・ +# Pod と Service の網どうしは Talos が自分で通す。効くのはホスト宛て(input)だけで、hostPort は Cilium が Pod へ +# 転送するのでここを通らない(Pod の手前は Cilium のポリシー。53 番は ../apps/adguardhome/network-policy.yaml)。 +# 間違えると Talos の API ごと締め出されるので、当てるときは apply-config --mode=try(talos.md「上げ方 / 当て直し方」)。 +apiVersion: v1alpha1 +kind: NetworkDefaultActionConfig +ingress: block +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIQnpITHlrS0lxZkZXb3dy + UmNMYUhFamtsR2Rpb3BTMXozYjQwQkoxOEhFClFOeDRQV2tTYTBlL09RUS9oMUZG + ZHZwNXVnYzA4dkIyME0rbnc0Zm44SEUKLS0tIDhTNmNMU1ZVeGEwbzltTDdpVVRP + M0FiWEJ2MHIzRkU2WHRxWlo3N0FsNlEKgYVZr+vTicTztpwMQ7oj/yLEk12f/JZX + uMTe29EqIoB7gE/SCG9z+qoLXd4NHrA1lfrLjTDSCYNEhGiDyMhIMQ== + -----END AGE ENCRYPTED FILE----- + recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r + encrypted_regex: ^password$ + lastmodified: "2026-10-30T16:40:35Z" + mac: ENC[AES256_GCM,data:HeBfzNkyaDPxwfMepe0/4U5g0tAUyMf9AZMYly5La46tj8Ap5K4z9jp3tcOR9tADq1nCBhgtIKDiLmrNqOOWLShV1jDVM35hpBDHMpYuJjAGish8pBZUb3TetvSa1fnzOE24JrCZxpaK69q5V9akQzKIlhM/qgRhU7jFqPhyDT8=,iv:8QW9fMoDnME0qsE/TMcpi3zKgl+Oy+9mN8jzRY7XnN4=,tag:gOxsxLzsRPBx8iQjY5RW/A==,type:str] + mac_only_encrypted: true + version: 3.13.3 +--- +# 外から要るもの(TCP)。ホストが受けるのは 80 / 443(Gateway の Envoy。hostNetwork)と 6443(ks.doany.io と +# cilium-drift.yml)。853(DoT)・3129(3proxy)・8443(LiveKit)は hostPort でここを通らないが、通る形に変わっても +# 落ちないよう書いておく。足すときは ../docs/router.md の表も。 +apiVersion: v1alpha1 +kind: NetworkRuleConfig +name: public-tcp +portSelector: + ports: + - 80 + - 443 + - 853 + - 3129 + - 6443 + - 8443 + protocol: tcp +ingress: + - subnet: 0.0.0.0/0 + - subnet: ::/0 +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIQnpITHlrS0lxZkZXb3dy + UmNMYUhFamtsR2Rpb3BTMXozYjQwQkoxOEhFClFOeDRQV2tTYTBlL09RUS9oMUZG + ZHZwNXVnYzA4dkIyME0rbnc0Zm44SEUKLS0tIDhTNmNMU1ZVeGEwbzltTDdpVVRP + M0FiWEJ2MHIzRkU2WHRxWlo3N0FsNlEKgYVZr+vTicTztpwMQ7oj/yLEk12f/JZX + uMTe29EqIoB7gE/SCG9z+qoLXd4NHrA1lfrLjTDSCYNEhGiDyMhIMQ== + -----END AGE ENCRYPTED FILE----- + recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r + encrypted_regex: ^password$ + lastmodified: "2026-10-30T16:40:35Z" + mac: ENC[AES256_GCM,data:HeBfzNkyaDPxwfMepe0/4U5g0tAUyMf9AZMYly5La46tj8Ap5K4z9jp3tcOR9tADq1nCBhgtIKDiLmrNqOOWLShV1jDVM35hpBDHMpYuJjAGish8pBZUb3TetvSa1fnzOE24JrCZxpaK69q5V9akQzKIlhM/qgRhU7jFqPhyDT8=,iv:8QW9fMoDnME0qsE/TMcpi3zKgl+Oy+9mN8jzRY7XnN4=,tag:gOxsxLzsRPBx8iQjY5RW/A==,type:str] + mac_only_encrypted: true + version: 3.13.3 +--- +# 外から要るもの(UDP)。LiveKit の 8443 と NetBird の routing peer の 51820(どちらも hostPort。上と同じく念のため)。 +# STUN は外のもの(Cloudflare)を使うので開けない。 +apiVersion: v1alpha1 +kind: NetworkRuleConfig +name: public-udp +portSelector: + ports: + - 8443 + - 51820 + protocol: udp +ingress: + - subnet: 0.0.0.0/0 + - subnet: ::/0 +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIQnpITHlrS0lxZkZXb3dy + UmNMYUhFamtsR2Rpb3BTMXozYjQwQkoxOEhFClFOeDRQV2tTYTBlL09RUS9oMUZG + ZHZwNXVnYzA4dkIyME0rbnc0Zm44SEUKLS0tIDhTNmNMU1ZVeGEwbzltTDdpVVRP + M0FiWEJ2MHIzRkU2WHRxWlo3N0FsNlEKgYVZr+vTicTztpwMQ7oj/yLEk12f/JZX + uMTe29EqIoB7gE/SCG9z+qoLXd4NHrA1lfrLjTDSCYNEhGiDyMhIMQ== + -----END AGE ENCRYPTED FILE----- + recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r + encrypted_regex: ^password$ + lastmodified: "2026-10-30T16:40:35Z" + mac: ENC[AES256_GCM,data:HeBfzNkyaDPxwfMepe0/4U5g0tAUyMf9AZMYly5La46tj8Ap5K4z9jp3tcOR9tADq1nCBhgtIKDiLmrNqOOWLShV1jDVM35hpBDHMpYuJjAGish8pBZUb3TetvSa1fnzOE24JrCZxpaK69q5V9akQzKIlhM/qgRhU7jFqPhyDT8=,iv:8QW9fMoDnME0qsE/TMcpi3zKgl+Oy+9mN8jzRY7XnN4=,tag:gOxsxLzsRPBx8iQjY5RW/A==,type:str] + mac_only_encrypted: true + version: 3.13.3 +--- +# プライベートのアドレスからは全部のポート(TCP。UDP は次)。家の LAN(10.0.0.0/24・10.10.0.0/24)・NetBird(100.64.0.0/10)・ +# Pod と Service(10.42 / 10.43・fd42 / fd43。10.0.0.0/8 と fc00::/7 に入る)。talosctl(作業用 PC から 10.10.0.4:50000)・ +# etcd・kubelet・Cilium(4240・4244・8472・9963・9964)・Pod からの Talos API(k8up)とノードの DNS(169.254.116.108:53)はここ。 +# 家の LAN の IPv6 の GUA(RA のプレフィックス。変わりうる)は入れていないので、LAN からは IPv4 で繋ぐ。 +# 172.16/12・192.168/16 は使っていないので入れない(使うものだけ。足すなら上の送信元を増やしたとき)。 +apiVersion: v1alpha1 +kind: NetworkRuleConfig +name: private-tcp +portSelector: + ports: + - 1-65535 + protocol: tcp +ingress: + - subnet: 10.0.0.0/8 + - subnet: 100.64.0.0/10 + - subnet: fc00::/7 + - subnet: fe80::/10 +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIQnpITHlrS0lxZkZXb3dy + UmNMYUhFamtsR2Rpb3BTMXozYjQwQkoxOEhFClFOeDRQV2tTYTBlL09RUS9oMUZG + ZHZwNXVnYzA4dkIyME0rbnc0Zm44SEUKLS0tIDhTNmNMU1ZVeGEwbzltTDdpVVRP + M0FiWEJ2MHIzRkU2WHRxWlo3N0FsNlEKgYVZr+vTicTztpwMQ7oj/yLEk12f/JZX + uMTe29EqIoB7gE/SCG9z+qoLXd4NHrA1lfrLjTDSCYNEhGiDyMhIMQ== + -----END AGE ENCRYPTED FILE----- + recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r + encrypted_regex: ^password$ + lastmodified: "2026-10-30T16:40:35Z" + mac: ENC[AES256_GCM,data:HeBfzNkyaDPxwfMepe0/4U5g0tAUyMf9AZMYly5La46tj8Ap5K4z9jp3tcOR9tADq1nCBhgtIKDiLmrNqOOWLShV1jDVM35hpBDHMpYuJjAGish8pBZUb3TetvSa1fnzOE24JrCZxpaK69q5V9akQzKIlhM/qgRhU7jFqPhyDT8=,iv:8QW9fMoDnME0qsE/TMcpi3zKgl+Oy+9mN8jzRY7XnN4=,tag:gOxsxLzsRPBx8iQjY5RW/A==,type:str] + mac_only_encrypted: true + version: 3.13.3 +--- +# 上と同じ送信元から UDP の全部(Cilium の VXLAN 8472、ノードの DNS など)。 +apiVersion: v1alpha1 +kind: NetworkRuleConfig +name: private-udp +portSelector: + ports: + - 1-65535 + protocol: udp +ingress: + - subnet: 10.0.0.0/8 + - subnet: 100.64.0.0/10 + - subnet: fc00::/7 + - subnet: fe80::/10 +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIQnpITHlrS0lxZkZXb3dy + UmNMYUhFamtsR2Rpb3BTMXozYjQwQkoxOEhFClFOeDRQV2tTYTBlL09RUS9oMUZG + ZHZwNXVnYzA4dkIyME0rbnc0Zm44SEUKLS0tIDhTNmNMU1ZVeGEwbzltTDdpVVRP + M0FiWEJ2MHIzRkU2WHRxWlo3N0FsNlEKgYVZr+vTicTztpwMQ7oj/yLEk12f/JZX + uMTe29EqIoB7gE/SCG9z+qoLXd4NHrA1lfrLjTDSCYNEhGiDyMhIMQ== + -----END AGE ENCRYPTED FILE----- + recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r + encrypted_regex: ^password$ + lastmodified: "2026-10-30T16:40:35Z" + mac: ENC[AES256_GCM,data:HeBfzNkyaDPxwfMepe0/4U5g0tAUyMf9AZMYly5La46tj8Ap5K4z9jp3tcOR9tADq1nCBhgtIKDiLmrNqOOWLShV1jDVM35hpBDHMpYuJjAGish8pBZUb3TetvSa1fnzOE24JrCZxpaK69q5V9akQzKIlhM/qgRhU7jFqPhyDT8=,iv:8QW9fMoDnME0qsE/TMcpi3zKgl+Oy+9mN8jzRY7XnN4=,tag:gOxsxLzsRPBx8iQjY5RW/A==,type:str] + mac_only_encrypted: true + version: 3.13.3 +--- # 外から入る CI(cilium-drift.yml の OIDC トークン)と人(Entra)の認証。権限の中身は apiserver-rbac.yaml。 apiVersion: v1alpha1 kind: KubeAuthenticationConfig diff --git a/docs/router.md b/docs/router.md index 5d992fa3..7b30954b 100644 --- a/docs/router.md +++ b/docs/router.md @@ -42,7 +42,13 @@ DMZ の向け先を変えると、下の全部と AdGuard の split-horizon が | 3129 TCP | 3proxy の TLS 口(apps/3proxy/) | 外から使うなら要る | | 6443 TCP | Kubernetes の API(`ks.doany.io:6443`。recovery/README.md) | 要る(認証つき) | -Talos の API(50000)は LAN からしか届かない(recovery/README.md)。 +**ノード自身が受けるもの(Talos の API 50000・trustd 50001・etcd・kubelet 10250・Cilium の 4240 / 4244 / 9963 / 9964 など)は、 +ノードの受信の防火壁で外から止めている**(`bootstrap/talos.sops.yaml` の `NetworkDefaultActionConfig` と `NetworkRuleConfig`。 +2026-10-31 に足すまでは DMZ と IPv6 ホスト公開で外から全部届いていた)。既定は捨て、外から通すのは上の表のポートだけ +(TCP 80・443・853・3129・6443・8443、UDP 8443・51820)、内側のアドレス(LAN と Pod・Service の 10/8・NetBird の 100.64/10・ +fc00::/7・fe80::/10)からは全部。効くのはノード宛てだけで、hostPort(53・853・8443・3129・51820)は Cilium が Pod へ転送するので +通らない(なので 53 番は下の Cilium のポリシーで止めている)。表にポートを足すときは `public-tcp` / `public-udp` にも足す。 +家の LAN の IPv6 の GUA はプライベートに入れていないので、LAN からノードの管理の口へは IPv4 で繋ぐ。 ## 53 番は外に出さない @@ -60,7 +66,7 @@ AdGuard の `allowed_clients` で絞らないのは、DoT・DoH にも効いて 再起動で変わってエントリが外れる。NIC を替えても Z440 に移しても、この値は変わらない - **公開する AAAA は静的な `::2`。** cloudflare-ddns の `local.iface.stable:bond0` は一時アドレス以外から選ぶので、SLAAC のアドレスがあると そちらを書いてしまう。`bond0` は `autoconf=0`(bootstrap/talos.sops.yaml)で SLAAC を付けない -- 公開の中身は DMZ と同じ(IPv6 すべて・ポート any)。ノードで受けているものは IPv6 でも全部外に出る +- 公開の中身は DMZ と同じ(IPv6 すべて・ポート any)。ノードで受けているものは IPv6 でも外に出る(ノードの管理の口は IPv4 と同じくノードの防火壁が止める。上の「外からの転送」) - `fj` / `nb` / `m` / `ks` / `lk` などの AAAA はノード(`240f:6d:842b:1::2`)を指すので、**このエントリを消すと IPv6 の利用者から直接つなぐアプリが見えなくなる** - 確かめ方: 別の回線の IPv6 から名前で開く(アドレス直打ちは SNI が無く Gateway が切る)。J:COM 側の PC から `curl -6 -so /dev/null -w "%{http_code} %{remote_ip}\n" https://fj.doany.io/` で `200 240f:6d:842b:1::2` diff --git a/recovery/README.md b/recovery/README.md index 7c735ab7..42fca0b5 100644 --- a/recovery/README.md +++ b/recovery/README.md @@ -50,7 +50,8 @@ talosconfig も管理者の kubeconfig も `bootstrap/talos-secrets.sops.yaml` - **作業用 PC(J:COM 側の LAN)からは 10.10.0.4(eno4)にしか届かない**(10.0.0.2 は届かない)。t.ps1 の行き先はそこに固定してある - iLO(10.0.0.3)の Remote Console(HTML5)で、ブートメニューも maintenance mode の IP も見える。USB だけ物理で挿す -- **GitHub Actions では代わりにならない。** Talos の API(50000)は LAN からしか届かず、CI の OIDC の信頼も +- **GitHub Actions では代わりにならない。** Talos の API(50000)は machine config の受信の防火壁でプライベートのアドレスからしか通さず + ([../docs/router.md](../docs/router.md)「外からの転送」。maintenance mode では防火壁が無い)、CI の OIDC の信頼も machine config を当てて初めてできる ## 1. 鍵を開いて machine config を描く