네트워크 정책

도람·2025년 11월 5일
post-thumbnail

네트워크 정책

  • IP주소나 포트 수준(OSI 3,4 계층)에서 트래픽 흐름을 제어하기 위한 보안 메커니즘이다.
    이를 통해 클러스터 내부 뿐만 아니라 Pod와 외부 간 트래픽 흐름 규칙을 지정할 수 있다.

  • TCP, UDP, SCTP 등의 프로토콜에 대해 IP 주소 및 포트 단위로 접근을 허용하거나 차단할 수 있으며,
    클러스터 내 특정 애플리케이션에 대해 어떤 엔티티(파드, 네임스페이스, IP 블록)가 통신할 수 있는지를 정의할 수 있다.

  • 네트워크 정책은 (양쪽 종단인) 파드연결에만 적용되며 다른 연결에는 관여하지 않는다.


파드가 통신할 수 있는 엔티티는 세 개의 식별자 조합을 통해 식별이 된다.

  • 다른 파드(Pod)

    • 접근이 허용된 파드만 통신할 수 있으며,
      단 파드는 자기 자신에 대한 접근을 차단할 수 없다.
  • 네임스페이스(Namespace)

    • 특정 네임스페이스에 속한 파드들과만 통신을 허용할 수 있다.
  • IP 블록(IPBlock)

    • 특정 CIDR 대역의 IP 주소와만 통신을 허용할 수 있다.
      단, 파드가 실행 중인 노드와의 트래픽은 항상 허용된다.

전제조건

네트워크 정책은 네트워크 플러그인으로 구현되어 네트워크정책을 지원하는 네트워킹 솔루션을 사용해야하며,
이를 구현하는 컨트롤러 없이 네트워크 정책을 생성할 경우 아무런 효과가 없다.

Pod의 두 가지 종류

파드 격리는 두 가지 종류가 있다. 여기서 말하는 "격리"란 절대적인 것이 아니라, "일부 제한이 된다"이라는 의미이다.
->하지만 네트워크 정책(NetworkPolicy) 을 적용하면,
파드가 외부로 나가거나 외부에서 들어오는 통신에 제한을 둘 수 있다.

(기본적으로 파드는 출구에 대해 비격리되어있으며, 모든 아웃바운드 연결이 허용된다.
또한 기본적으로 입구에 대해서도 비격리되어있어, 모든 인바운드 연결에도 허용이 된다.)

Pod격리수준 1: 출구(egress) 격리

이그레스 격리(파드가 밖으로 나갈 때)의 격리를 의미한다.
기본적으로 파드는 비격리 상태라서
모든 외부로의 통신(아웃바운드 트래픽)이 허용된다.

하지만 Egress 타입의 네트워크 정책이 적용되면,
그때부터는 정해진 규칙에 맞는 트래픽만 나갈 수 있다.


Pod격리수준 2: 진입(ingress) 격리

인그레스 격리는(다른 파드나 외부에서 이 파드로 들어오는 트래픽)의 격리를 의미한다.
기본적으로 파드는 비격리 상태라서
모든 인바운드 요청이 허용된다.

하지만 Ingress 타입의 네트워크 정책이 설정되면,
지정된 파드나 IP만 이 파드로 접근할 수 있다.


네트워크 정책 스크립트 예시

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978


  • spec: 네트워크폴리시 사양, 지정된 네임스페이스에서 특정 네트워크 정책을 정의하는데 필요한 모든 정보.

  • podSelector: 각 네트워크폴리시에는 정책이 적용되는 파드 그룹을 선택하는 podSelector 가 포함된다. 예시 정책은 "role=db" 레이블이 있는 파드를 선택한다. 비어있는 podSelector 는 네임스페이스의 모든 파드를 선택한다.

  • policyTypes: 각 네트워크폴리시에는 Ingress, Egress 또는 두 가지 모두를 포함할 수 있는 policyTypes 목록이 포함된다. policyTypes 필드는 선택한 파드에 대한 인그레스 트래픽 정책, 선택한 파드에 대한 이그레스 트래픽 정책 또는 두 가지 모두에 지정된 정책의 적용 여부를 나타낸다. 만약 네트워크폴리시에 policyTypes 가 지정되어 있지 않으면 기본적으로 Ingress 가 항상 설정되고, 네트워크폴리시에 Egress 가 있으면 이그레스 규칙이 설정된다.

  • ingress: 각 네트워크폴리시에는 화이트리스트 ingress 규칙 목록이 포함될 수 있다. 각 규칙은 from 과 ports 부분과 모두 일치하는 트래픽을 허용한다. 예시 정책에는 단일 규칙이 포함되어 있는데 첫 번째 포트는 ipBlock 을 통해 지정되고, 두 번째는 namespaceSelector 를 통해 그리고 세 번째는 podSelector 를 통해 세 가지 소스 중 하나의 단일 포트에서 발생하는 트래픽과 일치 시킨다.

  • egress: 각 네트워크폴리시에는 화이트리스트 egress 규칙이 포함될 수 있다. 각 규칙은 to 와 ports 부분과 모두 일치하는 트래픽을 허용한다. 예시 정책에는 단일 포트의 트래픽을 10.0.0.0/24 의 모든 대상과 일치시키는 단일 규칙을 포함하고 있다.

참고자료
[쿠버네티스 공식 홈페이지 - Network Policies]
https://kubernetes.io/docs/concepts/services-networking/network-policies/
[wikidocs - 03. 네트워크 정책(Network Policy): 제로 트러스트를 향한 첫걸음]
https://wikidocs.net/303581

profile
정도를 걷는 엔지니어

0개의 댓글