Kubernetes中如何阻止通过服务器IP直接访问LoadBalancer类型Nginx服务?
阻止Kubernetes中Nginx服务通过裸IP访问的原生方法
以下是几种Kubernetes原生的实现方案,可实现仅允许指定域名访问、阻止裸IP直连的需求:
方法1:使用Ingress资源(推荐)
Ingress是Kubernetes原生的HTTP路由管理资源,通过配置主机规则,可限定仅匹配指定域名的请求被转发到后端Nginx服务,直接访问负载均衡公网IP的请求会被Ingress Controller拒绝(通常返回404或403)。
示例Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-domain-ingress annotations: # 若使用nginx-ingress控制器,添加此注解确保非匹配请求被拒绝 nginx.ingress.kubernetes.io/default-backend: default-http-backend spec: rules: - host: your-domain.com # 替换为你的实际域名 http: paths: - path: / pathType: Prefix backend: service: name: nginx-service # 替换为你的Nginx服务名称 port: number: 80
部署后,只有携带Host: your-domain.com请求头的流量才会被转发到Nginx服务,直接访问公网IP的请求会被返回默认错误响应。
方法2:修改Nginx Pod内部配置
从应用层入手,直接在Nginx配置中指定允许访问的域名,同时设置默认虚拟主机返回拒绝响应,阻断裸IP访问。
- 创建包含自定义配置的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-custom-config data: nginx.conf: | events {} http { # 仅允许指定域名的虚拟主机 server { listen 80; server_name your-domain.com; # 业务相关配置 location / { root /usr/share/nginx/html; index index.html; } } # 默认服务器,处理裸IP或其他域名的请求 server { listen 80 default_server; return 403; # 返回禁止访问,也可替换为404或自定义页面 } }
- 修改Nginx Deployment,将ConfigMap挂载到Pod的配置目录:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf volumes: - name: nginx-config configMap: name: nginx-custom-config
配置生效后,Nginx会直接拒绝所有不匹配指定域名的请求,包括通过裸IP发起的访问。
方法3:利用Service外部流量策略(辅助方案)
若你的LoadBalancer服务仅需对接Ingress流量,可将Nginx Service的externalTrafficPolicy设置为Local,确保仅Ingress Controller所在节点能访问Nginx Pod。这种方式通常作为前两种方案的辅助手段使用。
内容的提问来源于stack exchange,提问作者Domenico
相关产品推荐
相关产品推荐

