본문 바로가기
DevOps/cilium

[Cilium Study] Masquerading

by 서어켜엉 2025. 8. 3.

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 사용

 

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
...

k8s-ctr
router