阿里云内网 ip 与公网 ip 映射配置方法讲解

不少人初次上手阿里云服务器都会碰到一个疑问:在服务器内执行ifconfig命令,看到的地址是172或者10开头,可阿里云控制台页面显示的却是公网IP,两个地址不一致,SSH连接到底该选用哪一个?这背后其实就是阿里云内网IP和公网IP的NAT映射机制。公网IP会通过NAT模式映射到私网IP,操作系统层面只能读取到私网地址,公网IP这一层由阿里云底层来处理。

搞懂这个底层逻辑之后,想要配置映射,大体就两条可选方案:使用NAT网关,或是直接给ECS实例绑定EIP。具体选择哪一种,要看实际业务场景。

如果VPC环境里只有一两台机器需要对外提供访问,最简单省事的方式就是直接绑定弹性公网IP。进入ECS控制台选中目标实例,在网络与安全组板块完成EIP绑定操作。但有个限制需要留意:ECS实例必须是专有网络类型,不能预先配置固定公网IP或是绑定其他EIP,单台实例只能绑定一个EIP。绑定完成之后,服务器内部依旧看不到这个公网IP,不过外网已经可以通过这个公网IP访问实例。该方案适合单机对外提供服务,操作简单直接,缺点是每一台需要公网访问的实例都要单独分配EIP,机器数量多了之后会造成IP资源浪费。

阿里云内网 ip 与公网 ip 映射配置方法讲解

当VPC内有多台机器都需要对外暴露服务时,选用公网NAT网关搭配DNAT会更合理。阿里云NAT网关分为两类,公网NAT网关可以绑定EIP实现公网访问,VPC NAT网关无法绑定EIP,主要用于解决不同VPC网段冲突下的互相访问。做公网映射,要选用公网NAT网关。

DNAT的配置逻辑并不复杂。新建公网NAT网关,绑定对应的EIP,之后在DNAT管理页面创建条目。这里要区分两种模式。端口映射,就是将公网IP指定端口映射到内网ECS的对应端口,举例来说,公网EIP的80端口转发到内网172.16.0.10的8080端口,适合多个服务共用同一个EIP,依靠不同端口转发到不同后端机器。IP映射,是把完整公网IP直接绑定到单台ECS,这台服务器独享该公网地址,适合需要完整IP级访问的场景,例如部分游戏服务或者使用非标准端口的应用。绝大多数场景使用端口映射就足够,IP映射相对来说资源开销更大。

配置DNAT条目时有几个参数很容易填错。外部端口,指公网访问时使用的端口;内部端口是ECS上服务实际监听的端口,二者数值可以不一样,不要弄反。私网IP填写ECS的内网地址,不能填公网IP。另外,如果外部端口填写端口段,内部端口也必须填写端口段,两段范围要保持对应。条目配置完成之后,记得在路由表新增一条目标网段0.0.0.0/0、下一跳指向NAT网关的路由,很多人DNAT配置完成却无法访问,基本都是漏掉这一步。

安全组还有一个常见坑点。VPC网络安全组规则不分内网和公网,配置的入方向规则对内网、外网流量同时生效。也就是说DNAT条目里填写的内部端口,安全组入方向必须放行,否则外部请求到达ECS实例时会直接被拦截。排查DNAT不通的故障,可以按这个顺序检查:先确认NAT网关路由是否配置,核对DNAT条目参数,接着检查安全组是否放行内部端口,最后确认ECS内部的服务正常监听对应端口。

还有一种场景需要说明。有些业务不需要外网主动访问内网服务,而是VPC内部机器主动向外发起网络请求,比如拉取代码依赖包、调用第三方API。这种场景适合配置SNAT。SNAT可以让VPC内多台没有公网IP的ECS共用同一个EIP访问互联网,ECS向外发起请求时源IP转换为NAT网关绑定的EIP,回程流量再还原地址。优势是不用给每台实例单独分配公网IP,节省IP资源,同时隐藏内网网络拓扑。

最后说一下不使用NAT网关的替代方案。在已经绑定公网IP的服务器上配置iptables实现DNAT转发也能达到类似效果,参考规则:iptables -t nat -A PREROUTING -p tcp -d 公网服务器内网IP --dport 需要转发的端口 -j DNAT --to-destination 内网服务器IP:端口。但这种方式运维成本偏高,服务器重启之后配置规则会丢失,同时没有NAT网关自带的全托管监控和带宽管理能力。临时测试可以尝试,生产环境优先选择NAT网关方案。

免责声明:本文提供的方法与建议仅供技术参考,实际部署效果受机房环境、运营商线路、系统配置等多重因素影响。请在专业人员指导下操作,因自行操作导致的业务损失本站不承担责任。