2026 年每日通報的 CVE 數量比前一年多 131%。
← 返回術語表

對外連線政策

對外連線(egress)政策依目的地、通訊協定與連接埠,定義系統可以建立哪些對外網路連線,以及其他連線如何處理。

最後更新:2026年11月11日

對外連線(egress)政策依目的地(網域或 IP 範圍)、通訊協定與連接埠,定義系統可以建立哪些對外網路連線,以及其他連線如何處理。egress 過濾是指由防火牆、Proxy 或網路政策執行這類政策。egress 防火牆則是負責執行的設備或功能。

預設允許與預設拒絕

預設允許的政策會封鎖一份已知惡意目的地清單,其餘一律放行。預設拒絕的政策則允許一份已知安全目的地清單,其餘一律封鎖。Kubernetes 也是如此:在網路政策針對 egress 選取某個 pod 之前,該 pod 可以連到任何地方;一旦被選取,就只能建立該政策允許的連線(Kubernetes network policies)。

只有預設拒絕能阻擋流向無人預料到的目的地的流量,而攻擊者的伺服器正是這種目的地。代價在於維運:必須建立允許清單,並持續保持更新。

Kubernetes 上的預設拒絕 egress 政策

Kubernetes 文件提供了以下政策,它會選取命名空間中的每個 pod,且不允許任何 egress(Kubernetes network policies):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes:
    - Egress

這項政策也會封鎖 DNS,因此需要解析名稱的工作負載,還需要第二項政策來允許連往叢集 DNS 服務的 egress。之後每個允許的目的地,都要再以另一項政策依 pod、命名空間或 IP 範圍(ipBlock)加入。

以 FQDN 為基礎的政策

標準的 NetworkPolicy 比對的是 pod、命名空間與 IP 範圍,而非網域名稱。套件登錄庫位於位址會變動的內容傳遞網路(CDN)之後,因此針對它們的允許清單要以名稱撰寫,也就是部分網路外掛提供的 FQDN 政策。Cilium 的 toFQDNs 規則以 matchName 比對完整名稱、以 matchPattern 比對萬用字元,並從其 DNS Proxy 看到的 DNS 回應學習位址(Cilium DNS-based policies)。Calico Cloud 與 Calico Enterprise 則在 egress 允許規則中列出 domains(Calico DNS policy)。

CI 為何需要對外連線政策

建置作業持有部署金鑰、雲端憑證與權杖,並會執行所下載套件中的安裝腳本。遭入侵的相依套件可以把這些機密送到 CI 執行器能連到的任何地方,這正是 CI 中發生權杖外洩的方式。大多數執行器預設允許所有對外流量。

以一個會把作業環境變數 POST 到未知主機的 npm postinstall 腳本為例。若採用只允許 npm 登錄庫與您的建置產物儲存區的預設拒絕政策,該請求就會失敗,機密也會留在作業之內。

政策封鎖連線時,建置會看到什麼

連線會失敗,建置回報的是一般的網路錯誤。視政策執行的位置而定,可能是連線遭拒或重設、逾時、DNS 查詢失敗或 TLS 交握錯誤,且往往發生在套件管理工具重試之後。對開發人員來說,這看起來就像登錄庫不穩定,因此良好的對外連線政策會記錄每一筆遭封鎖的連線,以及其目的地和封鎖原因。

評估重點

  • 具類型的目的地。 套件登錄庫以來源名稱指定,而不只是 IP 位址,因為登錄庫位於位址會變動的 CDN 之後。
  • 在作業開始前驗證,讓有問題的政策明確失敗,而不是只套用一半。
  • 失效即封鎖(fail closed),在無法執行政策時,作業不會在毫無防護的情況下執行。

如何在 GitHub Actions 中導入,請參閱 GitHub Actions 對外連線政策。

CRACI

CRACI 在執行器上執行對外連線政策,可選擇預設拒絕或允許,內建 24 種軟體來源預設組合,並支援 npm、PyPI、apt、apk、Go proxy、Nix、Cargo、OCI 登錄庫,以及透過 HTTPS 與 SSH 存取的 Git 等具類型的自訂來源。政策會在作業開始前驗證,並且失效即封鎖,違規時會發出警示。同一個作業也會記錄哪些套件是經由允許的連線取得。請參閱執行器安全比較。

當 CRACI 的政策封鎖連線時,作業看到的是一般的失敗,例如 403 Forbidden、連線重設、EOF 或 TLS 交握失敗;作業的網路追蹤則會將該連線列在 Proxy 違規之下並附上原因,例如當沒有任何預設組合、來源或規則符合目的地時顯示 no_match。追蹤資料會在作業執行期間即時串流到作業檢視畫面,也可以透過 API 取得(CRACI 文件:偵錯網路問題)。

若要對 Kubernetes 工作負載、伺服器或您自行維護的 GitHub 託管執行器進行對外連線控管,請使用網路政策、雲端防火牆或執行器代理程式:CRACI 只在自己的執行器上執行其政策,而封鎖前的稽核模式已列入產品藍圖。