본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

포워딩 트래픽에 정책 적용하기

원문 보기 위키 갱신

라우터나 NAT 게이트웨이 역할을 하는 호스트를 통과하는 트래픽에 Calico 네트워크 정책을 적용하는 방법을 소개해요. 소스와 목적지 둘 다 Calico 엔드포인트가 아닌 트래픽도 호스트 엔드포인트 정책으로 제어할 수 있어요. applyOnForward와 preDNAT 옵션의 의미도 함께 설명해요.

출처: 문서

본문

큰 그림

라우터나 NAT 게이트웨이로 쓰이는 호스트를 통과하는 트래픽에 Calico 정책을 적용해요.

가치

호스트에 네트워크 인터페이스가 여러 개 있고 라우터나, 서로 다른 두 네트워크 사이의 NAT 게이트웨이로 구성되어 있다면, 네트워크 사이를 오가는 트래픽에 정책을 적용하고 싶을 거예요. 이 구성에서는 보통 소스와 목적지 둘 다 Calico 엔드포인트가 아니기 때문에 엔드포인트에서의 정책 적용이 불가능해요. 하지만 나머지 Calico와 같은 정책 언어로, 그런 호스트 여러 대의 방화벽 정책을 중앙에서 관리할 수 있어요.

개념

워크로드 엔드포인트와 호스트 엔드포인트

다음 그림은 eth0과 eth1 두 네트워크 인터페이스를 가진 호스트를 보여줘요. 이 인터페이스들을 **호스트 엔드포인트(HEP)**라고 불러요. 호스트는 게스트 워크로드(VM 또는 컨테이너) 두 개도 실행해요. 게스트로 연결되는 가상 인터페이스는 **워크로드 엔드포인트(WEP)**라고 불러요. 각각 Calico API에는 각각 HostEndpoint와 WorkloadEndpoint라는 대응되는 구성 객체가 있어요.

HostEndpoint API 객체는 선택 사항이고, API 객체가 없으면 Calico는 그 HEP에 어떤 정책도 적용하지 않아요. WorkloadEndpoint API 객체는 필수이고, 클러스터 오케스트레이터 플러그인(예: Kubernetes 또는 OpenStack)이 자동으로 관리해요.

그림에는 1번부터 4번까지 번호를 붙인 연결들이 나와 있어요. 예를 들어 연결 1은 HEP eth0로 ingress하고, 포워딩된 다음, Workload A의 WEP로 ingress해요. Calico 정책은 자신이 적용될 WEP이나 HEP를 선택해요. 그래서 예를 들어 Workload A의 WEP를 선택하는 ingress 정책은 1번으로 표시된 연결에 적용돼요.

Host-forward-traffic

applyOnForward

기본적으로 Calico 글로벌 네트워크 정책은 applyOnForward를 false로 설정해요. HEP를 선택하는 정책에서 false로 두면, 그 정책은 호스트에서 시작되거나 호스트에서 끝나는 트래픽에만 적용돼요. 예를 들어 연결 4(Node process) 같은 경우죠. 연결 1-3은 applyOnForward가 false로 설정된 HEP를 선택하는 정책의 영향을 받지 않아요.

반대로 HEP를 선택하는 정책에서 applyOnForward를 true로 설정하면, 그 정책은 연결 1-4 전부에 적용될 수 있어요. 예를 들면:

  • HEP eth0의 ingress 정책은 연결 1과 2에 영향을 줘요
  • HEP eth1의 egress 정책은 연결 2, 3, 4에 영향을 줘요

applyOnForward: true 정책과 applyOnForward: false 정책의 기본 동작(default action) 의미도 서로 달라요. applyOnForward: true 정책은 HEP를 통과하는 모든 트래픽(연결 1-4)에 영향을 줘요. 그 HEP와 방향(ingress인지 egress인지)을 선택하는 applyOnForward 정책이 없다면, 포워딩 트래픽은 허용돼요. 그 HEP와 방향을 선택하는 정책이(applyOnForward 값과 무관하게) 아예 없다면, 로컬 트래픽은 거부돼요.

HEP 정의됨? 트래픽 유형 applyOnForward 정의됨? 정책 존재? 기본 동작
아니요 모두 해당 없음 해당 없음 허용
예 포워딩 아니요 무관 허용
예 포워딩 예 예 거부
예 로컬 해당 없음 아니요 거부
예 로컬 해당 없음 예 거부

Calico 네임스페이스 네트워크 정책에는 applyOnForward 설정이 없어요. HEP는 항상 클러스터 글로벌이고 네임스페이스에 속하지 않기 때문에, 네트워크 정책은 HEP를 선택할 수 없어요.

preDNAT 정책

호스트는 특정 패킷을 포워딩하기 전에 목적지 네트워크 주소 변환(DNAT)을 수행하도록 구성되는 경우가 많아요. 클라우드 컴퓨팅에서 흔한 예는, 호스트가 리버스 프록시로 동작해서 백엔드 워크로드 인스턴스 집합에 대한 서비스 요청을 로드 밸런싱하는 경우예요. 이런 리버스 프록시의 특정 사례에 정책을 적용하려면 Kubernetes nodePorts를 참고하세요.

글로벌 네트워크 정책에서 preDNAT가 false로 설정되면, DNAT가 수행된 이후의 연결에 정책 규칙이 평가돼요. false가 기본값이에요. preDNAT가 true로 설정되면, DNAT가 수행되기 전의 연결에 정책 규칙이 평가돼요.

preDNAT 정책을 true로 설정한다면 applyOnForward도 반드시 true로 설정해야 하고, preDNAT 정책에는 Ingress 정책만 포함해야 해요.

interfaceName: *인 호스트 엔드포인트

HostEndpoint API 객체는 호스트 인터페이스 이름(ip link 등으로 확인되는)을 지정해서 만들 수도 있고, interfaceName을 *로 설정해서 만들 수도 있어요. *는 해당 노드의 모든 호스트 인터페이스, 즉 호스트에서 그 호스트의 WEP들로 이어지는 인터페이스까지 모두 포함한다는 뜻이에요.

interfaceName이 특정 인터페이스로 설정되면, 그 HEP를 선택하는 정책은 트래픽이 지정된 인터페이스를 통과할 때만 적용돼요. *로 설정되면, 그 HEP를 선택하는 정책은 인터페이스와 무관하게 적용돼요.

VM이나 파드 같은 게스트 워크로드를 함께 실행하는 호스트에 정책을 적용하려고 할 때 특히 중요해요. 로컬 워크로드에서 리버스 프록시 IP나 포트로 가는 트래픽은 외부 인터페이스를 통과하지 않아서, 정책이 적용되려면 interfaceName이 *로 설정된 HEP가 필요해요.

방법

특정 네트워크로 들어오거나 나가는 포워딩 트래픽 제어

  1. 호스트 엔드포인트(네트워크 인터페이스)에 사용할 레이블 체계를 정해요.
    예를 들어 애플리케이션 네트워크와 관리 네트워크가 있다면, network = application과 network = management 레이블을 고를 수 있어요.

  2. 원하는 규칙을 표현하는 GlobalNetworkPolicies를 작성해요.

    • applyOnForward를 true로 설정해요.
    • **selector:**를 사용해 정책을 적용할 호스트 엔드포인트를 선택해요.
  3. Calico API에 HostEndpoint 객체를 만들어요.

    • 1단계에서 정한 레이블 체계에 맞게 HostEndpoint에 레이블을 붙여요.
    • Calico가 정책 적용을 시작하기 전에 모든 정책이 존재하도록, HostEndpoint를 만들기 전에 정책을 먼저 만드는 것을 권장해요.

튜토리얼

네트워크 인터페이스가 두 개인 호스트가 있다고 해 봐요:

  • eth0 - 애플리케이션 트래픽을 위한 메인 데이터센터 네트워크에 연결
  • eth1 - 특수한 유지보수 네트워크에 연결

목표는 SSH 트래픽이 유지보수 네트워크로 포워딩되는 것은 허용하고, 다른 모든 트래픽은 드롭하는 거예요.

다음 레이블 체계를 선택해요:

  • 애플리케이션 트래픽용 메인 데이터센터 네트워크에는 network = application
  • 유지보수 네트워크에는 network = maintenance

SSH 트래픽을 허용하는 GlobalNetworkPolicy를 만들어요(이 경우 기본 거부는 암묵적으로 적용돼요).

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-ssh-maintenance
spec:
  selector: network == 'maintenance'
  applyOnForward: true
  types:
  - Egress
  egress:
  # Allow SSH
  - action: Allow
    protocol: TCP
    destination:
      ports:
      - 22

이 파일을 allow-ssh-maintenance.yaml로 저장해요.

클러스터에 정책을 적용해요:

calicoctl create -f allow-ssh-maintenance.yaml

마지막으로, 유지보수 네트워크에 연결된 인터페이스의 호스트 엔드포인트를 만들어요.

apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: myhost.eth1
  labels:
    network: maintenance
spec:
  interfaceName: eth1
  node: myhost
  expectedIPs:
    - 192.168.0.45

myhost는 Calico가 사용하는 노드 이름으로 바꾸고, expected IPs는 실제 인터페이스 IP 주소로 바꾸세요. 이 파일은 hep.yaml로 저장해요.

클러스터에 호스트 엔드포인트를 적용해요:

calicoctl create -f hep.yaml

완전성을 위해 eth0용 HostEndpoint도 만들 수 있지만, 아직 애플리케이션 네트워크를 위한 정책을 작성하지 않았다면 이 단계는 생략해도 돼요.

추가 리소스

더 알아보기 (Learn more)

라우터/NAT 게이트웨이 역할을 하는 호스트를 통과하는 트래픽도 Calico 정책으로 제어할 수 있어요. 핵심은 HEP를 선택하는 GlobalNetworkPolicy에 applyOnForward: true를 설정하는 거예요. DNAT 이전 상태의 패킷에 정책을 평가해야 한다면 preDNAT 옵션을 활용해 보세요.