정책에서 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 ping 허용하기: 모든 워크로드와 호스트 엔드포인트
- 프로토콜 타입과 코드가 일치하는 ICMP 허용하기: 모든 Kubernetes 파드
모든 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를 쓰지 않더라도 명시적으로 거부해 두는 것이 안전하고, 타입/코드 매칭으로 꼭 필요한 진단 메시지만 골라 허용할 수 있어요.