Masquerading 이란?
Masquerading은 네트워크에서 IP 패킷의 송신자 주소를 다른 주소로 바꿔 외부에 전달하는 소스 NAT(Source NAT) 기법의 한 형태이다. 주로 사설 네트워크 트래픽을 외부 네트워크로 나갈 수 있도록 변환할 때 사용된다.
- 동적 SNAT
- 사설 IP (ex: 10.x.x.x, 192.168.x.x)로 생성된 트래픽이 외부 네트워크로 나갈 때, 송신 IP를 노드의 공인 IP로 변환하여 전송한다.
- 응답 패킷은 다시 해당 변환 테이블을 통해 원래 Pod로 돌아간다.
- 일반적은 사용 사례
- 사설 네트워크의 Pod가 인터넷으로 접근해야 할 때
- ClusterIP나 Pod IP를 외부에서 직접 라우팅할 수 없는 경우
- 노드 단위로 egress IP를 통일하여 외부 방화벽 정책과 연동
Cilium에서의 Masquerading 동작
Cilium은 eBPF 기반으로 Kubernetes CNI를 구현하며, Masquerading 또한 eBPF 프로그램으로 처리할 수 있다.
- Masquerade 트리거 조건
- Pod -> 외부 네트워크 (클러스터 밖)
- Pod의 소스 IP가 사설 IP라 외부에서 도달 불가
- 송신 IP를 Node IP로 SNAT 수행
- ClusterCIDR -> 외부로 라우팅 시
- --enable-ipv4-masquerade: true 상태(default)라면 자동 적용
- EgressGateway / eBPF-based NAT 사용 시
- 고성능 SNAT 처리를 위해 iptables 대신 eBPF Maquerade 사용
- Pod -> 외부 네트워크 (클러스터 밖)
Cilium 에서 Masquerading 구현 방식
eBPF-based vs iptable based
| eBPF Masquerade | iptables Masquerade | |
| 동작 계층 | 커널 eBPF Hook (XDP/BPF TC) | netfilter/iptables NAT 테이블 |
| 패킷 처리 위치 | 커널 패킷 경로에서 조기 처리 | 커널 netfilter 경로를 모두 통과 |
| 성능(Throughput) | 높은 성능, 선형 확장 가능 | NAT 테이블 탐색으로 상대적 성능 저하 |
| 지연(Latency) | 낮음 (커널 내부에서 즉시 변환) | 상대적으로 높음 (netfilter 체인 통과) |
| CPU 사용량 | 효율적 (필요 최소 연산만 수행) | iptables 룰 탐색 비용 발생 |
| State 관리 | eBPF map으로 커널 공간에서 관리 | conntrack 기반 NAT 세션 관리 |
| 대규모 Pod 수 대응 | 대규모 환경에서도 성능 안정적 | Pod 수 증가 시 conntrack 부하 발생 가능 |
| 구현 난이도 | Cilium에서 기본 제공 (v1.10+ 안정화) | 전통적, 단순 |
| 문제 발생 시 트러블 슈팅 | cilium monitor / bpftool 필요 | conntrack / iptables-save 로 확인 가능 |
| 권장 시나리오 | 고성능/대규모 클러스터, eBPF 활성 환경 | 소규모/전통적 환경, 호환성 우선 |
Masquerading 실습
# 현재 설정 확인
kubectl exec -it -n kube-system ds/cilium -c cilium-agent -- cilium status | grep Masquerading
cilium config view | grep ipv4-native-routing-cidr
# 통신 확인
kubectl exec -it curl-pod -- curl -s webpod | grep Hostname
kubectl exec -it curl-pod -- curl -s webpod | grep Hostname

# 터미널 2개 사용
[k8s-ctr] tcpdump -i eth1 icmp -nn 혹은 hubble observe -f --pod curl-pod
[router] tcpdump -i eth1 icmp -nn
# router eth1 192.168.10.200 로 ping >> IP 확인해보자!
kubectl exec -it curl-pod -- ping 192.168.10.101
kubectl exec -it curl-pod -- ping 192.168.10.200
...
---
# 터미널 2개 사용
[k8s-ctr] tcpdump -i eth1 tcp port 80 -nnq 혹은 hubble observe -f --pod curl-pod
[router] tcpdump -i eth1 tcp port 80 -nnq
# router eth1 192.168.10.200 로 curl >> IP 확인해보자!
kubectl exec -it curl-pod -- curl -s webpod
kubectl exec -it curl-pod -- curl -s webpod
kubectl exec -it curl-pod -- curl -s 192.168.10.200
...


'DevOps > cilium' 카테고리의 다른 글
| [Cilium Study] Pod간 통신 & k8s 외부 노출 1 (1) | 2025.08.09 |
|---|---|
| [Cilium Study] CoreDNS, LocalNodeDNS (3) | 2025.08.03 |
| [Cilium Study] Routing (6) | 2025.08.02 |
| [Cilium study] IPAM 모드 (2) | 2025.07.31 |
| [Cilium study] Loki 스택 기반 중앙 로깅 시스템 구성 (4) | 2025.07.27 |