想把局域网里的 Web 服务器暴露到外网,本质只有两条路:要么让外部流量“找到”你家的公网地址,要么让内网机器主动“连出去”建立隧道,前者靠公网 IP 加端口映射,后者靠内网穿透,选哪条,取决于你手上有没有公网 IPv4,以及愿不愿意为稳定性付费。
为什么外网打不开你局域网里的 Web 服务器
家里的路由器在运营商那边只有一个地址,内网所有设备共用它上网,这就是 NAT,外部请求到达路由器后,如果没有一条明确的转发规则,它不知道该把包送给内网的哪台机器,于是超时。
还有两层常见阻碍:
- 运营商把公网 IPv4 收回去了,近年来多数家庭宽带默认分配的是 100.64.x.x 这类运营商级 NAT 地址,你在路由器 WAN 口看到的并不是真正的公网 IP。
- 80 和 443 端口被封锁,行业共识认为,家用宽带封禁低位端口是普遍做法,即便你有公网 IP,直接用 80 端口对外提供 HTTP 也大概率不通。
所以第一步不是配置,而是判断:登录路由器管理页,看 WAN 口 IP,再和“curl ip.sb”查到的出口 IP 对比,两者一致,说明你有公网 IPv4;不一致,就走穿透路线,别在端口映射上浪费时间。
外网访问局域网 web 服务器怎么设置:三条可行路线
公网 IP 加端口映射,延迟最低
适合有公网 IPv4、且路由器支持端口转发的用户。
- 给 Web 服务器绑定静态内网 IP,比如在路由器 DHCP 里做地址保留,固定成 192.168.1.10。
- 进路由器“端口转发/虚拟服务器”,外部端口填 8080,内部 IP 填 192.168.1.10,内部端口填 80,协议选 TCP。
- 外部访问地址就是“公网IP:8080”。
- 确认服务器本机防火墙放行:Ubuntu 上执行
sudo ufw allow 8080/tcp,CentOS 用sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload。
缺点是公网 IP 可能随时变,重启光猫就换一个,所以要配 DDNS。
DDNS 动态域名,解决地址漂移
在路由器里开启 DDNS 功能,填入域名服务商提供的接口,或直接用路由器厂商自带的免费二级域名,之后用“yourname.example.com:8080”访问,IP 变了会自动更新解析。
如果路由器不支持,就在服务器上跑一个更新脚本,定时把当前公网 IP 提交给 DNS 服务商的 API,记录类型用 A,TTL 设短一点,600 秒,切换生效更快。
内网穿透,没有公网 IP 也能用
内网机器主动向一台有公网地址的服务器建立长连接,外部用户访问那台服务器,流量被转发回内网,常用工具有 frp、Cloudflare Tunnel、各类商业穿透服务,这条路线对网络环境零要求,代价是多一次中转,延迟增加几十毫秒。
内网穿透和端口映射哪个好?按你的实际条件选
| 对比项 | 端口映射 | 内网穿透 |
|---|---|---|
| 前提条件 | 必须有公网 IPv4 | 无要求,能上网即可 |
| 延迟 | 低,直连 | 多一跳,增加几十毫秒 |
| 稳定性 | 依赖宽带与光猫 | 依赖中转服务器 |
| 成本 | 基本为零 | 自建需云服务器,商业服务按年付费 |
| HTTPS 证书 | 自行配置 | 多数服务可代签 |
| 适用场景 | 家庭 NAS、长期自用 | 临时演示、无公网 IP、跨地域访问 |
一句话判断:能拿到公网 IP 就优先端口映射,拿不到就别纠结,直接上穿透。
没有公网 IP 怎么在外网访问家里的服务器:frp 实操
以一台轻量云服务器做中转,系统 Ubuntu 22.04,公网地址记作 1.2.3.4。
服务端配置
下载 frp 压缩包解压后,写 frps.toml:
bindPort = 7000 vhostHTTPPort = 8080 auth.method = "token" auth.token = "换成你自己的长随机串"
用 systemd 托管,新建 /etc/systemd/system/frps.service,ExecStart 指向 /usr/local/bin/frps -c /etc/frp/frps.toml,sudo systemctl enable --now frps,云服务器安全组记得放行 7000 和 8080。
客户端配置
家里的服务器上写 frpc.toml:
serverAddr = "1.2.3.4" serverPort = 7000 auth.method = "token" auth.token = "和服务端一致" [[proxies]] name = "myweb" type = "http" localIP = "127.0.0.1" localPort = 80 customDomains = ["web.example.com"]
启动后,把 web.example.com 的 A 记录解析到 1.2.3.4,浏览器访问 http://web.example.com:8080 就能打开内网页面。
如果不想带端口号,在云服务器上用 Nginx 反代:
server {
listen 80;
server_name web.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
再配合 certbot 一条命令签证书,sudo certbot --nginx -d web.example.com,HTTPS 就有了。
Cloudflare Tunnel 的替代方案
不想自己维护中转服务器,可以装 cloudflared:cloudflared tunnel login 授权,cloudflared tunnel create myweb 创建隧道,cloudflared tunnel route dns myweb web.example.com 绑定域名,再在 ~/.cloudflared/config.yml 里写 ingress 指向 http://localhost:80,sudo cloudflared service install 常驻,优点是自动 HTTPS、不暴露源站 IP,缺点是国内访问速度受线路影响。
家庭宽带外网访问 web 服务器多少钱:成本与安全
费用大致分三块:
- 中转云服务器:国内轻量应用服务器年付通常在百元级到两三百元区间,配置 1 核 2G 足够跑 frps 加一个小站点;海外或香港节点价格接近,但国内访问延迟明显更高。
- 域名:普通后缀首年常见几十元,续费按注册局定价。
- 商业穿透服务:免费版一般限速在几兆带宽、限制隧道数量,付费版按年计费,适合不想折腾的人。
安全上必须做的几件事:
- 改掉默认端口,SSH 不要用 22,数据库端口一律不对外。
- 服务器装 fail2ban,
sudo apt install fail2ban后开启 sshd 规则,暴力破解几次就封 IP。 - 只反代你真正要公开的那个站点,不要把整个内网网段暴露出去。
- 管理后台加一层 Basic Auth 或接入 Cloudflare Access,别指望“路径没人知道”这种隐蔽式安全。
另外提醒一句:国内云服务器上绑定域名对公网提供 80/443 服务,按规定需要完成 ICP 备案,未备案的域名访问会被拦截,据工信部相关管理规定,这一点没有变通空间。
几个容易踩的坑
- 光猫桥接没做,光猫自己拨号时,端口映射要在光猫里配,或者在路由器里做 DMZ 指向路由器再转发,两层都要通。
- IPv6 被忽略,很多地区已经下发公网 IPv6,路由器防火墙放行对应端口后,用 AAAA 记录即可直连,不需要穿透,检查方法是在服务器上执行
curl -6 ifconfig.co,能返回地址就说明有。 - 只测了内网,配完务必用手机 4G/5G 流量访问一次,别用连着同一个 Wi-Fi 的手机测,那样测的是内网。
- 证书配了但没强制跳转,Nginx 里加一行
return 301 https://$host$request_uri;,避免明文传输。
关于外网访问局域网 web 服务器的常见问题
外网访问局域网 web 服务器必须买云服务器吗?
不必,有公网 IPv4 时,端口映射加 DDNS 就能实现,成本为零,只有在拿不到公网地址、又需要稳定外部入口时,才需要一台中转服务器或商业穿透服务,IPv6 普及的地区,甚至可以完全跳过中转。
家庭宽带 80 端口被封了怎么办?
换成 8080、8443 这类非标端口,通过“域名:端口”访问;或者让 frp 的 vhostHTTPPort 监听非标端口,再用云服务器的 Nginx 反代到 80/443,备案完成的域名在云服务器上走标准端口是合规做法,家庭宽带侧不必强行占用 80。
内网穿透会不会拖慢访问速度?
会增加一跳中转,延迟通常比直连高几十毫秒,带宽上限取决于中转服务器的公网带宽和穿透服务的限速策略,自建 frp 时,中转机的带宽规格就是你的实际上限;用免费商业服务,多数情况下会被限制在几兆以内,传大文件会明显感觉到瓶颈。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/794383.html


