[Cilium] #3์ฃผ์ฐจ (2) eBPF ๊ธฐ๋ฐ˜ Cilium์—์„œ SNAT ์˜ˆ์™ธ ์„ค์ • (ip-masq-agent)

25๋…„๋„ Cilium Study 1๊ธฐ ์ •๋ฆฌ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# helm upgrade cilium cilium/cilium --namespace kube-system --reuse-values \
--set ipMasqAgent.enabled=true --set ipMasqAgent.config.nonMasqueradeCIDRs='{10.10.1.0/24,10.10.2.0/24}'
Release "cilium" has been upgraded. Happy Helming!
NAME: cilium
LAST DEPLOYED: Fri Aug  1 23:16:12 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble Relay and Hubble UI.

Your release version is 1.18.0.

For any further help, visit https://docs.cilium.io/en/v1.18/gettinghelp

 

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# kubectl get cm -n kube-system ip-masq-agent -o yaml | yq
{
  "apiVersion": "v1",
  "data": {
    "config": "{\"nonMasqueradeCIDRs\":[\"10.10.1.0/24\",\"10.10.2.0/24\"]}"
  },
  "kind": "ConfigMap",
  "metadata": {
    "annotations": {
      "meta.helm.sh/release-name": "cilium",
      "meta.helm.sh/release-namespace": "kube-system"
    },
    "creationTimestamp": "2025-08-01T14:16:13Z",
    "labels": {
      "app.kubernetes.io/managed-by": "Helm"
    },
    "name": "ip-masq-agent",
    "namespace": "kube-system",
    "resourceVersion": "2618",
    "uid": "da66ff20-4823-4a86-b69b-91d02ed65585"
  }
}

 

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# cilium config view  | grep -i ip-masq
enable-ip-masq-agent                              true

 

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# kubectl -n kube-system exec ds/cilium -c cilium-agent -- cilium-dbg bpf ipmasq list
IP PREFIX/ADDRESS
10.10.1.0/24
10.10.2.0/24
169.254.0.0/16

 

ํ•‘ ํ…Œ์ŠคํŠธ

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# kubectl get pod -A -owide | grep curl
default              curl-pod                                  1/1     Running   0          7s    172.20.1.71      k8s-ctr   <none>           <none>

 

 

 

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# ip -c route
default via 192.168.163.2 dev eth0 proto dhcp src 192.168.163.147 metric 100

 

 

๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด tcp 0 ์œผ๋กœ ์‘๋‹ต์ด ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ (k8s-ctr)์˜ default gateway๊ฐ€ 192.168.163.2๋กœ ํŒŒ๋“œ์—์„œ ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์€ eth0 → 192.168.163.2๋กœ ์šฐ์„  ๋ผ์šฐํŒ…๋œ๋‹ค.

 

 

curl-pod → 10.10.1.200์œผ๋กœ ์š”์ฒญ ์‹œ์—๋Š” ip-masq-agent ๋•๋ถ„์— SNAT ์—†์ด ํŒŒ๋“œ IP (10.244.0.226)๋กœ ์ง์ ‘ ๋‚˜๊ฐ€๋Š”๋ฐ,

์‘๋‹ต ํŒจํ‚ท์ด ๋„์ฐฉํ–ˆ์„ ๋•Œ ๋ผ์šฐํ„ฐ๊ฐ€ 10.244.0.0/16 ๋Œ€์—ญ์„ ๋ชจ๋ฅด๊ณ , ๋‹ค์‹œ ๊ธฐ๋ณธ ๋ผ์šฐํŠธ๋กœ ๋ณด๋‚ด๋ฉด ํ•ด๋‹น ์š”์ฒญ์€ unreachable๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

 

๋ผ์šฐํ„ฐ์— pod cidr ์ถ”๊ฐ€

root@router:~# ip route add 172.20.1.0/24 via 192.168.10.100
ip route add 172.20.0.0/24 via 192.168.10.101

root@router:~# ip -c route | grep 172.20
172.20.0.0/24 via 192.168.10.101 dev eth1
172.20.1.0/24 via 192.168.10.100 dev eth1

 

 

(โŽˆ|HomeLab:N/A) root@k8s-ctr:~# kubectl exec -it curl-pod -- curl -s 10.10.1.200
<h1>Web Server : router</h1>

root@router:~# tcpdump -i eth1 tcp port 80 -nnq
23:56:15.768505 IP 172.20.1.71.41642 > 10.10.1.200.80: tcp 0
23:56:15.769443 IP 10.10.1.200.80 > 172.20.1.71.41642: tcp 0
23:56:15.769651 IP 172.20.1.71.41642 > 10.10.1.200.80: tcp 0
23:56:15.769717 IP 172.20.1.71.41642 > 10.10.1.200.80: tcp 75
23:56:15.770212 IP 10.10.1.200.80 > 172.20.1.71.41642: tcp 0
23:56:15.785994 IP 10.10.1.200.80 > 172.20.1.71.41642: tcp 256
23:56:15.786349 IP 172.20.1.71.41642 > 10.10.1.200.80: tcp 0
23:56:15.786610 IP 172.20.1.71.41642 > 10.10.1.200.80: tcp 0
23:56:15.787306 IP 10.10.1.200.80 > 172.20.1.71.41642: tcp 0
23:56:15.787510 IP 172.20.1.71.41642 > 10.10.1.200.80: tcp 0

 

NAT ์—†์ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ↔ ํŒŒ๋“œ ๊ฐ„ ์ง์ ‘ IP๋กœ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ ip-masq-agent ์„ค์ •์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.