預計完成時間:1 小時
可操作元件擁有者:NTP技能設定檔:部署工程師
設定叢集時,系統會使用 SyncServer 準確記錄時間,如果時間來源中斷連線,也會使用 SyncServer。根管理員伺服器執行時,可以設定與 SyncServer 搭配運作。
20.1. 設定 SyncServer
cellcfg產生後,即可設定 SyncServer 的 IP。下列步驟需要實際存取 SyncServer。
20.1.1. 判斷 SyncServer IP 位址,以設定 LAN1
找出安裝 SyncServer 的機架專屬
SubnetClaim。舉例來說,如果 SyncServer 安裝在機架aa-bb中,SubnetClaim名稱為aa-bb-mgmtsw01-ntp-os-subnet,且位於根管理叢集的root命名空間中,如要擷取子網路聲明名稱,請執行下列指令:kubectl --kubeconfig ROOT_ADMIN_CLUSTER get subnetclaims -A | grep ntp擷取閘道:
kubectl get subnetclaim SUBNETCLAIM_NAME -n root -o json | jq .status.ipv4SubnetStatus.gateway判斷 IP 和網路遮罩:
kubectl get subnetclaim SUBNETCLAIM_NAME -n root -o json | jq .status.ipv4SubnetStatus.cidrBlock您可以從 CIDR 區塊內的任何免費 IP 位址使用 IP 位址。子網路遮罩是從 CIDR 區塊的 CIDR 前置字串長度轉換而來。建立該 SyncServer 的
TimeServer物件時,請使用為 SyncServer 選擇的 IP 位址,取代變數MANAGEMENT_IP,如「建立 TimeServer 物件」一節所述。
20.1.2. 設定 LAN1 介面的 SyncServer
如要設定 IP 位址,請先開啟 LAN1 介面,這個連接埠可供管理員連線。如要開啟這個介面,請使用裝置正面的鍵盤執行下列動作:
- 存取「選單」。
- 輸入 1-LAN1。
- 輸入 2-On/Off。
- 輸入 1-On。
介面開啟後,您必須設定 IP 位址。使用裝置正面的鍵盤執行下列指令:
- 存取「選單」。
- 輸入 1-LAN1。
- 輸入 1-Configure。
- 輸入 1-IPv4。
- 輸入 1-Static。
20.1.3. 判斷儲存格資源中是否存在 SyncServer LAN2 連線
將儲存格名稱匯出至變數:
export CELL_NAME=$(kubectl get cell -n gpc-system -o jsonpath='{.items[0].metadata.name}')確認 AA 機架的 NTP SyncServer LAN2 端點存在於 Cell 資源中。否則,請在儲存格資源中建立端點:
定義「AA」機架的第一個 NTP 伺服器端點:
export END_A1=$CELL_NAME-aa-torsw01:Eth1/34 export END_B1=$CELL_NAME-aa-ntp01:LAN2定義「AA」機架的第二個 NTP 伺服器端點:
export END_A2=$CELL_NAME-aa-torsw02:Eth1/34 export END_B2=$CELL_NAME-aa-ntp02:LAN2將「AA」機架的第一個 NTP SyncServer 端點從儲存格資源複製到變數:
INDEX1=$(kubectl get cell "$CELL_NAME" -n gpc-system -o json | \ jq '.spec.connections | index( .[] | select(.endA == "'"$END_A1"'" and .endB == "'"$END_B1"'") )')列印
INDEX1變數的輸出內容:echo $INDEX1如果
INDEX1的輸出內容為空白,請為第一個 SyncServer 裝置建立修補程式:kubectl patch cell "$CELL_NAME" -n gpc-system --type=json \ -p='[{"op": "add", "path": "/spec/connections/-", "value": {"endA": "'"$END_A1"'", "endB": "'"$END_B1"'"}}]'將「AA」機架的第二個 NTP SyncServer 端點從儲存格資源複製到變數:
INDEX2=$(kubectl get cell "$CELL_NAME" -n gpc-system -o json | \ jq '.spec.connections | index( .[] | select(.endA == "'"$END_A2"'" and .endB == "'"$END_B2"'") )')列印
INDEX2變數的輸出內容:echo $INDEX2如果
INDEX2的輸出內容為空白,請為第二部 SyncServer 裝置建立修補程式:kubectl patch cell "$CELL_NAME" -n gpc-system --type=json \ -p='[{"op": "add", "path": "/spec/connections/-", "value": {"endA": "'"$END_A2"'", "endB": "'"$END_B2"'"}}]'
確認 AC 機架的 NTP SyncServer LAN2 端點存在於儲存格資源中。否則,請在儲存格資源中建立端點:
定義「AC」機架的第一個 NTP 伺服器端點:
export END_A1=$CELL_NAME-ac-torsw01:Eth1/34 export END_B1=$CELL_NAME-ac-ntp01:LAN2定義「AC」機架的第二個 NTP 伺服器端點:
export END_A2=$CELL_NAME-ac-torsw02:Eth1/34 export END_B2=$CELL_NAME-ac-ntp02:LAN2將「AC」機架的第一個 NTP SyncServer 端點從儲存格資源複製到變數:
INDEX1=$(kubectl get cell "$CELL_NAME" -n gpc-system -o json | \ jq '.spec.connections | index( .[] | select(.endA == "'"$END_A1"'" and .endB == "'"$END_B1"'") )')列印
INDEX1變數的輸出內容:echo $INDEX1如果
INDEX1的輸出內容為空白,請為第一個 SyncServer 裝置建立修補程式:kubectl patch cell "$CELL_NAME" -n gpc-system --type=json \ -p='[{"op": "add", "path": "/spec/connections/-", "value": {"endA": "'"$END_A1"'", "endB": "'"$END_B1"'"}}]'將「AC」機架的第二個 NTP SyncServer 端點從儲存格資源複製到變數:
INDEX2=$(kubectl get cell "$CELL_NAME" -n gpc-system -o json | \ jq '.spec.connections | index( .[] | select(.endA == "'"$END_A2"'" and .endB == "'"$END_B2"'") )')列印
INDEX2變數的輸出內容:echo $INDEX2如果
INDEX2的輸出內容為空白,請為第二部 SyncServer 裝置建立修補程式:kubectl patch cell "$CELL_NAME" -n gpc-system --type=json \ -p='[{"op": "add", "path": "/spec/connections/-", "value": {"endA": "'"$END_A2"'", "endB": "'"$END_B2"'"}}]'
20.1.4. 判斷 SyncServer IP 位址,以設定 LAN2
擷取閘道:
kubectl get subnetclaim ntp-dataplane-subnet -n root -o json | jq .status.ipv4SubnetStatus.gateway判斷 IP 位址和網路遮罩:
kubectl get subnetclaim ntp-dataplane-subnet -n root -o json | jq .status.ipv4SubnetStatus.cidrBlock您可以從 CIDR 區塊內的任何免費 IP 位址,設定每個 SyncServer 裝置。網路遮罩是從 CIDR 區塊的 CIDR 前置字串長度轉換而來。為 SyncServer 選擇的 IP 位址會取代變數
DATA_IP,用於為「建立 TimeServer 物件」中定義的 SyncServer 建立TimeServer物件。
20.1.5. 設定 LAN2 介面的 SyncServer
如要設定 IP 位址,您必須開啟 LAN2 介面,也就是允許管理員連線的通訊埠。如要開啟這個介面,請使用裝置正面的鍵盤執行下列動作:
- 存取「選單」。
- 輸入 1-LAN2。
- 輸入 2-On/Off。
- 輸入 1-On。
介面開啟後,請在鍵盤上執行下列指令來設定 IP 位址:
- 存取「選單」。
- 輸入 1-LAN2。
- 輸入 1-Configure。
- 輸入 1-IPv4。
- 輸入 1-Static。
20.1.6. 圖形使用者介面 (GUI)
使用 HTTPS 連線至 GUI。
20.1.7. 變更管理員密碼
設定 IP 位址後,只要在瀏覽器中輸入 IP 位址,即可存取網頁介面。
- 預設使用者名稱為「admin」。
- 預設密碼為 Microsemi。
使用者首次登入時,系統會要求他們變更預設密碼。建立自訂密碼時,唯一的要求是密碼長度必須介於 16 到 64 個字元之間。
儲存新的登入資訊,以備不時之需。
20.1.8. 使用 GUI 升級韌體
按照「手動升級 SyncServer」一文的說明升級韌體。
20.1.9. 設定 CLI 工作階段逾時
使用先前產生的 IP 和憑證,透過 SSH 連線至 SyncServer
ssh $SYNCSERVER_USERNAME@$SYNCSERVER_IP
在終端機中輸入下列指令,將登入工作階段逾時時間設為 30 分鐘:
set-session-timeout
SyncServer CLI 會提示您輸入以秒為單位的值:
Timeout ( 0 - 86400 sec):
輸入 1800,然後按下 Enter。預期的回覆:
1800 sec timeout set successfully
結束工作階段:
logout
20.2. 設定 SyncServer 時間
每部 SyncServer 必須設定相同的時間。這包括取得外部時間來源 (例如手機),手動設定啟動程式上的時鐘。
20.2.1. 建立 TimeServer 物件
將 SyncServer 的登入憑證記錄為 Kubernetes 密鑰。使用者名稱和密碼必須以 base64 編碼字串的形式輸入:
kubectl create secret generic \ --namespace=ntp-system syncserver-user-login-DEVICE_NAME \ --from-literal=username=SYNCSERVER_USERNAME \ --from-literal=password=SYNCSERVER_PASSWORD \ --from-literal=pin=SYNCSERVER_PIN更改下列內容:
DEVICE_NAME:裝置的專屬名稱或 ID。這個值用於建立不重複的 Kubernetes 密鑰名稱。SYNCSERVER_USERNAME:與 SyncServer 進行驗證時所需的使用者名稱。SYNCSERVER_PASSWORD:與SYNCSERVER_USERNAME對應的密碼,用於驗證。SYNCSERVER_PIN:SyncServer 要求的 PIN 碼。
使用管理網路上的 SyncServer IP 位址建立
TimeServer物件:kubectl apply -f - <<EOF apiVersion: system.private.gdc.goog/v1alpha1 kind: TimeServer metadata: name: syncserver-s650-DEVICE_NAME-manual namespace: ntp-system spec: network: address: MANAGEMENT_IP adminCredentialsRef: name: syncserver-user-login-DEVICE_NAME namespace: ntp-system EOF將
MANAGEMENT_IP替換為管理網路中 SyncServer 的 IP 位址。
20.2.2. 在啟動程式上設定時鐘
取得目前的世界標準時間日期和時間,並在啟動程序上設定:
date -s '2024-10-23 13:23:13'
請先確認手機或筆電的目前日期是否正確,再繼續操作:
$ date
Wed 23 Oct 2024 01:23:15 PM UTC
20.2.3. 設定 SyncServer 時間
首先,請執行下列指令,指定正確的叢集:
export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
然後,從發布構件執行下列指令碼,將時間從啟動程式轉移至 SyncServers:
python3 scripts/manage_syncserver_time.py --update-time
如要查看時間但不變更,請執行:
python3 scripts/manage_syncserver_time.py --check-time
current time: 2024-10-23 16:54:11
10.200.0.2 time: 2024-10-23 16:54:09
10.200.0.3 time: 2024-10-23 16:54:09
20.2.4. 設定 SyncServer 時區
在 SyncServer GUI 中,依序前往「Timing」>「Timezone」,確認已為您的宇宙設定正確時區。
20.2.5. 將 SyncServer 新增至 NTPRelay
選擇其中一個 SyncServer IP 位址,並新增至根管理員:
NTPRelaykubectl edit ntprelay -n gpc-system必須將 SyncServer IP 位址新增至
.spec.upstreamServers,如下所示:apiVersion: system.private.gdc.goog/v1alpha1 kind: NTPRelay metadata: name: ntp-relay ... spec: upstreamServers: - 203.0.113.2儲存這些變更,並確認設定正確:
kubectl get ntprelay -n gpc-system -oyaml ... spec: upstreamServers: - 203.0.113.2大約 5 分鐘後,確認 NTP Pod 是否已與 SyncServer 同步:
kubectl get pods -l app.kubernetes.io/name=ntp -n ntp-system -o name | xargs -I {} kubectl exec {} -n ntp-system -- chronyc sources輸出內容應包含 SyncServer IP,且每行都有
^*做為MS。
20.3. 簽署 SyncServer 網頁介面的憑證
每個 SyncServer 都需要以各自的金鑰簽署的個別憑證。 您無法為所有 SyncServer 使用相同的簽署憑證。
20.3.1. 下載憑證簽署要求
在 SyncServer 使用者介面中建立 CSR:

為 CSR 設定下列資訊:

按一下下載按鈕,並將檔案名稱指派給這個變數:
export SYNCSERVER_CSR=
20.3.2. 簽署憑證
以 Base64 編碼憑證:
export ENCODED_CERT=$(cat $SYNCSERVER_CSR | base64 -w 0)找出根管理員叢集的
kubeconfig路徑:export KUBECONFIG=KUBECONFIG_PATH建立 CertificateRequest:
kubectl --kubeconfig ${KUBECONFIG:?} apply -f - <<EOF apiVersion: cert-manager.io/v1 kind: CertificateRequest metadata: name: root-admin-syncserver-cr namespace: gpc-system spec: request: '${ENCODED_CERT}' isCA: false usages: - server auth duration: 2160h issuerRef: name: internal-root-ca-issuer kind: ClusterIssuer EOF
查看憑證要求狀態:
kubectl --kubeconfig ${KUBECONFIG:?} get certificaterequest root-admin-syncserver-cr -n gpc-system -o json | jq '.status.conditions'您必須看到憑證成功獲得核准,輸出內容類似如下:
[ { "lastTransitionTime": "2023-01-01T12:59:59Z", "message": "Certificate request has been approved by cert-manager.io", "reason": "cert-manager.io", "status": "True", "type": "Approved" }, { "lastTransitionTime": "2023-01-01T12:59:59Z", "message": "Certificate fetched from issuer successfully", "reason": "Issued", "status": "True", "type": "Ready" } ]如果 1 分鐘後未看到預期輸出內容,請將問題提報給工程團隊進行偵錯。
將憑證放入檔案。您必須為已簽署的憑證定義名稱:
export SIGNED_CERT_NAME= export CERT_CHAIN=從 CertificateRequest 擷取憑證:
kubectl --kubeconfig ${KUBECONFIG:?} get certificaterequest root-admin-syncserver-cr -n gpc-system -o json | jq -r '.status.certificate' | base64 --decode > $SIGNED_CERT_NAME kubectl --kubeconfig ${KUBECONFIG:?} get certificaterequest root-admin-syncserver-cr -n gpc-system -o json | jq -r '.status.ca' | base64 --decode > $CERT_CHAIN
20.3.3. 在 SyncServer 上安裝憑證
在 SyncServer 使用者介面中,依序前往「Security」>「x.509 Install」。
在「Install CA-Signed Certificates」(安裝 CA 簽署的憑證) 中找到「manual-cert」,然後按一下「Install」(安裝)。
選取「憑證和鏈結」。
- 在「憑證」中上傳
$SIGNED_CERT_NAME。 - 上傳
$CERT_CHAIN中的憑證鏈結。 - 為這兩項憑證選取「PEM」做為編碼類型。
- 按一下 [安裝]。
- 在「憑證」中上傳
依序前往「Security」(安全性) >「X.509 Mapping」(X.509 對應)
- 在 HTTPS 下拉式清單中選取「manual-cert」,然後按一下「套用」。
20.4. 設定 NTP 加密
請按照 NTP-P0001 - 設定 NTP 加密操作。
20.5. 設定 PANW NTP 驗證
在本節中,您將設定 PANW NTP 驗證。您將列出不同的防火牆、判斷哪些金鑰已指派給 NTPRelay、找出已使用和未使用的金鑰 ID,並產生對稱金鑰。您必須為每種防火牆類型執行一次本節中的步驟,因此總共要執行兩次。
20.5.1. 設定環境變數並指派防火牆類型
Distributed Cloud 提供兩種 PANW 防火牆:
- IDPS:入侵偵測防禦系統。
- 周邊:周邊防火牆。
針對每個防火牆類型,重複執行下列步驟:idps 和 perimeter。
使用防火牆類型來設定環境變數:
export FW_TYPE=<idps|perimeter>
20.5.2. 手動建立對稱金鑰
完成「手動建立對稱金鑰」中的其餘步驟,直到「在 fw-system 中建立使用防火牆所用對稱金鑰的密鑰」。執行兩次指令,一次是針對防火牆類型 idps,另一次是針對防火牆類型 perimeter。
20.5.2.1. 找出未使用的金鑰 ID 並指派給變數
找出根管理員叢集的
kubeconfig路徑:export KUBECONFIG=KUBECONFIG_PATH export NTPRELAY_NAME=$(kubectl --kubeconfig ${KUBECONFIG:?} -n gpc-system get ntprelay -o jsonpath='{.items[0].metadata.name}')將
KUBECONFIG_PATH替換為根管理員叢集的kubeconfig路徑。執行下列
kubectl指令,列出NTPRelay目前使用的金鑰:kubectl --kubeconfig ${KUBECONFIG:?} get ntprelay $NTPRELAY_NAME -n gpc-system -o json | jq '.spec | {downstreamSymmetricKeys}'金鑰 ID 為整數。您可以使用
NTPRelay的downstreamSymmetricKeysspec欄位中未列出的任何 ID。將未使用的金鑰 ID 指派給NTP_KEY_ID變數:export NTP_KEY_ID=NTP_KEY_ID<>將
NTP_KEY_ID替換為未使用的金鑰 ID 整數值。
20.5.2.2. 產生對稱金鑰
使用下列
chronyckeygen指令產生SHA-1金鑰。您必須在啟動程式上執行這項指令:CHRONY_OUTPUT=$(chronyc keygen ${NTP_KEY_ID:?} SHA1)輸出看起來類似以下內容:
$ echo $CHRONY_OUTPUT 99 SHA1 HEX:6CDDCC99D390226D4D5CD14D8CBE40E9852BDFFB使用 chrony 輸出內容的部分資訊,設定下列變數:
export NTP_KEY_ENCODING=$(echo ${CHRONY_OUTPUT:?} | awk '{ split($3,key,":"); print key[1]}') export NTP_KEY_STR=$(echo ${CHRONY_OUTPUT:?} | awk '{ split($3,key,":"); print key[2]}') export NTP_KEY_TYPE=$(echo ${CHRONY_OUTPUT:?} | awk '{ print $2 }')將金鑰附加至 NTP-P0001 - 設定 NTP 加密期間建立的 syncserver 金鑰檔案。
echo "${NTP_KEY_ID:?} ${NTP_KEY_TYPE:?} ${NTP_KEY_STR:?}" >> syncserver_keyfile.txt
20.5.3. 建立密鑰來保存金鑰
定義將保存金鑰的密鑰名稱:
export NTP_KEY_NAME=${FW_TYPE:?}-fw-ntp-symmectric-key執行下列
kubectl指令,建立含有金鑰資訊的密鑰:kubectl --kubeconfig ${KUBECONFIG:?} create -n ntp-system -f - <<EOF apiVersion: v1 kind: Secret metadata: generateName: ${NTP_KEY_NAME:?} stringData: keyStr: ${NTP_KEY_STR:?} EOF
20.5.3.1. 更新 NTPRelay,將密鑰做為 DownstreamSymmetricKeys 使用
將金鑰資訊修補到
NTPRelay:kubectl --kubeconfig ${KUBECONFIG:?} patch ntprelay/${NTPRELAY_NAME:?} -n gpc-system \ --patch '{"spec": {"downstreamSymmetricKeys": [{"id": '${NTP_KEY_ID:?}',"type": \ "'${NTP_KEY_TYPE:?}'","encoding": "'${NTP_KEY_ENCODING:?}'","keyRef": {"name": \ "'${NTP_KEY_NAME:?}'","namespace": "ntp-system"}}]}}' --type merge重新啟動
NTPRelay以偵測變更:sleep 5; kubectl --kubeconfig ${KUBECONFIG:?} delete pod -n ntp-system -l app.kubernetes.io/name=ntp
20.5.4. 使用防火牆在 fw-system 中使用的對稱式金鑰建立密鑰
為防火牆建立另一個對稱式金鑰密碼。這個對稱金鑰密鑰與您在「手動建立對稱金鑰」一節中建立的密鑰不同,後者位於 ntp-system 命名空間。不過,這個密鑰會包含相同的對稱金鑰和金鑰 ID。
20.5.4.1. 取得防火牆節點內部名稱
取得
firewallnodeinternal節點名稱:kubectl --kubeconfig ${KUBECONFIG:?} get firewallnodeinternal -n gpc-system -l \ firewall.private.gdc.goog/type=$FW_TYPE輸出內容會列出兩個
firewallnodeinternal節點名稱。針對每個firewallnodeinternal節點名稱,完成「定義密鑰名稱」一節中的步驟。
20.5.4.2. 定義密鑰名稱
定義要保存金鑰的密鑰名稱:
export NTP_KEY_NAME=FW_NODE_INTERNAL_NAME-ntp-symmectric-key-enc將
FW_NODE_INTERNAL_NAME替換為內部防火牆節點名稱。建立密鑰,並為每個內部防火牆節點名稱新增標籤:
kubectl --kubeconfig ${KUBECONFIG:?} create secret generic \ --namespace=fw-system $NTP_KEY_NAME \ --from-literal=keyStr=$NTP_KEY_STR \ --from-literal=keyID=$NTP_KEY_ID \ && kubectl --kubeconfig ${KUBECONFIG:?} label secret $NTP_KEY_NAME \ -n fw-system 'system.private.gdc.goog/credential-type=firewall-ntp-auth-key' \ 'system.private.gdc.goog/credentialid=FW-0010'您可以使用下列
kubectl指令查看Secret資源:kubectl --kubeconfig ${KUBECONFIG:?} get secret --namespace=fw-system $NTP_KEY_NAME -o yamlSecret類似以下範例:apiVersion: v1 kind: Secret data: keyStr: 075A077BA4BEDF1F8B714665ABD271BA1C18617E keyID: 1 metadata: name: $NTP_KEY_NAME namespace: fw-system確認每個內部防火牆節點都具備一個主金鑰和一個 NTP 驗證金鑰。
針對每個內部防火牆節點,在
spec.credentials中附加密鑰,並將full-config-replace值設為true:kubectl patch --kubeconfig ${KUBECONFIG:?} firewallnodeinternal/FW_NODE_INTERNAL_NAME -n gpc-system --type json -p '[{"op": "add", "path": "/spec/credentials/-", "value": {"credentialRef": {"name": "'"${NTP_KEY_NAME:?}"'", "namespace": "fw-system"}, "credentialType": "NTPAuthKey"}}]'# Get the current annotation value CURRENT_VALUE=$(kubectl get firewallnodeinternal/FW_NODE_INTERNAL_NAME -n gpc-system -o json | jq -r '.metadata.annotations."firewall.private.gdc.goog/full-config-replacement-needed"') # Check if the annotation is "false" if [[ "$CURRENT_VALUE" == "false" ]]; then # Patch the annotation to "true" kubectl patch firewallnodeinternal/FW_NODE_INTERNAL_NAME -n gpc-system --type merge -p '{"metadata": \ {"annotations": {"firewall.private.gdc.goog/full-config-replacement-needed": "true"}}}' fi
20.5.4.3. 將金鑰檔案上傳至 SyncServer
- 針對每個 SyncServer,在 SyncServer UI 的
Dashboard -> Security -> NTPd Symmetric Keys下,上傳先前建立的對稱式安全金鑰檔案syncserver_keyfile.txt

20.6. 在 SyncServer 上自訂登入橫幅
在 SyncServer UI 中,依序前往「Admin」>「Banner Config」。
從「已停用」、「USG」或「客戶橫幅」中選取橫幅設定。
在橫幅設定選單中,選取「已停用」、「USG」或「客戶橫幅」。
如果選取「Customer Banner」(客戶橫幅),請在「Customer Banner」(客戶橫幅) 方塊中,輸入客戶問卷調查 (CIQ) 中的文字值:systemUseNotification > banner。詳情請參閱「客戶問卷調查」。
勾選「Apply the banner for CLI Login」(為 CLI 登入套用橫幅) 核取方塊。
按一下 [套用]。