尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

防火墙服务器映射配置指南:实现外网访问内网WEB服务器

防火墙服务器映射配置指南:实现外网访问内网WEB服务器 最近我处理过好几次和“防火墙配置服务器映射实现外网主机访问企业内部WEB服务器”相关的问题场景几乎都一样公司内网有一台 WEB 服务器跑着内部系统或官网开发或业务同事希望出差在外也能通过浏览器访问于是找到网络管理员要求在防火墙上做一条“服务器映射”。听起来确实不复杂很多设备上甚至有一个叫“端口映射”或者“NAT Server”的按钮填上公网端口、内网 IP、内网端口保存即可。但真正落地时问题往往不是“点一下”那么简单。外网访问不通、内网访问不了公网域名、通了但页面打不开、明明配置了却偶尔丢包……这些现象背后很少是单条规则写错而是整个通信链路里某个环节没有自洽。我的一个核心判断是服务器映射只是这张网络链路上的一个“入口动作”真正决定外网主机能不能访问到内网 WEB 服务器取决于目的地址转换、安全策略、服务器监听地址、回包路径四件事是否同时成立。配置时如果只盯着 NAT 按钮大概率会漏掉后面三件事。这篇文章就把这条链路从头拆到尾顺便把那些最容易让人误会的坑说清楚。1. 先理清需求服务器映射到底解决的是哪一层通信问题?1.1 外网主机访问内网服务器数据包要经过几个阶段先画一条最简单的访问路径外网主机 - 企业防火墙 WAN 口公网地址 - 内部 WEB 服务器这条路径不是单向的而是一次完整 TCP 通信。外部浏览器先发一个 SYN 包目标地址是防火墙的公网 IP目标端口是 80防火墙收到后根据自己的 NAT 规则把目的地址改写为内部服务器的内网地址WEB 服务器收到请求后需要回复 SYN-ACK这个回包要原路返回外网主机然后浏览器继续完成握手、发送 HTTP 请求、接收响应。所以这里至少存在四类动作入站时的目的地址转换也就是把公网地址改写成一个内网地址。防火墙安全策略决定外网到内网的这个方向是否允许访问。服务器自身的处理 WEB 服务必须监听在能被访问到的地址上。回包路径服务器产生的响应能正确回到防火墙再由防火墙送往外网。很多人配置失败是因为只做了第 1 步而第 2 步没有做或者第 3、第 4 步根本没想到。1.2 “映射”不等于“放行”也不等于“一定能通”我在排查问题时发现一个常见误解认为“做了服务器映射就自动允许外网访问”。在企业防火墙上“地址转换”和“安全策略”通常是两个独立逻辑。不同厂商叫法不一样有的设备把映射配置放在“NAT 服务器映射”里安全规则另外配置。有的设备把这类功能叫“目的地址转换”策略叫“安全策略”。还有的下一代防火墙在接口上勾选“允许所有”才自动生成隐含规则。但无论如何底层逻辑都类似NAT 解决的是“流量要送到哪里”安全策略解决的是“这个方向的流量到底允不允许”。如果把映射比作给访客写了一个门牌号安全策略就是门口保安手里的允许访问名单。没有名单客人到了门口依然进不去。在常见的企业网络里防火墙外部接口和内部接口通常分属不同安全域默认拒绝跨域流量。所以做服务器映射时最好把“目的 NAT”和“安全策略放行”当成一对配置来检查。我的习惯是在同一张方案清单里同时记录两条规则凡是只配了映射没有配安全策略的先去查策略。2. 最小可用配置从 NAT 规则到安全策略的一次完整放行2.1 先把网络要素列清楚再动手配很多人拿到需求就直接在防火墙上新增一条映射结果配置不出来或者找不到选项往往是因为没有先把网络要素列出来。我建议在配置前先画一张最简单的表项目示例值说明内网服务器 IP192.168.1.10尽量使用固定 IPDHCP 分配地址容易漂移内网 WEB 服务端口80按实际使用的 Nginx、Apache、IIS 端口为准服务器所在防火墙接口/区域DMZ 或 Trust决定了安全策略里涉及哪些安全域公网地址/防火墙 WAN 口 IP202.100.10.2作为外网用户访问的目标地址对外发布端口80 或 8080可以和外网访问端口不一样常见做法是外部 80 映射内部 8080允许访问的源地址0.0.0.0/0 或指定公网 IP如果只给合作方访问建议填对方出口 IP这张表不复杂但非常重要。实际排障时很多问题就出在“内网服务器 IP 是自动获取的”“服务器所在区域搞混了”“对外端口记错了”这些底层信息上。2.2 添加目标地址转换规则在防火墙上配置映射时不同厂商界面不一样。有的叫“服务器映射”有的叫“NAT Server”有的叫“目的 NAT”还有的集成在“虚拟服务器”或“端口映射”里。如果不确定可以在设备帮助里搜 “NAT”、“Server” 这几个词比硬翻菜单更快。配置的核心内容通常就三行外部访问地址防火墙 WAN 口公网 IP 或接口。外部访问端口浏览器要访问的端口比如 80。内部服务器地址和端口比如 192.168.1.10 的 80或者内网 8080。如果外部端口 80 已经被公网侧封禁或者内网服务不是 80可以用不相同的端口做映射。比如内部 Nginx 监听 8080外部访问端口设置为 8080然后让外网用户通过http://公网IP:8080访问。但这里要提醒不要把外部端口随意改成像 8888、6666 这种“看起来隐蔽”的端口就以为安全了。改端口只能降低被扫描命中的概率不能替代访问控制。后续我会专门说安全边界。2.3 放行从外部区域到服务器区域的安全策略NAT 规则建立后如果仍然访问不通下一个大概率问题就是安全策略没有放行。在大多数企业防火墙里需要新增一条类似下面的策略源区域外部接口所在的安全区域常见叫 untrust、WAN、外网。目的区域服务器所在的安全区域常见叫 trust、DMZ、server。协议/端口TCP 80或者 TCP 8080。源地址根据需求填写可以是任意地址也可以是指定 IP 段。目的地址这里最容易有歧义。目的地址到底填什么取决于该设备策略检查和 NAT 的顺序。有的防火墙先执行安全策略再执行 NAT那么策略里目的地址还是转换前的公网 IP有的防火墙先做 NAT后查安全策略那么策略里目的地址就要写转换后的内网服务器 IP。这个细节是很多工程师排障时的盲区。不要觉得规则填错了大不了不通最怕的是你随手填了一个 IP然后又加了一条“全放通”规则来兜底最后变成外网对内部所有网段都开放了。建议每配一条策略都做个备注记录“经过 NAT 转换前还是转换后”。2.4 服务器网关和回包路径要一致目的 NAT 和安全策略都配好外网到服务器的数据包已经能送到。但服务器要回复回包也得出去。正常状态下防火墙是基于会话做状态检测的外网主机访问内网服务器建立会话后防火墙会记住这个连接的状态服务器回包送到防火墙防火墙再把源地址从内网 IP 改回公网 IP。这个过程叫会话表或状态表。但这里有个前提服务器的默认网关必须指向防火墙的内网接口地址或者至少保证回包会经过这台防火墙。如果服务器的默认网关写错回包直接交给另一台交换机或路由器这个路由器不知道如何把这个连接状态维持住回包很可能被丢弃或者以错误源地址发出去。结果就是访问卡在 TCP 握手阶段外面看到连接超时。我在实际项目中就遇到过内网服务器配了双网卡一条接业务网一条接另一台设备默认路由指向了非防火墙一侧导致端口映射始终不稳定。3. 一个最容易引起误解的坑内网访问映射公网地址为何不通?3.1 现象外网能通办公室内网却打不开 website这类问题排名靠前。配置完服务器映射后用手机 4G/5G 访问公网 IP 完全正常偏偏在办公室局域网里访问同一个公网 IP 或域名时打不开或者一直转圈。不少人第一反应是防火墙把内网 IP 封了或者 WEB 服务器做了 IP 限制。其实很多时候问题出在 NAT 回流上。简单解释一下内网用户访问公网 IP 时数据包的源地址是内网 IP目的地址是防火墙的公网 IP。这个数据包会先被内部网关送到防火墙防火墙如果只配置了一条“外网到内网服务器”的目的 NAT它可能不知道要把这种从内部发往自己公网 IP 的流也做转换和转发。有的设备会直接把数据包转发到外网结果包从公网绕了一圈也没回来有的设备转发了但回包源地址变成内网服务器 IP客户端对不上刚刚请求的公网 IP直接丢弃。3.2 两种处理方式第一种方式把内部用户访问的域名解析成内网服务器地址。也就是“内网用户走内网 IP外网用户走公网 IP”。这种方式最简单也最稳定。适用场景是内部员工访问时不需要关注公网 IP只要在内部 DNS 里做一条解析记录指向 WEB 服务器的内网地址即可。缺点是如果外网域名被硬编码在 HTTP 请求头或 Web 服务器虚拟主机配置里内部访问用不同 IP 可能导致虚拟主机匹配异常。第二种方式在防火墙上开启 NAT 回流也叫 NAT hairpin、NAT loopback、内部 NAT 等。不同厂商名称不同。开启后防火墙会对“内网访问公网地址”的流量也做目的 NAT 和源 NAT让内网用户也能像外网用户一样通过公网 IP 访问内部服务器。两种方式没有绝对优劣但必须明确选择。最怕的是同时用两种方式又没有统一域名逻辑最后出现一会儿能访问一会儿不能访问。我的建议是如果公司规模不大或者只是临时验证优先考虑第一种用内部域名解析到内网 IP如果确实需要所有人统一使用同一个公网域名访问那就在防火墙上确认回流配置是否支持并在变更窗口内用一台办公室主机实际验证。4. WEB 服务器也要配合监听、本地防火墙和端口占用4.1 服务器没有监听外网可达地址再好的 NAT 也没用配置完网络设备后如果还是不通过下一步一定要回到服务器本体检查。NAT 规则只是把外网用户的请求送到服务器内网 IP 的某个端口上但 WEB 服务进程如果根本没有监听这个地址或端口连接依然无法建立。在 Linux 服务器上可以用以下命令查看监听情况ss -lntp | grep -E :(80|443|8080)\b如果结果是LISTEN 127.0.0.1:80说明 WEB 服务只监听了本机回环地址。这时候无论防火墙怎么配置外网请求到达服务器网络接口后也会被拒绝因为服务进程没有监听在服务器内网 IP 上。解决办法是让服务监听在0.0.0.0或服务器实际内网 IP 上。以 Nginx 为例配置里通常写成listen 80;或listen 0.0.0.0:80;而不是listen 127.0.0.1:80;。Windows 下的 IIS 同理需要检查站点绑定里是否有服务器内网 IP 或“全部未分配”。很多教程会把失败原因全推给防火墙实际我查到过不少案例防火墙会话表里流量已经到达了服务器但服务器端口根本没监听。所以遇到问题先别急着加规则去服务器上确认一下监听地址。4.2 服务器本地防火墙和端口占用也要检查除了 Nginx/IIS/Apache 等应用本身服务器上的操作系统防火墙也可能挡住入站连接。Linux 常见的管理工具是 firewalld、ufw 或 iptables。在默认拒绝策略下即使 WEB 服务监听了端口入站连接也会被系统防火墙丢弃。放行操作要按实际发行版来选择firewalldfirewall-cmd --add-servicehttp --permanent然后重新加载。ufwufw allow 80/tcp。iptables使用对应规则放行 TCP 80 端口。这里要特别提醒为了验证而执行“关闭防火墙”是很危险的操作。很多临时问题的确可以靠关闭系统防火墙“解决”但服务器暴露在公网后少了本地防护万一 WEB 应用有漏洞很容易成为突破口。建议即使验证阶段也尽量精确放行端口和来源而不是关闭整个服务。这里说的不是“关闭防火墙”真的能解决问题而是“关闭防火墙”会把问题扩大化属于应急时的最后手段并且只能在隔离测试环境里短暂操作。另外如果服务器上已经占用 80 端口的不是你的 WEB 服务而是其他未知进程也需要先处理lsof -i:80或者ss -lntp | grep :80确认监听进程是预期的 Nginx、Apache 或 IIS。如果端口被别的进程占用规则写得再对访问到的也不是目标服务。4.3 多 IP 和虚拟主机场景下要额外看看 Host 头如果服务器上有多个 IP或者 WEB 服务配置了多个虚拟主机访问结果还可能受 HTTP Host 头影响。外网用户访问时用的是公网 IP 或域名这个 Host 头会跟着 HTTP 请求一起送到内网服务器。如果 WEB 服务器的虚拟主机只匹配某个域名而请求头里带的又是另一个域名即使 TCP 连接建立了应用层仍可能返回 404 或默认站点。这种情况已经不属于防火墙映射的范畴但确实是打通“外网访问内网 WEB 服务器”时很容易卡住的最后一段。排障时不要只看 TCP 通不通还要看 HTTP 返回的状态码。5. 从公网到内网的排查链路一条请求是怎么断掉的?5.1 不要随机改动配置按五个点逐层验证很多时候用户一上来就问“为什么不通”或者直接把防火墙里所有策略改成允许。这种思路会掩盖真正的问题也给网络埋下巨大风险。我更推荐按链路顺序逐层验证从外网客户端访问公网 IP 的端口。查看防火墙会话表确认连接是否到达防火墙。查看 NAT 规则命中情况确认地址是否转换。查看安全策略命中情况确认流量是否被允许。回到服务器端确认服务监听、本地防火墙和应用日志。这个顺序的核心逻辑是先判断链路断在哪个环节再决定改哪里。用一张表格概括验证点主要检查内容如果失败说明什么客户端连通性公网 IP 是否可达、端口是否开放公网线路、运营商封端口、路由问题防火墙会话表是否有从外部到内部的未完成连接流量没有到达防火墙或会话表满NAT 命中转换前后地址和端口是否符合预期NAT 规则没有生效或匹配顺序不对安全策略策略计数是否增长流量被默认拒绝策略拦截服务器本地服务监听、系统防火墙、应用日志网络层通了卡在服务器自身我在实际排查时步骤如下先拿一台外网主机使用telnet或curl访问公网 IP 的端口然后在防火墙上查是否存在会话如果会话都没有大概率是数据包还没到防火墙或者入接口不对如果会话显示已经建立但 HTTP 请求无响应再回头看服务器。常用的客户端验证命令如下telnet 202.100.10.2 80也可以用curl -I http://202.100.10.2/Windows PowerShell 可以用Test-NetConnection 202.100.10.2 -Port 805.2 抓包是判断问题在哪一层的有效方法如果凭会话表和策略计数仍然分不清我建议抓包。抓包不是一定要在防火墙上也可以在客户端和服务器两端分别抓。最常见的判断逻辑客户端抓包能看到 SYN 发出但没有收到 SYN-ACK说明数据包在中间被丢弃或没有回包。防火墙外网口抓包能看到 SYN 进入但没有转发到内网口说明 NAT/策略或路由有问题。防火墙内网口抓包能看到 SYN 到达但服务器没回包说明问题在服务器。服务器网卡抓包能看到 SYN操作系统的 WEB 进程没有响应说明服务监听或系统防火墙有问题。抓包工具的选取不重要重要的是抓对位置。按“外网口、内网口、服务器网卡”三个位置抓几乎可以把断点定位到具体设备上。若发现回包方向有问题就检查默认网关、防火墙源 NAT 和路由表而不是一遍遍改 WEB 服务配置。5.3 常见错误做法把安全策略放太宽或用“关闭防火墙”跳过问题在排查压力下一些新手会直接添加一条“From untrust to trust 任意 IP 任意端口允许”的策略或者把服务器防火墙关掉。操作后如果通了就会以为问题解决了。但如果哪一天这台内部服务器被扫描攻击这种宽松配置就是最大入口。正确做法应该是先临时加一条“源地址仅为自己的测试公网 IP目的端口仅为 80/443”的策略等验证通过后再改成真正需要的访问范围。至少要把紧急排查和正式放行分开。6. 开放端口不是终点短链路跑通后的安全与长期维护6.1 映射等于把内部服务放到了公网边界端口映射一旦生效WEB 服务器在内网但对外已经变成公网可达。外网主机访问的虽然是防火墙公网 IP实际上背后就是内网服务器进程。这意味着任何针对 80/443 端口的扫描、漏洞利用尝试都会被转发到这台服务器上。所以配置服务器映射前要问自己一个问题这个 WEB 服务是否值得放在公网上如果只是临时给某个同事在外网看个页面访问结束后应尽快删除规则。如果是要长期对外提供服务的正式站点必须有安全加固不能“裸奔”。如果只是企业内部系统更应该优先考虑使用远程接入内部网络的方式而不是把内部页面直接暴露到公网。如果确实需要映射至少要做几件事源地址限制。如果访问者只是固定的合作方地址把源地址精确到对端公网 IP如果是对所有人开放那也应该单独放到 DMZ 区。发布端口最小化。只映射 WEB 服务器真正需要的 TCP 80/443不要顺手把 SSH、RDP、数据库端口也一起映射出去。WEB 服务本身要打补丁、改默认口令、关闭不必要模块、配置 HTTPS。利用防火墙检测日志定期看告警。很多企业防火墙有入侵防御或日志审计能力不要一配了之。有人觉得“我把外部端口改成不常见的 34567别人就扫不到”。这话对了一半端口扫描通常能覆盖全端口故意隐藏端口只会降低随机扫描的效率不会阻挡定向扫描。真正有效的还是访问控制和漏洞修复。6.2 白名单和黑名单不是一回事我在处理防火墙的黑白名单问题时发现很多运维对白名单和黑名单的理解比较模糊。简单来说黑白名单如果放在 WEB 应用层通常用来控制用户是否能访问特定 URL 或 IP。如果是防火墙访问控制白名单更接近“默认拒绝只允许指定来源”黑名单则是“默认允许但封禁某些恶意来源”。对于企业 WEB 服务器映射我更倾向于使用“默认拒绝 白名单”的思路尤其是在服务只面向少量合作方时。比如源地址只允许某个 /29 地址段访问即使 80 端口映射在外其他人也无法建立连接。如果业务必须面对所有公网用户那白名单思路不现实。这时要把防护重心放在 WEB 服务本身可以在 WEB 服务器前加 WAF或者让防火墙的入侵防御规则检测常见 WEB 攻击。这不是一两篇文章能讲完的但至少要知道公网可达的 WEB 服务器已经站在攻击者的面前。6.3 长期维护要包含变更记录和定期巡检针对服务器映射一个比较实用的长期维护清单如下NAT 规则要写备注记录发布的服务、服务器 IP、开放原因、负责人和过期时间。每次变更后用外网主机加内网主机各验证一次确认没有只通了外部却断了内部。定时查看会话表如果发现大量异常远程连接尝试就结合安全日志定位来源。检查端口映射是否已经不再使用及时清理过期规则。关注 WEB 服务器安全补丁和访问日志不要把映射当一次性配置。如果使用的防火墙型号不同以上配置入口可能有差异但底层排查链路是一样的。确认了“NAT 是不是通了”“安全策略是不是允许”“服务器自己是不是愿意放行”“回包能不能回到客户端”端口映射的问题基本就能定位清楚。回到标题那句话——配置服务器映射实现外网主机访问企业内部 WEB 服务器从来不是敲一条“服务器映射”规则就能收工的事。它是一整条链路入口在 NAT闸门在安全策略最后一公里在 WEB 服务和回包路径。先不要急着配先画链路图再按链路逐段验证最后把规则收敛到最小必要范围。这才是一个能让外网访问真正稳定也让内网安全不被拖垮的配置方式。
返回列表