VPP로 IPsec 구성하기
VPP 데이터 플레인을 쓰는 Calico Open Source 클러스터에서 노드 사이 트래픽에 IPsec 암호화를 적용하는 방법이에요. IKEv2 PSK 시크릿을 만들고 calico-vpp 구성을 패치해 암호화를 켜는 절차를 안내해요. 마지막에 VPP CLI로 암호화가 실제로 동작하는지 확인하는 것까지 다뤄요.
출처: 문서
본문
큰 그림
노드 사이에서 흐르는 트래픽에 IPsec 암호화를 활성화해요.
가치
IPsec은 노드 사이 트래픽을 암호화하는 가장 빠른 옵션이에요. 성능 영향을 거의 주지 않으면서 애플리케이션 트래픽을 한꺼번에 암호화할 수 있게 해줘요.
시작하기 전에...
IPsec 암호화를 활성화하려면 다음을 갖춘 Kubernetes 클러스터가 필요해요:
- VPP 데이터 플레인이 구성되어 있어요
- 노드 사이에 IP-in-IP 캡슐화가 구성되어 있어요
방법
IKEv2 PSK 만들기
노드 사이 IKEv2 교환에 사용할 PSK를 담은 Kubernetes 시크릿을 만들어요. 다음 명령으로 무작위 PSK를 만들 수 있어요. 고유한 무작위 키가 생성될 거예요. psk= 뒷부분을 원하는 키로 바꿔도 돼요.
kubectl -n calico-vpp-dataplane create secret generic calicovpp-ipsec-secret \
--from-literal=psk="$(dd if=/dev/urandom bs=1 count=36 2>/dev/null | base64)"
VPP 데이터 플레인 구성하기
IPsec을 켜려면 먼저 calico-vpp-config ConfigMap에서 IPsec 기능을 활성화해야 해요.
다음 kubectl 명령으로 할 수 있어요:
kubectl -n calico-vpp-dataplane patch configmap calico-vpp-config --patch "data:
CALICOVPP_FEATURE_GATES: |-
{
\"ipsecEnabled\": true
}
"
그다음 calico-vpp 에이전트를 구성해서 방금 만든 키를 전달해야 해요.
kubectl -n calico-vpp-dataplane patch daemonset calico-vpp-node --patch "spec:
template:
spec:
containers:
- name: agent
env:
- name: CALICOVPP_IPSEC_IKEV2_PSK
valueFrom:
secretKeyRef:
name: calicovpp-ipsec-secret
key: psk
"
IPsec이 켜지면 클러스터에서 IP-in-IP 캡슐화를 사용하는 모든 트래픽이 자동으로 암호화돼요.
다음 단계
암호화 확인하기
트래픽이 암호화되었는지 확인하려면 VPP 디버그 CLI 세션을 열어 calivppctl로 구성을 점검해요
calivppctl vppctl my-k8s-node-1
# Alternatively this translates to the following CLI
kubectl -n calico-vpp-dataplane exec calico-vpp-node-XXXX -c vpp -- vppctl
그다음 vpp# 프롬프트에서 다음 명령을 실행할 수 있어요:
show ikev2 profile은 구성된 IKEv2 프로파일을 나열해요. 클러스터의 다른 노드마다 하나씩 있어야 해요
3노드 클러스터에서의 예시예요
vpp# show ikev2 profile
profile pr_172_19_0_5_to_172_19_0_3
auth-method shared-key-mic auth data somekeysomekeysomekeysomekey
local id-type ip4-addr data 172.19.0.5
remote id-type ip4-addr data 172.19.0.3
protected tunnel ipip0
responder host-eth0 172.19.0.3
ike-crypto-alg aes-cbc 256 ike-integ-alg sha1-96 ike-dh modp-2048
esp-crypto-alg aes-gcm-16 256 esp-integ-alg none
lifetime 0 jitter 0 handover 0 maxdata 0
profile pr_172_19_0_5_to_172_19_0_6
auth-method shared-key-mic auth data somekeysomekeysomekeysomekey
local id-type ip4-addr data 172.19.0.5
remote id-type ip4-addr data 172.19.0.6
protected tunnel ipip1
lifetime 0 jitter 0 handover 0 maxdata 0
profile pr_172_19_0_5_to_172_19_0_4
auth-method shared-key-mic auth data somekeysomekeysomekeysomekey
local id-type ip4-addr data 172.19.0.5
remote id-type ip4-addr data 172.19.0.4
protected tunnel ipip2
responder host-eth0 172.19.0.4
ike-crypto-alg aes-cbc 256 ike-integ-alg sha1-96 ike-dh modp-2048
esp-crypto-alg aes-gcm-16 256 esp-integ-alg none
lifetime 0 jitter 0 handover 0 maxdata 0
show ipip tunnel은 VPP에 구성된 인터페이스를 나열해요.
vpp# show ipip tunnel
[0] instance 0 src 172.19.0.5 dst 172.19.0.3 table-ID 0 sw-if-idx 9 flags [none] dscp CS0
[1] instance 1 src 172.19.0.5 dst 172.19.0.6 table-ID 0 sw-if-idx 10 flags [none] dscp CS0
[2] instance 2 src 172.19.0.5 dst 172.19.0.4 table-ID 0 sw-if-idx 11 flags [none] dscp CS0
show interface는 VPP에 있는 모든 인터페이스와 그 상태를 보여줘요. 여기에는 ipip 인터페이스(IPsec 터널에 해당해요)도 포함되며, up 상태여야 해요.
vpp# show interface
...
ipip0 9 up 9000/0/0/0
ipip1 10 up 9000/0/0/0 rx packets 1496
rx bytes 387772
tx packets 1687
tx bytes 662236
ip4 1496
ipip2 11 up 9000/0/0/0
show ipsec protect는 각 ipip 터널에 구성된 SA를 보여줘요. ipip 터널마다 SA가 두 개 있어야 해요.
vpp# show ipsec protect
ipip0 flags:[none]
output-sa:
[0] sa 2147483648 (0x80000000) spi 2056367583 (0x7a91addf) protocol:esp flags:[esn anti-replay aead ctr ]
input-sa:
[1] sa 3221225472 (0xc0000000) spi 1916941699 (0x72423583) protocol:esp flags:[esn anti-replay inbound aead ctr ]
ipip2 flags:[none]
output-sa:
[2] sa 2147487744 (0x80001000) spi 1305186871 (0x4dcb9237) protocol:esp flags:[esn anti-replay aead ctr ]
input-sa:
[3] sa 3221229568 (0xc0001000) spi 1107274174 (0x41ffa9be) protocol:esp flags:[esn anti-replay inbound aead ctr ]
ipip1 flags:[none]
output-sa:
[4] sa 2147491840 (0x80002000) spi 3581762498 (0xd57d5bc2) protocol:esp flags:[esn anti-replay aead ctr ]
input-sa:
[5] sa 3221233664 (0xc0002000) spi 3002607689 (0xb2f82849) protocol:esp flags:[esn anti-replay inbound aead ctr ]
show ipsec sa로 전체 SA(Security Association) 목록을 볼 수 있어요.
vpp# show ipsec sa
[0] sa 2147483648 (0x80000000) spi 2056367583 (0x7a91addf) protocol:esp flags:[esn anti-replay aead ctr ]
[1] sa 3221225472 (0xc0000000) spi 1916941699 (0x72423583) protocol:esp flags:[esn anti-replay inbound aead ctr ]
[2] sa 2147487744 (0x80001000) spi 1305186871 (0x4dcb9237) protocol:esp flags:[esn anti-replay aead ctr ]
[3] sa 3221229568 (0xc0001000) spi 1107274174 (0x41ffa9be) protocol:esp flags:[esn anti-replay inbound aead ctr ]
[4] sa 2147491840 (0x80002000) spi 3581762498 (0xd57d5bc2) protocol:esp flags:[esn anti-replay aead ctr ]
[5] sa 3221233664 (0xc0002000) spi 3002607689 (0xb2f82849) protocol:esp flags:[esn anti-replay inbound aead ctr ]
노드 사이에서 흐르는 트래픽을 캡처해서 실제로 암호화되는지 확인할 수도 있어요.
더 알아보기 (Learn more)
IPsec은 IP-in-IP 캡슐화 트래픽만 암호화한다는 점을 기억하세요. PSK는 노드 전체에서 같은 시크릿을 공유하니 유출에 주의하고 교체 절차도 정해 두세요. 암호화 확인은 show interface에서 ipip 인터페이스가 up인지, show ipsec sa에서 SA 쌍이 잡혔는지 순서로 보면 빠르게 이상 여부를 판단할 수 있어요.