两台服务器使用一个公网IP的核心答案是:通过端口映射(NAT)、反向代理或内网穿透,将不同服务的流量按规则分发到内网的不同服务器上。这不是什么高深技术,而是机房和云平台里最常用的网络架构,说白了,就是让一台服务器当“前台接待”,另外一台在后台干活。
两台服务器共用公网IP的底层逻辑
很多人第一次接触这个场景时,会误以为需要给第二台服务器单独买IP,公网IP的本质是流量的入口地址,而服务器处理请求靠的是“IP+端口”这个组合,一台服务器默认占用80(HTTP)和443(HTTPS)端口,第二台服务器只要换一个端口,或者让第一台服务器根据域名把请求转发过去,就能实现共用。
举个例子,你有一台公网服务器(IP假设是1.2.3.4),上面跑着网站,另一台内网服务器跑着数据库或API服务,你完全可以让公网服务器只开放一个特殊端口(比如8080),把进来的流量通过内部网络转给那台内网服务器,这就是端口映射,如果用域名来区分,就是反向代理,如果两台服务器都在内网、没有公网IP,那就需要内网穿透工具。
用端口映射让两台服务器共用一个公网IP
适用场景:一台服务器有公网IP,另一台在同一个内网(比如同一台物理机上的虚拟机,或者同一个局域网里的物理机),这是成本最低、配置最快的方案,不做任何应用层改造。
核心操作步骤
以Linux环境下的iptables为例(这是最通用的方法),假设公网服务器IP是1.2.3.4,内网服务器IP是192.168.1.10,你想把公网IP的8080端口映射到内网服务器的80端口,操作如下:
- 开启IP转发:编辑
/etc/sysctl.conf,设置net.ipv4.ip_forward = 1,然后执行sysctl -p生效。 - 添加DNAT规则(修改目的地址):
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80 - 添加SNAT规则(修改源地址,让内网服务器能回包):
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1(这里的192.168.1.1是公网服务器的内网IP)
- 放行防火墙:如果开启了firewalld或ufw,记得放行8080端口。
如果你是云服务器(如简米云、酷番云),不用碰iptables,直接在安全组里添加一条入方向规则,放行8080端口即可,云平台底层已经帮你做好了NAT转发。
端口映射的优缺点
- 优点:配置简单,性能损耗几乎为零,不依赖任何第三方软件,原生Linux内核就支持。
- 缺点:端口资源有限,如果服务多了(比如要映射5个服务),端口管理会乱;内网服务器上看到的访问来源IP是公网服务器的内网IP,程序日志里拿不到真实的客户端IP。
用反向代理实现一台公网服务器带多台内网服务器
适用场景:两台服务器都跑Web服务,或者你想用同一个公网IP的80/443端口承载多个网站,这是网站架构里最常用的做法,行业共识是Nginx是干这个活儿的最佳工具。
用Nginx实现域名分流
假设你有两个域名:www.example.com和api.example.com,都解析到公网IP 1.2.3.4,公网服务器上装Nginx,配置两个server块:
www.example.com代理到内网A服务器的80端口api.example.com代理到内网B服务器的8080端口
核心配置片段如下:
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://192.168.1.10:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://192.168.1.11:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意proxy_set_header这两行,这是让内网服务器能记录到真实访问IP的关键,没有这行配置,内网服务器的日志里全是公网服务器的内网IP,排查问题时会很痛苦。
Nginx反向代理与端口映射怎么选
| 对比维度 | 端口映射 | Nginx反向代理 |
|---|---|---|
| 代理层级 | 传输层(四层) | 应用层(七层) |
| 性能 | 高,内核转发 | 稍低,有CPU开销 |
| 域名区分 | 不支持,只能靠端口 | 天然支持多个域名 |
| 获取真实IP | 可能需要额外配置 | 通过header头传递 |
| HTTPS证书 | 需要每个端口配证书 | 可以在Nginx统一管理证书 |
怎么选择:业务是数据库、SSH这类非HTTP协议,用端口映射;业务是Web网站、API接口,必须用反向代理。
没有公网IP时用内网穿透(FRP)
适用场景:两台服务器都在内网(比如家里两台的NAS、办公室服务器),但需要对外提供服务,这时候需要一个有公网IP的中转服务器(最便宜的那种云主机就行),用内网穿透工具把流量打通。
FRP实现内网穿透的配置
FRP是目前使用最广的内网穿透工具(开源、免费、稳定),你需要在公网服务器上装
frps(服务端),在内网服务器上装frpc(客户端)。
假设公网服务器IP是1.2.3.4,内网服务器A跑着网站(80端口),内网服务器B跑着SSH(22端口),公网服务器的frps.ini配置:
[common] bind_port = 7000
内网服务器A的frpc.ini配置:
[common] server_addr = 1.2.3.4 server_port = 7000 [web] type = tcp local_ip = 127.0.0.1 local_port = 80 remote_port = 8080
内网服务器B的frpc.ini配置:
[common] server_addr = 1.2.3.4 server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
配置完成后,访问2.3.4:8080就能连到内网服务器A的网站,2.3.4:6000能SSH到内网服务器B,整个过程不需要在路由器上做任何端口转发,只要能访问外网就行。
内网穿透的坑
- 带宽瓶颈:所有流量都走公网中转服务器,中转服务器的带宽就是你的出口带宽,酷番云轻量服务器最便宜的带宽也就4-6Mbps,跑小型API够用,传大文件会卡。
- 安全性:frps服务端一定要设置
token认证,否则任何人都能连你的frps端口,扫描到你内网的服务。 - 延迟问题:如果是跨地域访问(比如服务器在华南,你在华北),延迟会明显增加,不适合实时性要求高的场景。
负载均衡器的多端口与多域名配置
适用场景:两台服务器本身都有公网IP,但你想用一个IP做统一入口,同时分摊流量或做高可用,这属于云原生架构的范畴了。
简米云或酷番云的负载均衡(SLB)实例默认只有一个公网IP,但可以在控制台添加多个监听端口,每个端口指向不同的后端服务器。
- 监听80端口 → 转发到后端服务器A
- 监听443端口 → 转发到后端服务器B
- 监听8080端口 → 转发到后端服务器A和B(轮询模式)
这种方式比自建Nginx的好处是:负载均衡器本身是云厂商的托管服务,不占用你自己服务器的CPU和带宽,近年来云厂商的SLB产品已经非常成熟,配置起来就是控制台点几下的事,还自带健康检查(后端服务器挂了自动摘除)。
如果追求省钱,也可以用Keepalived+HAProxy在两台服务器上做软件负载均衡,但这需要两台服务器之间有内网通信,并且要处理脑裂问题,运维成本高不少。多数情况下,直接用云厂商的负载均衡是性价比最高的选择
。
方案实施注意事项与常见误区
端口冲突问题
公网IP的端口总数是65535个,但实际能用的一般只有高位端口(比如10000以上)。注意不要使用已被系统占用的端口,比如公网服务器的MySQL(3306)和Redis(6379)端口,如果你把这些端口映射出去,相当于把数据库裸奔在公网上,黑客扫描一下就能爆破密码。
对于普通家庭带宽的特别提醒
家用的宽带运营商(移动、电信、联通)通常在80和443端口做了封锁,你需要备案才能用,就算用内网穿透,如果中转服务器在国内,域名也要ICP备案,这是硬性规定,据工信部公开信息,未备案的域名指向国内服务器会被直接阻断。
安全的底线
- 无论用哪种方案,内网服务器必须设置防火墙,只允许来自公网服务器或负载均衡器内网IP的访问,不面向公网直接暴露。
- 用端口映射时,不要把3389(Windows远程桌面)或22(SSH)直接暴露到公网,如果一定要暴露,必须改默认端口并做IP白名单限制。
- 定期检查公网服务器的Nginx访问日志和系统登录日志,任何异常重试都是被扫描的信号。
Q&A:两台服务器共用一个公网IP的常见疑问
两台服务器共用一个公网IP会不会影响网站速度?
不会直接影响,取决于你使用的方案:如果是端口映射,数据包在内网转发,延迟基本可以忽略;如果是反向代理,Nginx转发是内存级操作,多一跳的延迟在毫秒级,真正影响速度的是公网服务器的带宽和内网服务器的性能上限。只要内网是千兆网卡,损耗远小于外网网络波动。
端口映射和Nginx反向代理哪个更适合新手?
看业务类型,如果你只是想让外网访问一下内网的测试网站,端口映射更直接,一条iptables命令就能搞定,如果你有多个域名要跑不同服务,那只能学Nginx反向代理,这是建站的基础技能,没有捷径,Nginx配置文件的语法不复杂,核心就是server_name和proxy_pass。
内网穿透和端口映射在安全性上有什么区别?
端口映射只暴露你指定的那一个端口,其他端口不对公网开放,攻击面更小,内网穿透等于在公网服务器上开了一个专用隧道,虽然frp的隧道本身是加密的,但公网服务器的bind_port(如7000)是暴露在公网上的,一旦被扫描到,就有被暴力破解的风险,建议设置高强度token,并定期查看frps日志,看有没有来源异常的连接尝试,内网穿透的所有流量都会经过中转服务器,如果中转服务器存有敏感数据,风险比端口映射高一个等级。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/598993.html




