如何配置防火墙NAT规则以通过公网IP外部访问Proxmox内K8s集群中Ingress托管的应用
嘿,我来帮你捋清楚这个配置!你之前用NodePort逐个配置NAT的方式虽然可行,但用上Ingress之后,咱们可以更高效地搞定外部访问——只需要针对Ingress Controller的NodePort配置一两条NAT规则,就能让所有通过Ingress托管的应用都能被外部访问到啦~
第一步:确认Ingress Controller的NodePort
首先你得明确Ingress Controller对外暴露的NodePort端口,从你提供的测试命令来看,你用的是30747这个端口(就是你curl时指定的172.16.104.107:30747)。如果你的Ingress Controller同时支持HTTPS,还会有一个对应的HTTPS NodePort(比如常见的30443),你可以通过kubectl get svc -n ingress-nginx(假设Ingress Controller部署在ingress-nginx命名空间)查看完整的端口信息。
第二步:配置Proxmox的NAT规则
接下来咱们把Proxmox公网网卡(你这里是vmbr0)的80/443端口(这是HTTP/HTTPS的默认端口,外部用户访问更友好)转发到K8s节点的Ingress Controller NodePort上,具体规则如下:
1. 配置HTTP(80端口)的NAT规则
把下面的规则添加到Proxmox的网络配置文件(通常是/etc/network/interfaces)里的vmbr0配置段中:
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 172.16.104.107:30747 post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 172.16.104.107:30747
2. (可选)配置HTTPS(443端口)的NAT规则
如果你的Ingress用到了HTTPS,对应添加以下规则(替换30443为你实际的HTTPS NodePort):
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to 172.16.104.107:30443 post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to 172.16.104.107:30443
第三步:验证配置
配置完成后,重启Proxmox的网络服务(systemctl restart networking)让规则生效。之后外部用户就可以通过你的公网IP访问了:
- 如果你的域名已经解析到这个公网IP,直接访问
http://nginx.example.com就能打开测试的Nginx应用 - 没有域名的话,可以在本地hosts文件里把
nginx.example.com映射到你的公网IP,或者用curl指定Host头测试:
curl --header "HOST: nginx.example.com" http://你的公网IP
额外小贴士
- 如果你有多个K8s节点,建议把Ingress Controller部署成DaemonSet,这样每个节点都会运行Ingress Controller实例,你可以把NAT规则转发到多个节点的IP,提升可用性
- 为了防止Proxmox重启后iptables规则丢失,你可以执行
iptables-save > /etc/iptables/rules.v4把规则保存下来,或者确保上面的post-up/post-down规则已经正确写入网络配置文件
备注:内容来源于stack exchange,提问作者estem estem




