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

정책에서 ICMP/ping 규칙 사용하기

원문 보기 위키 갱신

Calico 네트워크 정책으로 ICMP/ping 메시지를 허용하거나 거부하는 방법을 다뤄요. ICMP는 진단에 유용하지만 공격에도 쓰일 수 있어서, 어디서 쓰게 할지 통제하는 게 중요해요. 타입(type)과 코드(code) 단위의 세밀한 제어까지 소개해요.

출처: 문서

본문

큰 그림

Calico 네트워크 정책을 사용해 ICMP/ping 메시지를 허용하고 거부해요.

가치

**ICMP(Internet Control Message Protocol)**는 유용한 네트워크 진단 기능을 제공하지만 악의적으로도 사용될 수 있어요. 공격자는 이를 이용해 네트워크를 탐색하거나 DoS 공격을 할 수 있어요. Calico 네트워크 정책을 사용하면 ICMP를 어디에서 쓸 수 있게 할지 통제할 수 있어요. 예를 들어 다음과 같은 일이 가능해요:

  • ICMP ping을 허용하되, 워크로드/호스트 엔드포인트(또는 둘 다)로만 한정하기
  • 운영자가 진단 목적으로 띄운 파드에만 ICMP를 허용하고 다른 사용은 차단하기
  • 문제 진단을 위해 임시로 ICMP를 켰다가, 해결되면 다시 끄기
  • ICMPv4와/또는 ICMPv6 거부/허용하기

개념

ICMP 패킷 타입과 코드

Calico 네트워크 정책은 특정 타입(type)과 코드(code) 기준으로도 ICMP 트래픽을 거부하고 허용할 수 있어요. 예를 들어 ICMP 타입 5, 코드 2를 지정해 특정 ICMP 리다이렉트 패킷만 매칭할 수 있어요.

자세한 내용은 ICMP 타입과 코드를 참고하세요.

방법

모든 ICMP 거부하기: 모든 워크로드와 호스트 엔드포인트

이 예제에서는 "모든 ICMP 거부" GlobalNetworkPolicy를 소개해요.

이 정책은 모든 워크로드와 호스트 엔드포인트를 선택해요. 정책에 명시한 ICMP 거부 규칙에 더해, 모든 워크로드와 호스트 엔드포인트에 기본 거부(default deny)를 활성화해요.

최종 목표가 일부 트래픽 허용이라면, 글로벌 deny-all ICMP 정책을 적용하기 전에 평소 쓰는 "허용" 정책들을 먼저 마련해 두세요.

이 예제에서는 모든 워크로드와 호스트 엔드포인트가 ICMPv4와 ICMPv6 메시지를 보내거나 받지 못하게 막아요.

배포에서 ICMPv6 메시지를 사용하지 않더라도, 아래처럼 명시적으로 거부해 두는 것이 좋은 습관이에요.

어떤 "deny-all" Calico 네트워크 정책에서든, 트래픽을 허용할 수 있는 일반 정책들보다 낮은 order(order:200)를 지정하세요.

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: block-icmp
spec:
  order: 200
  selector: all()
  types:
    - Ingress
    - Egress
  ingress:
    - action: Deny
      protocol: ICMP
    - action: Deny
      protocol: ICMPv6
  egress:
    - action: Deny
      protocol: ICMP
    - action: Deny
      protocol: ICMPv6

ICMP ping 허용하기: 모든 워크로드와 호스트 엔드포인트

이 예제에서는 워크로드와 호스트 엔드포인트가 다른 워크로드와 호스트 엔드포인트에서 오는 ICMPv4 타입 8과 ICMPv6 타입 128 ping 요청을 받을 수 있어요.

그 밖의 트래픽은 다른 정책에 의해 허용될 수 있어요. 명시적으로 허용되지 않은 트래픽은 기본적으로 거부돼요.

이 정책은 ingress 트래픽에만 적용돼요. (egress 트래픽은 영향을 받지 않고, egress에 대해서는 기본 거부가 강제되지 않아요.)

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-ping-in-cluster
spec:
  selector: all()
  types:
    - Ingress
  ingress:
    - action: Allow
      protocol: ICMP
      source:
        selector: all()
      icmp:
        type: 8  Ping request
    - action: Allow
      protocol: ICMPv6
      source:
        selector: all()
      icmp:
        type: 128  Ping request

프로토콜 타입과 코드가 일치하는 ICMP 허용하기: 모든 Kubernetes 파드

이 예제에서는 셀렉터 **projectcalico.org/orchestrator == 'kubernetes'**에 매칭되는 Kubernetes 파드만 ICMPv4 code: 1 host unreachable 메시지를 받을 수 있어요.

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-host-unreachable
spec:
  selector: projectcalico.org/orchestrator == 'kubernetes'
  types:
    - Ingress
  ingress:
    - action: Allow
      protocol: ICMP
      icmp:
        type: 3  Destination unreachable
        code: 1  Host unreachable

추가 리소스

ICMP 매치 기준에 대해 더 알고 싶다면 다음을 참고하세요:

더 알아보기 (Learn more)

deny-all 정책에는 반드시 일반 허용 정책보다 낮은 order를 지정해야 한다는 점이 핵심이에요. ICMPv6를 쓰지 않더라도 명시적으로 거부해 두는 것이 안전하고, 타입/코드 매칭으로 꼭 필요한 진단 메시지만 골라 허용할 수 있어요.