服务部署到阿里云后,外部访问不通,或者想让用户直接用80端口打开跑在3000端口的应用,通常都要靠阿里云服务器端口映射来解决。下面先说原理,再讲三种常见做法,最后列出容易踩的坑。

一、端口映射到底做了什么
端口映射就是把发往某个地址和端口的流量,转发到另一个地址或端口。云服务器上常见两种用法:一是让用户通过80、443这类标准端口访问实际运行在其他端口上的服务;二是把公网端口的请求转给VPC内部的另一台机器,让数据库之类的服务不直接暴露在公网。
阿里云的访问要过两道关。第一道是安全组,决定端口能不能进来;第二道是转发规则,决定流量最后去哪。很多人只配了其中一道,就开始怀疑应用本身有问题。排查时建议按顺序来,先看安全组,再看转发。
二、映射前先确认三件事
- 在控制台确认实例状态正常,并且服务器有公网IP或已绑定弹性公网IP。
- 登录服务器运行netstat -tlnp或ss -tlnp,查看应用监听的地址。如果只监听127.0.0.1,外部流量无论怎么转发都到不了应用,需要把监听地址改为0.0.0.0或具体的内网IP。
- 在安全组入方向放行目标端口。授权对象先填自己办公网络的出口IP段,调通后再视情况放宽,不要一开始就对0.0.0.0/0全开。
- 如果用于网站且使用80或443端口,域名需要先完成ICP备案,否则访问会被拦截。
三、方案一:直接放行端口
如果应用本身就监听在公网可达的端口,比如8080,那只需要在安全组里加一条8080的入方向规则,然后用公网IP加端口访问。这种方式不涉及转发,出了问题也好排查,适合测试环境或内部工具。
代价也很直接。URL里带着端口号不够好看,而且每个服务都要单独开一个端口,暴露面随之变大。所以正式环境一般只开放必要端口,外部访问交给下面两种转发方式来接。
四、方案二:ECS本机使用iptables转发
有个小型电商团队把Node.js后台部署在一台ECS上,应用监听3000端口。他们希望用户直接访问公网IP就能打开页面,不用带端口号,同时MySQL只允许内网连接。
做法是在nat表的PREROUTING链上添加一条REDIRECT规则,把进入80端口的TCP流量改指向本机3000端口。只在本机内改目标端口的场景,不需要开启内核IP转发。如果要把流量转给另一台主机,就得用DNAT,同时开启net.ipv4.ip_forward,并配合MASQUERADE或SNAT。这两套规则思路不同,别混着写。
iptables规则写完要持久化,常用netfilter-persistent保存,否则服务器重启后规则会丢。安全组这边只放行80,3000保持关闭。
这个方案几乎没有额外成本,但规则散落在系统层。如果有好几台服务器,很容易出现配置不一致,iptables规则的可读性也差,团队交接时要专门讲一遍。
五、方案三:NAT网关的DNAT规则
业务变大,或者需要把公网流量分发到VPC里的多台服务器时,阿里云的公网NAT网关更合适。在网关里添加DNAT条目,指定公网IP和端口,再映射到目标私网IP和端口。
沿用上面的团队来说,如果后来又加了一台应用服务器,就在NAT网关里为两台机器各配一条DNAT,分别指向各自的私网地址。规则集中在控制台,改动和审计都清楚得多。
有两点要留意。NAT网关按规格和流量计费,成本要提前算进去。另外,转发的目标ECS安全组仍需放行对应端口,只配DNAT不放行,访问依然不通。
六、常见问题与注意事项
- 访问超时,按顺序排查:安全组入方向、应用监听地址、转发规则是否生效,最后看目标机器本地防火墙。
- Linux下1024以下端口需要root权限才能直接监听,所以多数情况下转发比改应用监听端口更省事,也少出权限问题。
- 数据库、缓存这类敏感端口只对内网开放。为了临时调试映射到公网,调完忘了关,这种情况很常见。
- 改规则前先把原配置导出或记下来,出问题时才能快速回滚。
小规模场景用iptables就够了,规模上来后迁移到NAT网关,架构会清晰很多。具体选哪种,主要看机器数量和团队的维护习惯。