只允许出口到互联网

时间:2019-07-25 13:34:02

标签: kubernetes kubernetes-networkpolicy

我在边上有服务。该服务需要在Internet上的某些地方发送一些东西。

我正在使用Canal CNI。

我可以定义一个NetworkPolicy,仅允许出口到互联网,而不允许集群的其余部分出口吗?

1 个答案:

答案 0 :(得分:2)

类似以下的方法将起作用:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: only-allow-internet
spec:
  policyTypes:
    - Egress
  # match all pods in the namespace
  podSelector: {}
  egress:
    - to:
        - ipBlock:
            # allow all IPs
            cidr: 0.0.0.0/0
            except:
              # except the private IP ranges: https://en.wikipedia.org/wiki/Private_network
              - 10.0.0.0/8
              - 192.168.0.0/16
              - 172.16.0.0/20

它允许所有IP(因为每个IP都与0.0.0.0/0匹配),但IANA定义为私有IP范围的私有IP范围除外。

请注意,这也会破坏DNS查找,因为默认情况下kubernetes容器使用Kubernetes内部的DNS服务器。您可以通过在Pod内 中运行以下命令来进行验证:

$ nslookup google.com
$ nslookup google.com 8.8.8.8

第一个会超时,而第二个会工作。

默认情况下,Kubernetes DNS IP为10.96.0.10。您可以通过检查窗格中的/etc/resolv.conf进行验证。因此,如果希望DNS查找有效,则可能需要进一步自定义NetworkPolicy,定义更特定的IP范围以允许DNS查找。

或者,您可以在pod定义级别定义DNS。详细信息在这里:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-config

此外,只能阻止群集Pod /服务范围,而不是阻止所有私有IP范围。您可以在kube-apiserver参数中找到它们。