使用网络策略控制流量
经典仪表盘
此网络策略信息仅适用于经典集群。 有关 VPC 集群的网络策略信息,请参阅 使用安全组控制流量。
每个 Red Hat® OpenShift® on IBM Cloud® 集群都随附一个名为 Calico的网络插件。 默认网络策略可保护集群中每个工作节点的公共网络接口。
您可以使用 Calico 和 Kubernetes 为集群创建网络策略。 通过 Kubernetes 网络策略,可以指定要允许或阻止进出集群中 pod 的网络流量。 要设置更高级的网络策略(例如阻止流至网络负载均衡器 (NLB) 服务的入站(流入)流量),请使用 Calico 网络策略。
- Kubernetes 网络策略
- Kubernetes 网络政策规定了Pod如何与其他Pod以及外部端点进行通信。 根据协议,端口以及源或目标 IP 地址,允许或阻止入局和出局网络流量。 还可以根据 pod 和名称空间标签对流量进行过滤。 您可以使用
oc
命令或 Kubernetes API 来应用 Kubernetes 网络策略。 - Calico 网络政策
- Calico 网络策略 是一组 Kubernetes 网络策略。 您可以使用
calicoctl
命令行来应用 Calico 策略。 Calico 策略添加了以下功能。- 允许或阻止特定网络接口上的网络流量,而不考虑 Kubernetes pod 源或目标 IP 地址或 CIDR。
- 允许或阻止跨名称空间的 pod 的网络流量。
- 阻止流至 Kubernetes LoadBalancer 或 NodePort 服务的入站流量。
Calico 通过设置 Iptables 规则作为工作程序节点的防火墙来强制实施这些策略,包括任何 Kubernetes 网络策略,以定义网络流量必须满足才能转发到目标资源的特征。
在 OpenShift Container Platform V 4 中,Calico 基于 Kubernetes 数据存储驱动程序。 有关更多信息,请参阅 Calico 文档。
默认的 Calico 网络策略
创建具有公用 VLAN 的集群时,会自动为每个工作程序节点及其公用网络接口创建具有 HostEndpoint
标签的 ibm.role: worker_public
资源。 除非选择 ibm.role: worker_public
标签的 Calico 策略特别允许,否则此 HostEndpoint
会导致删除所有进出公用网络接口的流量。
还会自动为每个工作程序节点及其专用网络接口创建带有 ibm.role: worker_private
标签的 HostEndpoint
资源。 将创建缺省 allow-all-private-default
策略,以便允许所有流量进出专用网络接口。 此 HostEndpoint
使集群用户能够通过创建 Calico 策略来进一步限制专用网络流量,这些策略选择 ibm.role: worker_private
并具有比 allow-all-private-default
更低的订单号。"
这些默认的 Calico 主机策略允许所有公共出站网络流量,并允许公共入站流量进入特定的集群组件,例如 Kubernetes NodePort, LoadBalancer, 和入口服务。 缺省情况下,allow-all-private-default
策略允许所有专用流量。 任何其他从互联网到您的工作节点的网络流量,如果不在默认策略中指定,都会被阻止。 缺省策略不会影响 pod 到 pod 的流量。
请勿从集群中除去缺省策略,因为将在下一次集群主刷新或主更新时重新创建这些策略。 如果要进一步限制流量,请应用较低顺序的 Calico 策略来阻止流量。 请确保您完全了解要阻止的内容,并且集群组件不需要要阻止的流量。
查看自动应用于集群的以下缺省 Calico 主机策略。
Calico 策略 | 描述 |
---|---|
allow-all-outbound |
允许公用网络上的所有出站流量。 |
allow-all-private-default |
允许专用网络上的所有入站和出站流量。 |
allow-bigfix-port |
允许端口 52311 的入局流量流至 BigFix 应用程序,以允许执行必需的工作程序节点更新。 |
allow-icmp |
允许入局 ICMP 包 (ping)。 |
allow-node-port-dnat |
允许入局网络负载均衡器 (NLB)、Ingress 应用程序负载均衡器 (ALB) 和 NodePort 服务流量流至这些服务公开的 pod。 注意:您无需指定暴露的端口,因为 Kubernetes 使用目标网络地址转换(DNAT)将服务请求转发到正确的容器。 这一转发过程在 Iptables 中应用主机端点策略之前执行。 |
allow-sys-mgmt |
允许用于管理工作程序节点的特定 IBM Cloud 基础架构系统的入局连接。 |
allow-vrrp |
允许VRRP数据包在多个工作节点之间监控和移动虚拟IP地址。 |
安装和配置 Calico CLI
要查看、管理和添加 Calico 策略,请安装并配置 Calico CLI。
-
设置集群的上下文以运行 Calico 命令。
-
Red Hat OpenShift V 4.6 和更高版本:
- 下载
kubeconfig
配置文件,用于您的集群。ibmcloud oc cluster config --cluster <cluster_name_or_ID>
- 将
DATASTORE_TYPE
环境变量设置为kubernetes
。export DATASTORE_TYPE=kubernetes
- 下载
-
-
如果企业网络策略使用代理或防火墙阻止从本地系统访问公共端点,请允许通过 Calico 命令进行 TCP 访问。
-
执行以下步骤以安装
calicoctl
命令行工具。-
Linux 和OS X
-
下载与您的操作系统匹配的 Calico CLI 版本。 对于 OS X,您可能需要通过浏览至 系统首选项 > 安全与隐私 > 常规来手动允许打开和运行下载的文件。
-
将文件移动到
/usr/local/bin
目录。mv <filepath>/<filename> /usr/local/bin/calicoctl
-
使该文件成为可执行文件。
chmod +x /usr/local/bin/calicoctl
-
确保
/etc/calico
目录中没有旧的 Calico 配置文件calicoctl.cfg
。 如果/etc/calico/calicoctl.cfg
文件存在,请将其删除。
-
-
Windows
-
下载 Calico CLI。 保存文件时,将其重命名为
calicoctl.exe
,并将其保存在 IBM Cloud CLI 所在的目录中。 通过此设置,您在以后运行命令时,可减少一些文件路径更改操作。 -
将
KUBECONFIG
环境变量设置为在步骤 1 中找到的网络配置文件。export KUBECONFIG=./.bluemix/plugins/container-service/clusters/<cluster_name>-<hash>/calicoctl.cfg
-
-
-
验证 Calico 配置是否在正常运行。
calicoctl get nodes
示例输出
NAME 10.176.48.106 10.176.48.107 10.184.58.23 10.184.58.42 ...
不支持更改 Calico 插件,组件或缺省 Calico 设置。 例如,不要部署新的 Calico 插件版本,或者修改 Calico 组件,缺省 IPPool
资源或 Calico 节点的守护程序集或部署。 相反,您可以遵循文档来 更改 Calico MTU 或 禁用 Calico CNI 的端口映射插件 (如果需要)。
查看网络策略
查看应用于集群的缺省策略及添加的任何网络策略的详细信息。
开始之前,安装和配置 Calico CLI,并设置集群的上下文以运行 Calico 命令。
-
查看 Calico 主机端点。
calicoctl get hostendpoint -o yaml
-
查看为集群创建的所有 Calico 网络策略。 这份清单中包括可能不适用于任何Pod或主机的政策。 要实施 Calico 策略,必须存在与 Calico 网络策略中的选择器匹配的 Kubernetes pod 或 Calico
HostEndpoint
。网络策略适用于特定的命名空间:
calicoctl get NetworkPolicy --all-namespaces -o wide
全球网络政策不适用于特定命名空间:
calicoctl get GlobalNetworkPolicy -o wide
-
查看网络策略的详细信息。
calicoctl get NetworkPolicy -o yaml <policy_name> --namespace <policy_namespace>
-
查看集群的所有全局网络策略的详细信息。
calicoctl get GlobalNetworkPolicy -o yaml
添加网络策略
通常,缺省策略不需要更改。 只有高级场景可能需要更改。 如果发现必须进行更改,可以创建您自己的网络策略。
要创建 Kubernetes 网络策略,请参阅 Kubernetes 网络策略文档。
要创建 Calico 策略,请使用以下步骤。 开始之前,安装和配置 Calico CLI,并设置集群的上下文以运行 Calico 命令。
-
通过创建配置脚本(
.yaml
)并使用 Calico v3 策略语法,定义您的 Calico 网络策略或 全局网络策略。 这些配置文件包含选择器,用于描述这些策略应用于哪些 pod、名称空间或主机。 -
将策略应用于集群。 如果您有 Windows 系统,请包含
--config=<filepath>/calicoctl.cfg
选项。calicoctl apply -f policy.yaml [--config=<filepath>/calicoctl.cfg]
请注意,Calico 和 Kubernetes 网络策略仅阻止新连接,它们不会中断应用策略之前存在的连接。 因此,在应用新的或已更改的策略后,要测试它是否正在工作,并且不阻止超过它应该执行的操作,请执行以下操作:
-
重新启动可能受策略影响的任何 pod。 最好还是重新启动所有 Pod,以防您没有正确的选择器,它影响的程度超过您想象的程度。
-
运行
ibmcloud ks cluster master refresh -c CLUSTER-ID
以重新启动集群主 pod。 这将中断从 kubelet 和其他组件到主节点的现有连接,并强制它们重新连接。 这将显示新策略和已更改的策略是否阻止与主组件的任何必需连接。 -
尝试连接到 Red Hat OpenShift on IBM Cloud 控制台,以确保策略更改不会阻止这些组件所需的连接。
控制流至 NLB 或 NodePort 服务的入站流量
默认情况下,Kubernetes NodePort 和 LoadBalancer 服务使您的应用程序可在所有公共和私有集群接口上使用。 但是,您可以使用 Calico 策略基于流量源或目标,阻止流至服务的入局流量。
由于为 Kubernetes NodePort 和 LoadBalancer 服务生成的DNAT Iptables规则,默认的 Kubernetes 和 Calico 政策很难用于保护这些服务。 但是,DNAT 前策略会阻止指定流量到达应用程序,因为这些策略会在 Kubernetes 使用常规 DNAT 将流量转发到 pod 之前,生成并应用 Iptables 规则。
Calico DNAT 前网络策略的一些常见用途:
- 阻止流量流至专用网络负载均衡器 (NLB) 服务的公共节点端口:NLB 服务通过 NLB IP 地址和端口使应用程序可用,并通过服务的节点端口使应用程序可用。 对于集群内的每个节点,在每个 IP 地址(公共和专用)上都可以访问节点端口。
- 阻止流量流至运行边缘工作程序节点的集群上的公共节点端口:阻止节点端口可确保边缘工作程序节点是处理入局流量的唯一工作程序节点。
- 阻止来自特定源IP地址或CIDR的流量
- 仅允许来自特定源IP地址或CIDR的流量,并阻止所有其他流量
要了解如何允许或阻止源IP地址,请尝试 使用 Calico 网络策略阻止流量的教程。
用于限制公用或专用网络流量的 Calico 策略示例
我们提供了一组示例 Calico 公用网络策略,用于进一步限制集群工作程序上的公用/专用网络流量。 这些策略允许群集部署所需的流量,并阻止某些其他流量。
这些政策并不是为了阻挡一切,也不一定能独自满足任何合规要求。 它们旨在作为起点,必须进行编辑以满足您的独特用例。 有关更多信息,请参阅 自述文件。
每当启用 Red Hat OpenShift on IBM Cloud 和其他 IBM Cloud 的新位置时,都会将这些位置的子网添加到 Calico 策略中。 确保 监视 GitHub 存储库 以获取这些策略的任何更新。
请注意,我们不再建议在以下公共和专用网络策略部分使用 allow-egress-pods-public、allow-public-services-pods、allow-openshift-console、allow-kube-system-to-olm、allow-openshift-metrics、allow-egress-pods-private 或 allow-private-services-pods 示例策略。 这些策略控制着群集中所有 pod 的出口。 如果你想控制 pod 之间的流量,你应该使用 Kubernetes NetworkPolicy,并针对特定的命名空间和 pod,而不是使用这些对每个 pod 都一视同仁的一揽子策略。
应用公用网络策略
开始之前,安装和配置 Calico CLI,并设置集群的上下文以运行 Calico 命令。
-
克隆
IBM-Cloud/kube-samples
存储库。git clone https://github.com/IBM-Cloud/kube-samples.git
-
将目录更改为集群所在地区的公共政策目录。 美国南部集群的示例命令:
cd <filepath>/IBM-Cloud/kube-samples/calico-policies/public-network-isolation/us-south
-
请查看每个策略以了解您可能需要进行的任何更改。 例如,可能需要编辑
allow-ibm-ports-public.yaml
策略,以指定群集的 pod 子网,取代默认的172.30.0.0/16
子网。 另外,请查看这些策略以了解您可能不希望允许的任何连接。 -
应用要使用的公共或专用策略。
calicoctl apply -f allow-ibm-ports-public.yaml calicoctl apply -f allow-public-service-endpoint.yaml calicoctl apply -f deny-all-outbound-public.yaml calicoctl apply -f allow-konnectivity.yaml
-
可选:若要允许您的工作节点通过公共网络访问其他 IBM Cloud 服务,请应用
allow-public-services.yaml
策略。 根据该政策,可以访问 IBM Cloud Container Registry 的IP地址,如果该地区提供相应服务,则可以访问 IBM Cloud Logs 和 IBM Cloud Monitoring 的IP地址。 要访问其他 IBM Cloud 服务,您必须手动将这些服务的子网添加到该策略中。calicoctl apply -f allow-public-services.yaml
-
确认网络策略已应用。
calicoctl get NetworkPolicies -o yaml -A
-
确认全球网络政策是否得到执行。
calicoctl get GlobalNetworkPolicies -o yaml
-
可选:如果使用适用于群集中 pod 的策略,请对这些策略进行测试,以确保所有群集功能都能继续运行。 例如,如果您使用任何集群内网络钩子,请确保您的策略允许这些网络钩子与实现网络钩子的 pod 建立所需的连接。 您还必须允许扩展 Kubernetes API 的任何非本地服务的流量。 您可以运行
oc get apiservices
查找这些服务。 请注意,default/openshift-apiserver
是作为本地服务提供的,不需要网络策略。
应用专用网络策略
我们提供了一组示例 Calico 专用网络策略,用于进一步限制集群工作程序上的公用/专用网络流量。 这些策略允许群集部署所需的流量,并阻止某些其他流量。
这些政策并不是为了阻挡一切,也不一定能独自满足任何合规要求。 它们旨在作为起点,必须进行编辑以满足您的独特用例。 有关更多信息,请参阅 自述文件。
每当启用 Red Hat OpenShift on IBM Cloud 和其他 IBM Cloud 的新位置时,都会将这些位置的子网添加到 Calico 策略中。 确保 监视 GitHub 存储库 以获取这些策略的任何更新。
开始之前,安装和配置 Calico CLI,并设置集群的上下文以运行 Calico 命令。
-
克隆
IBM-Cloud/kube-samples
存储库。git clone https://github.com/IBM-Cloud/kube-samples.git
-
请访问您所在地区的隐私政策目录。 美国南部集群的示例命令:
cd <filepath>/IBM-Cloud/kube-samples/calico-policies/private-network-isolation/us-south
-
请查看每个策略以了解您可能需要进行的任何更改。 例如,如果在创建为 pod 提供专用 IP 地址的集群时指定了定制子网,那么必须在
allow-all-workers-private.yaml
策略中指定 CIDR 而不是172.30.0.0/16
CIDR。 -
应用策略。
calicoctl apply -f allow-all-workers-private.yaml calicoctl apply -f allow-ibm-ports-private.yaml calicoctl apply -f allow-icmp-private.yaml calicoctl apply -f allow-private-service-endpoint.yaml calicoctl apply -f allow-sys-mgmt-private.yaml calicoctl apply -f deny-all-private-default.yaml
-
可选:要允许员工通过专用网络访问 IBM Cloud Container Registry,请应用
allow-private-services.yaml
策略。 要访问支持私有云服务终端的其他 IBM Cloud 服务,您必须手动将这些服务的子网添加到该策略中。calicoctl apply -f allow-private-services.yaml
-
可选:要使用专用网络负载均衡器 (NLB) 或 Ingress 应用程序负载均衡器 (ALB) 来公开应用程序,必须通过应用
allow-vrrp-private
策略来打开 VRRP 协议。calicoctl apply -f allow-vrrp-private.yaml
您可以通过创建 Calico DNAT 前策略来进一步控制对联网服务的访问。 在 DNAT 前策略中,确保使用
selector: ibm.role=='worker_private'
将策略应用于工作程序的专用主机端点。 -
验证策略是否已应用。
calicoctl get GlobalNetworkPolicies -o yaml
-
可选:如果使用适用于群集中 pod 的策略,请对这些策略进行测试,以确保所有群集功能都能继续运行。 例如,如果您使用任何集群内网络钩子,请确保您的策略允许这些网络钩子与实现网络钩子的 pod 建立所需的连接。 您还必须允许扩展 Kubernetes API 的任何非本地服务的流量。 您可以运行
oc get apiservices
查找这些服务。 请注意,default/openshift-apiserver
是作为本地服务提供的,不需要网络策略。
控制 pod 之间的流量
Kubernetes 策略可保护 pod 不受内部网络流量的影响。 您可以创建简单的 Kubernetes 网络策略,以在命名空间内或跨命名空间隔离应用程序微服务。
缺省情况下,任何 pod 都有权访问集群中的任何其他 pod。 此外,任何 pod 都可以访问 pod 网络公开的任何服务,例如度量服务,集群 DNS,API 服务器或您在集群中手动创建的任何服务。
记录拒绝流量
要记录到集群中特定 pod 的已拒绝的流量请求,可创建 Calico 日志网络策略。
在设置网络策略以将流量限制为应用程序 pod 时,将拒绝并删除这些策略不允许的流量请求。 在某些情况下,您可能想要有关已拒绝的流量请求的更多信息。 例如,您可能注意到某个网络策略持续拒绝某些不常见流量。 要监视潜在安全威胁,可以设置日志记录,以在每次策略拒绝指定的应用程序 pod 上尝试的操作时进行记录。
此部分说明如何记录 Kubernetes 网络策略所拒绝的流量。 要记录 Calico 网络策略所拒绝的流量,请参阅 Calico 网络策略教程第 5 课。
开始之前,安装和配置 Calico CLI,并设置集群的上下文以运行 Calico 命令。
-
创建或使用阻止或限制入局流量的现有 Kubernetes 网络策略。
-
创建 Kubernetes 网络策略。 例如,要控制 pod 之间的流量,可以使用名为
access-nginx
的以下示例 Kubernetes 策略,限制访问 NGINX 应用程序。 到标记有“run=nginx”标签的 pod 的入局流量只能来自带有“run=access”标签的 pod。 将阻止到“run=nginx”应用程序 pod 的所有其他入局流量。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: run: access
-
应用该策略。
oc apply -f <policy_name>.yaml
-
-
要记录上一步中创建的策略拒绝的所有流量,请创建名为
log-denied-packets
的 Calico NetworkPolicy。 以下 Calico 策略使用与步骤 1 中描述的示例access-nginx
Kubernetes 策略相同的 pod 选择器,但是语法略有不同,因为它是 Calico NetworkPolicy 而不是 Kubernetes NetworkPolicy。 此外,由于所有 Kubernetes NetworkPolicy 都由 Calico 按顺序1000
进行求值,因此将添加订单号3000
以确保在 Kubernetes NetworkPolicy之后进行求值。 有了这两项政策,结果如下:-
将首先针对 Kubernetes NetworkPolicy (order
1000
) 对传入 nginx pod 的新连接进行求值。 将立即接受来自具有run=access
标签的 pod 的连接,这意味着不会评估任何其他策略。 -
如果连接来自没有
run=access
标签的 pod (或来自任何不是 pod 的对象),那么 Kubernetes NetworkPolicy 不会执行任何操作,Calico 接下来将评估log-denied-packets
策略。 此策略将包记录到 nginx pod 所在的工作程序上的 syslog。 -
然后,Calico 会检查是否存在要应用于连接的任何其他策略,并且由于找不到任何策略,因此会删除该包。 这是因为将删除到具有不显式允许的策略的 pod 的任何流量。
apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: log-denied-packets spec: types: - Ingress ingress: - action: Log destination: {} source: {} selector: projectcalico.org/orchestrator == 'k8s' && run == 'nginx' order: 3000
types
- 本
Ingress
政策适用于所有传入流量请求。Ingress
是所有传入流量的总称,并非仅指来自 IBM Ingress ALB的流量ingress
- :
action
:Log
操作会为符合此策略的任何请求写入日志条目,并将其发送到工作节点上的/var/log/syslog
路径。 destination
: 没有指定目的地,因为selector
将此政策应用于所有带有特定标签的吊舱。source
: 本政策适用于任何来源的申请。
- :
selector
- 选择器应将与原始 access-nginx Kubernetes NetworkPolicy相同的流量作为目标。 由于这是 Calico 策略,因此除了原始
run == 'nginx'
之外,还必须包含projectcalico.org/orchestrator == 'k8s'
以指示它适用于策略的名称空间中的所有 pod。 order
- Calico 策略具有确定何时应用于入局请求包的顺序。 订单量较小的政策(如
1000
)优先适用。 高位策略在低位策略之后应用。 例如,在应用了所有低阶策略后,才会应用3000
这样高阶的策略。 入局请求包进入 Iptable 规则链,并且首先尝试匹配低位策略的规则。 如果包匹配任何规则,那么将接受该包。 但是,如果包不匹配任何规则,那么将到达 Iptable 规则链中顺序最高的最后一个规则。 为了确保此策略是链中的最后一个策略,请使用比您在步骤1中创建的策略更高的顺序,例如3000
。 请注意,Kubernetes NetworkPolicy 按顺序1000
应用。
-
-
应用该策略。 如果使用 Windows 机器,请包含
--config=<filepath>/calicoctl.cfg
选项。calicoctl apply -f log-denied-packets.yaml [--config=<filepath>/calicoctl.cfg]
-
通过发送您在步骤 1 中创建的策略不允许的请求来生成日志条目。 例如,尝试从不允许的 pod 或 IP 地址对受网络策略保护的 pod 执行 ping 操作。
-
检查写入
/var/log/syslog
路径的日志条目。 由于代理、网络地址转换 (NAT) 和其他联网进程,日志条目中的 DST(目标)或 SRC(源)IP 地址可能不同于期望值。 日志条目类似于以下内容。Sep 5 14:34:40 <worker_hostname> kernel: [158271.044316] calico-packet: IN=eth1 OUT= MAC=08:00:27:d5:4e:57:0a:00:27:00:00:00:08:00 SRC=192.XXX.XX.X DST=192.XXX.XX.XX LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=52866 DF PROTO=TCP SPT=42962 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0
-
可选:将日志从
/var/log/syslog
转发至 IBM Cloud Logs。