Search

DNS 기반 네트워크 정책

kubectl create -f https://raw.githubusercontent.com/cilium/cilium/refs/heads/main/examples/kubernetes-dns/dns-sw-app.yaml
Shell
복사
mediabot pod가 api.github.com에만 접근할 수 있도록 하는 정책
apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: "fqdn" spec: endpointSelector: matchLabels: org: empire class: mediabot egress: - toFQDNs: - matchName: "api.github.com" - toEndpoints: - matchLabels: "k8s:io.kubernetes.pod.namespace": kube-system "k8s:k8s-app": kube-dns toPorts: - ports: - port: "53" protocol: ANY rules: dns: - matchPattern: "*"
YAML
복사
위 규칙은 org: empire, class: mediabot 이라는 레이블을 가지고 있는 pod가 api.github.com 이라는 도메인으로의 요청만 kube-dns pod로 53port로 보낼 수 있도록 하는 규칙
rules.dns 설정으로 select된 pod의 모든 DNS쿼리를 검사하도록 설정
kubectl exec mediabot -- curl -I -s https://api.github.com | head -1 kubectl exec mediabot -- curl -I -s --max-time 5 https://support.github.com | head -1 kubectl exec mediabot -- curl -I -s --max-time 5 https://google.com | head -1
Shell
복사
api.github.com 제외한 도메인이 전부 실패하는 걸 확인 가능
api.github.com 이 아닌 github.com의 모든 sub 도메인을 허용하고 싶다면 *.github.com 을 사용하고 matchName을 matchPattern으로 바꾸면 된다.
( 단 *.github.com 이기 때문에 그냥 github.com에 대한 요청은 차단 )
apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: "fqdn" spec: endpointSelector: matchLabels: org: empire class: mediabot egress: - toFQDNs: - matchPattern: "*.github.com" - toEndpoints: - matchLabels: "k8s:io.kubernetes.pod.namespace": kube-system "k8s:k8s-app": kube-dns toPorts: - ports: - port: "53" protocol: ANY rules: dns: - matchPattern: "*"
YAML
복사
kubectl exec mediabot -- curl -I -s https://api.github.com | head -1 kubectl exec mediabot -- curl -I -s --max-time 5 https://support.github.com | head -1 kubectl exec mediabot -- curl -I -s --max-time 5 https://google.com | head -1 kubectl exec mediabot -- curl -I -s --max-time 5 https://github.com | head -1
Shell
복사
위 2개는 github.com의 서브 도메인 이기 때문에 성공하고, 아래 2개는 github.com의 서브 도메인이 아니기 때문에 실패 확인 가능
DNS 규칙과 port 규칙을 결합하여 특정 도메인으로 https 연결만 허용
apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: "fqdn" spec: endpointSelector: matchLabels: org: empire class: mediabot egress: - toFQDNs: - matchPattern: "*.github.com" toPorts: - ports: - port: "443" protocol: TCP - toEndpoints: - matchLabels: "k8s:io.kubernetes.pod.namespace": kube-system "k8s:k8s-app": kube-dns toPorts: - ports: - port: "53" protocol: ANY rules: dns: - matchPattern: "*"
YAML
복사
kubectl exec mediabot -- curl -I -s https://support.github.com | head -1 kubectl exec mediabot -- curl -I -s --max-time 5 http://support.github.com | head -1
Shell
복사
HTTPS 프로토콜만 허용하는 모습 확인 가능