IPSec 与 Offload Authorization E2E 测试指南
本文档提供执行 Kmesh IPSec 与 Offload Authorization E2E 测试的分步指南。这些测试用于确保 IPSec 功能以及 Offload Authorization 机制的可靠性、安全性与功能性。
先决条件
运行测试前,请确保满足以下条件:
- Kubernetes 集群:已安装 Kmesh 的双节点 Kubernetes 集群。
- 工具:
kubectl、tcpdump和kmeshctl。 - 应用:集群中已部署
echo和sleep应用。
部署示例 YAML
Sleep 应用(保存为 sleep.yaml):
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
nodeName: kmesh-testing-control-plane
containers:
- name: sleep
image: curlimages/curl
command: ["/bin/sleep", "infinity"]
Echo 应用(保存为 echo.yaml):
apiVersion: v1
kind: Service
metadata:
name: echo
spec:
ports:
- name: http
port: 80
targetPort: 8080
selector:
app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo
spec:
replicas: 1
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo
image: gcr.io/istio-testing/app:latest
args:
- --port=8080
ports:
- containerPort: 8080
IPSec E2E 测试
1. 基本连通性测试
该测试验证 IPSec 隧道的建立以及加密通信的正确性。
步骤
-
部署
sleep和echo应用:kubectl apply -f sleep.yaml
kubectl apply -f echo.yaml -
验证应用之间的连通性:
kubectl exec <sleep-pod> -- curl http://<echo-service>预期输出:
Hello version: v1, instance: echo-<pod-id> -
检查 IPSec 状态:
ip xfrm state show预期输出:
src {{SRC_IP}} dst {{DST_IP}}
proto esp spi 0x{{SPI}} reqid 1 mode tunnel
replay-window 0
output-mark 0xd0/0xffffffff
aead rfc4106(gcm(aes)) {{KEY}} 128
anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000
sel src ::/0 dst ::/0 -
检查 IPSec 策略:
ip xfrm policy show预期输出:
src ::/0 dst {{DST_SUBNET}}
dir out priority 0
mark 0xe0/0xffffffff
tmpl src {{SRC_IP}} dst {{DST_IP}}
proto esp spi 0x{{SPI}} reqid 1 mode tunnel -
使用
tcpdump验证加密:tcpdump -i any esp预期输出: 通信过程中应能看到 ESP 数据包。
2. 密钥轮换测试
该测试确保 PSK 更新机制的可靠性,并验证密钥变更期间的服务连续性。
步骤
-
记录初始 SPI:
ip xfrm state show预期输出:
src {{SRC_IP}} dst {{DST_IP}}
proto esp spi 0x{{INITIAL_SPI}} reqid 1 mode tunnel
aead rfc4106(gcm(aes)) {{INITIAL_KEY}} 128 -
在应用之间持续发送流量:
kubectl exec <sleep-pod> -- curl http://<echo-service> -
更新预共享密钥:
kmeshctl secret create --key=<new-key> -
验证 xfrm 规则中的 SPI 和密钥已更新:
ip xfrm state show预期输出:
src {{SRC_IP}} dst {{DST_IP}}
proto esp spi 0x{{INITIAL_SPI + 1}} reqid 1 mode tunnel
aead rfc4106(gcm(aes)) {{NEW_KEY}} 128 -
确认通信连续性与加密状态。
Offload Authorization E2E 测试
Authorization 测试统一步骤
-
应用策略:
kubectl apply -f <policy-file>.yaml -
测试连通性:
kubectl exec <sleep-pod> -- curl http://<echo-service>预期输出:
- ALLOW 策略: curl 命令应成功,HTTP 响应码应为
200。 - DENY 策略: curl 命令应失败,且收不到响应。
- ALLOW 策略: curl 命令应成功,HTTP 响应码应为
策略示例
IP Authorization 策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ip-allow-policy
namespace: test-ns1
spec:
action: ALLOW
rules:
- from:
- source:
ipBlocks:
- "{{ALLOWED_IP}}"
Port Authorization 策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: port-allow-policy
namespace: test-ns1
spec:
action: ALLOW
rules:
- to:
- operation:
ports: ["{{ALLOWED_PORT}}"]
Header Authorization 策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: header-allow-policy
namespace: test-ns1
spec:
action: ALLOW
rules:
- when:
- key: request.headers["{{HEADER_NAME}}"]
values: ["{{HEADER_VALUE}}"]
Namespace Authorization 策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: namespace-allow-policy
namespace: test-ns1
spec:
action: ALLOW
rules:
- from:
- source:
namespaces: ["{{SOURCE_NAMESPACE}}"]
Host Authorization 策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: host-allow-policy
namespace: test-ns1
spec:
action: ALLOW
rules:
- to:
- operation:
hosts: ["{{TARGET_HOST}}"]
清理
测试完成后,清理相关资源:
kubectl delete -f sleep.yaml
kubectl delete -f echo.yaml
kubectl delete authorizationpolicy --all -n test-ns1