如何为KVM单节点OpenStack配置NAT重映射以实现外部访问
解决单节点OpenStack(KVM NAT模式)外部访问云实例及控制台问题
我之前在单节点OpenStack+KVM的环境里遇到过几乎一模一样的问题,当时也是因为网络政策限制没法用桥接,只能靠NAT模式折腾,下面几个方案亲测可行,你可以试试:
方案1:修改KVM NAT端口转发规则,映射浮动IP到主机外部IP
这个方案的核心是用iptables把外部发往主机IP的流量,转发到OpenStack浮动IP对应的云实例上,同时处理回程流量的SNAT转换。
- 先确认KVM默认NAT网络的配置:
# 查看当前KVM网络列表 virsh net-list # 导出默认NAT网络的XML配置,找到内部网段(比如192.168.122.0/24) virsh net-dumpxml default - 添加iptables转发规则(替换
X.X.X.X为你的主机外部IP,Y.Y.Y.Y为云实例的浮动IP):# 转发指定端口(比如SSH的22端口、HTTP的80端口) iptables -t nat -A PREROUTING -d X.X.X.X/32 -p tcp --dport 22 -j DNAT --to-destination Y.Y.Y.Y:22 iptables -t nat -A PREROUTING -d X.X.X.X/32 -p tcp --dport 80 -j DNAT --to-destination Y.Y.Y.Y:80 # (可选)转发所有端口(适合测试环境,生产环境不建议) iptables -t nat -A PREROUTING -d X.X.X.X/32 -j DNAT --to-destination Y.Y.Y.Y iptables -t nat -A POSTROUTING -s Y.Y.Y.Y/32 -j SNAT --to-source X.X.X.X - 开启IP转发并永久生效:
# 临时开启 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效,编辑/etc/sysctl.conf,添加或修改: # net.ipv4.ip_forward = 1 sysctl -p - 保存iptables规则避免重启失效:
iptables-save > /etc/iptables/rules.v4
方案2:让OpenStack浮动IP直接使用主机外部IP
如果你的主机有额外的公网/外部可达IP,可以直接把这个IP加入OpenStack的浮动IP池,这样创建的浮动IP就是主机的外部IP,外部可以直接访问。
- 创建外部网络和子网(替换
X.X.X.X/32为你的主机外部IP段):openstack network create --external --provider-physical-network provider --provider-network-type flat external-network openstack subnet create --network external-network --subnet-range X.X.X.X/32 --no-dhcp --gateway X.X.X.X external-subnet - 修改Neutron L3代理配置:
编辑/etc/neutron/l3_agent.ini,找到并修改以下配置:
可以用external_network_bridge = gateway_external_network_id = <你的external-network的ID>openstack network show external-network获取网络ID。 - 重启Neutron L3代理服务:
systemctl restart neutron-l3-agent - 之后创建浮动IP时选择这个外部网络,分配的IP就是主机的外部IP,外部可以直接访问云实例。
方案3:调整OpenStack控制台配置,让外部可以访问VNC/SPICE控制台
默认情况下,OpenStack的VNC控制台绑定到KVM NAT网桥的内部IP,外部无法访问,需要修改Nova的配置:
- 编辑
/etc/nova/nova.conf,找到[vnc]段修改:[vnc] vncserver_listen = 0.0.0.0 vncserver_proxyclient_address = <主机的外部IP> novncproxy_base_url = http://<主机外部IP>:6080/vnc_auto.html - 重启Nova相关服务:
systemctl restart nova-compute nova-novncproxy - 确保主机防火墙开放6080端口,或者用iptables转发该端口的流量。
额外注意事项
- 如果主机用的是动态IP,建议搭配DDNS服务,把域名绑定到主机IP,避免IP变化导致访问失效。
- 生产环境下,尽量避免批量转发所有端口,建议只开放业务需要的端口,提升安全性。
内容的提问来源于stack exchange,提问作者mtn
相关产品推荐
相关产品推荐

