ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

内网设备统一出口:网关、旁挂与静态路由配置排错指南

内网设备统一出口:网关、旁挂与静态路由配置排错指南

家里或小办公室的设备一多,几乎都会冒出同一个念头:能不能让所有设备的上网流量都从一个固定的地址出去?这样既方便统一记录,也方便统一限制,出了事还能一眼看出是哪台机器在跑流量。很多人跑到路由器后台翻半天,想找一个输入框,把那个"上游出口地址"填进去,结果发现要么压根没有这个选项,要么填完就全家断网。这个问题问得最多,但被解释得最含糊——它其实不是一个设置项的问题,而是一整套"出口在哪、谁来做转发、终端怎么知道"的链路设计问题。我前前后后帮朋友和小团队折腾过十几套这样的网络,从几十块的家用路由器到能跑策略路由的小主机都试过,踩过的坑基本都集中在拓扑和地址规划上,而不是某个开关没打开。这篇就按我实际操作的顺序,把这条链路拆开讲清楚,适合手上有一台路由器、想让内网设备统一走一个出口的读者,也适合刚接触网络配置、被各种术语绕晕的新手。

1. 路由器里那个"上游出口地址"到底填给谁看的

先把最容易搞混的一点说明白:路由器后台里跟"出口"相关的配置,从来不是填一个地址就完事。它至少涉及三个角色——谁是默认网关、谁负责把流量送出去、终端怎么知道该找谁。这三件事分属不同的配置层,混在一起想就会觉得"怎么填都不对"。

我见过最常见的情况是,有人把出口地址填进了 WAN 口的静态 IP 里,结果路由器以为自己的外网地址就是这个,于是所有回程流量都往那儿发,而那个地址根本不是运营商给的,直接全网瘫痪。所以第一步不是找输入框,而是想清楚你手上这台设备在网络里扮演什么角色。

1.1 三种容易混淆的形态:网关式、旁挂式、应用层转发

网关式是最直观的一种:内网所有设备的默认网关指向路由器,路由器自己承担"接手流量再统一送出"的职责。这种形态下,你在路由器上配置的上游地址,是路由器自己用的,终端完全不需要知道。好处是终端零配置,坏处是所有流量都得经过这台设备的 CPU,性能上限就是它的转发能力。家用路由器跑这种模式,百兆宽带一般没问题,上了千兆、连接数一多就容易掉链子,具体表现是网页打开慢、视频卡顿,但测速又正常。

旁挂式是把出口角色交给另一台机器,路由器只做基础的三层转发和路由指路。这种做法的好处是分工清晰:路由器负责局域网内互通和无线覆盖,出口那台机器专心做转发、记录和限速。坏处是多了一跳,配置上必须保证"去"和"回"两条路都对,否则就会出现请求发出去了、响应回不来的半通状态。我早期最常犯的错就是只配了去的路由,忘了在出口机器上配回程路由,抓包一看,请求全在,响应一个没有。

应用层转发只影响单个应用,比如在某个软件的设置里填上地址和端口。这种最省事也最局限,因为每台设备、每个软件都得单独配一遍,而且很多程序根本不认这个设置。它适合临时调试,不适合做统一方案。

1.2 为什么绝大多数家用固件根本不提供这个输入框

这不是厂商偷懒,而是产品定位决定的。家用固件的设计目标是"插上就能用",出厂逻辑里 WAN 口就是唯一的出口,NAT 转换、DHCP 下发、DNS 转发全都写死在这条链路上。如果要开放上游出口的配置,就意味着要处理认证失败怎么办、出口挂了怎么切换、哪些流量走哪条路这些复杂逻辑,普通用户填错一个数字就是全家断网,售后成本顶不住。

所以你会发现,家用路由器后台关于外网的部分,基本只让你选连接方式(动态获取、拨号、静态地址),再填几个参数就结束了。真正需要统一出口能力的场景,通常走两条路:一是给路由器刷第三方固件,二是干脆加一台设备做旁挂。前者折腾但有掌控感,后者省心但多一台机器的电费和摆放问题。我的建议是,如果你只是想在几十台设备的小环境里做统一管理,加一台低功耗小主机比刷固件靠谱得多,至少出问题的时候你知道该重启哪个。

1.3 一台设备能不能同时当网关和出口节点

技术上完全可以,一台设备同时做网关和出口,在小规模网络里非常常见。但这里有个坑:如果出口那一层又做了一次地址转换,就形成了两层转换嵌套。嵌套本身不是不能用,问题在于排错时你会看到两套会话记录,源地址被改写两次,日志里全是转换后的地址,定位具体是哪台终端在跑流量会非常痛苦。

我的做法是尽量只做一次转换。要么路由器做转换、出口机器只做纯转发;要么路由器只做路由、出口机器做转换。两种都可以,关键是不要两头都做。另外要注意回程:如果出口机器做了转换,它必须知道内网各个网段怎么走,否则响应回来找不到人。这条静态路由经常被漏掉,症状就是能 ping 通网关、ping 不通外面,或者反过来。

2. 先把拓扑在纸上画清楚,再动手填任何数字

我见过太多人一上来就打开后台开始填,填完不通再改,改到最后自己也记不清哪个地址对应哪台设备。网络配置这件事,纸面工作做足了,实际配置十分钟就能搞定;纸面工作跳过,能折腾一整个下午。这一步花的时间,后面都会省回来。

2.1 串联与旁挂的取舍,取决于你怕不怕断网

串联就是把出口设备串在路由器和外网之间,所有流量物理上必须经过它。优点是逻辑简单、不会有绕行漏洞,缺点是这台设备一挂,整个网络就断。旁挂是让它挂在局域网里,通过路由指路把流量引过去,优点是它挂了可以直接改回默认网关应急,缺点是配置要求高,指路指错了会出现部分流量绕过的情况。

我一般会根据"断网能不能接受"来选。家里自己用,串联无所谓,反正断了就是自己动手;小团队办公环境,我倾向旁挂,因为可以随时把默认网关改回路由器,三十秒内恢复基本可用,然后再慢慢查问题。这个"可回滚性"在真实环境里比性能重要得多。

2.2 地址规划:网段切得乱,后面每一步都在救火

规划的核心原则只有一条:不同用途的地址不要混在一个网段里。我通常切成三段——终端段给手机电脑用,互联段专门用于设备和设备之间通信,管理段留给后台和带外管理。这么做的好处是防火墙规则可以按网段写,不用一台台列 IP。

有几个具体的坑值得单独说。第一,网关地址不要落在 DHCP 分配池里,我见过不止一次因为池子范围设成 100 到 200、网关恰好是 100.1 之外但被手工分配给了某台设备,导致地址冲突,症状是新设备怎么也上不了网。第二,保留一段固定地址给打印机、摄像头这类需要长期访问的设备,别让它们靠 DHCP 拿地址。第三,互联段用 /30 就够了,别浪费。

网段用途示例范围分配方式注意事项
终端段192.168.10.0/24DHCP 自动网关固定为 .1,池从 .100 起
互联段10.0.0.0/30手工静态只放两台设备的互联地址
管理段192.168.99.0/24静态绑定单独走管理口,限制访问来源
固定设备192.168.10.2-99静态或绑定打印机、摄像头、NAS

2.3 一个可复现的三段式拓扑示例

我拿一个实际搭过的结构来说明,你可以直接照抄地址。路由器 LAN 口地址 192.168.10.1,承担终端段的网关和 DHCP 服务;出口机器一块网卡接在 192.168.10.0/24 里,地址 192.168.10.200,另一块网卡接外网。路由器上新增一条静态路由:目标 0.0.0.0/0,下一跳 192.168.10.200。注意这里是把默认路由指向出口机器,而不是把 DHCP 下发的网关改成它——这两种做法效果不同,前者是路由器替所有终端转发,后者是终端直接找出口机器,前者更容易回滚。

出口机器上要配两条:一条是到外网的默认路由,一条是回程路由,目标 192.168.10.0/24,下一跳 192.168.10.1。很多人漏掉第二条,结果就是包出去了回不来。同时出口机器上要做地址转换,把 192.168.10.0/24 的源地址转换成它自己的外网地址,这样回程才能找到路。

3. 从 DHCP 下发到防火墙放行:完整配置链路

拓扑定好,接下来就是把配置落到设备上。这一段的顺序很重要:先让终端能找到路,再让流量能出去,最后才是防火墙放行。顺序颠倒的话,你会不知道到底是哪一环没通,只能靠猜。

3.1 让终端"自己"找到出口的四种手段

第一种是改 DHCP 下发的默认网关,把网关从路由器改成出口机器。这种方式影响面最大,所有自动获取地址的设备都会立刻生效,优点是一步到位,缺点是终端和出口机器之间必须二层可达,跨网段就不行了。而且一旦出口机器出问题,所有人都断,回滚要把 DHCP 改回来再等终端续租。

第二种是在路由器上配默认路由,DHCP 网关保持指向路由器不变。终端以为自己在跟路由器说话,实际上是路由器在替它转发。这种方式最推荐,因为终端完全无感,回滚只需要删掉一条路由。

第三种是按源地址做策略路由,只让特定网段或特定设备走出口,其余照常。适合只需要部分设备受控的场景,比如办公区走出口、访客区直出。

第四种是终端手工配,只适合调试。我调试的时候会留一台机器手工设网关,方便快速切换对比,但绝不会把这个做法推广到生产环境,因为一旦忘了改回来,过几天就没人记得这台机器为什么行为不一样。

3.2 端口映射、静态路由与地址转换的配合关系

这三样东西经常被混为一谈,其实方向完全不同。端口映射解决的是"外面怎么进来",属于入站方向的地址转换;静态路由解决的是"去哪里找谁",是路径选择;地址转换解决的是"出去时源地址长什么样",是出站方向的改写。搞清楚方向,配置就不会打架。

举个实际例子:内网有一台打印服务器在 192.168.10.50,另一个网段 192.168.20.0/24 的设备要访问它。这时候不需要端口映射,只需要在 192.168.20.0/24 的网关上加一条静态路由,目标 192.168.10.0/24,下一跳指向路由器。反过来,如果是从外网访问内网的某个管理页面,那才需要端口映射。

地址转换的规则要写清楚只对哪个网段生效。我见过把转换规则写成"所有出站流量",结果内网两个网段之间互访也被转换了源地址,抓包看到一堆看不懂的地址,排查了快两个小时才发现是自己写的规则太宽。

3.3 规则落盘之后必须跑的验证命令

配置写完不算完,必须验证。我固定跑四步:第一步在终端上确认默认网关指向正确,ip route或者 Windows 上的route print,看默认路由那一行;第二步traceroute一下,看第一跳是不是出口机器,如果第一跳是路由器、第二跳才是出口机器,说明是路由器在转发,符合预期;第三步在出口机器上抓包,确认收到了终端的请求;第四步在终端抓包,确认收到了响应。

# 查看本机路由表,确认默认网关 ip route show default # 跟踪路径,确认第一跳设备 traceroute -n 223.5.5.5 # 在出口机器上抓包,只看来自终端段的流量 tcpdump -i any -n net 192.168.10.0/24 and not port 22 # 查看会话跟踪表,确认转换是否生效 conntrack -L | grep 192.168.10

这四步里,最容易出问题的是第三步和第四步之间。请求抓到了、响应没抓到,八成是回程路由的问题;两边都抓到了但应用还是不通,那就往 MTU 和 DNS 上想,下一节详细说。

4. 排错实录:能连通却打不开页面,问题多半不在出口节点

这类故障最气人:ping 得通、测速正常、就是网页转圈。新手第一反应是出口机器有问题,于是重装、换配置、重启,折腾半天没解决。我遇到过十几次类似情况,真正的原因几乎都不在出口本身,而在链路上的两个隐形环节。

4.1 MTU 与分片导致的"小包通、大包死"

典型症状是小文件能传、大文件卡死,网页能打开首页但图片加载不出来,ping 小包正常、ping 大包丢。原因是链路上多了一层封装,可用 MTU 变小了,而路径 MTU 发现机制依赖 ICMP 报文,很多防火墙默认把这类 ICMP 丢了,导致发送端一直以为可以发大包,实际全被丢弃。

排查方法很直接:用不分片的 ping 逐步试大小。1472 是 1500 减去 28 字节包头的结果,如果能通就说明 MTU 没问题,不通就往下试 1450、1400,找到能通的最大值,再加 28 就是实际可用 MTU。

# Linux 下测试不分片的最大包大小 ping -M do -s 1472 -c 3 223.5.5.5 # Windows 下的等价写法 ping -f -l 1472 223.5.5.5

找到之后,两个处理方式:一是把出口机器的 MTU 调小到实测值,二是开启 MSS 钳制,让经过的 TCP 连接在握手时就把最大报文段调小。我更倾向后者,因为它只影响 TCP,不会误伤其他协议。命令一般是在防火墙规则里加一条对 SYN 报文改写 MSS 的规则。

4.2 DNS 走哪条路,是最容易漏掉的一环

终端能不能上网,很大程度上取决于它的 DNS 查询有没有被正确应答。如果 DHCP 下发的 DNS 还是路由器自己,路由器又把查询转发到外面,这条链路看起来没问题;但如果路由器本身没有出网能力(比如默认路由已经指向了出口机器,但路由器自己的 DNS 转发没配好),查询就会超时。

我吃过一次亏:所有设备都能 ping 通外网地址,但打不开任何网页,因为域名解析全部超时。当时以为是出口机器的问题,抓包才发现 DNS 查询根本没发出去——终端把查询发给了路由器,路由器不知道该往哪转,直接丢了。

处理办法是明确指定 DNS 服务器。要么让 DHCP 直接下发一个可达的 DNS 地址,要么在路由器上配好转发规则。验证很简单,nslookup或者dig指定服务器查一次,能返回就说明链路通。

# 指定 DNS 服务器查询,确认解析链路 nslookup www.example.com 192.168.10.1 # 查看终端实际使用的 DNS cat /etc/resolv.conf

4.3 日志和抓包要按顺序看,否则越看越乱

排错最怕的是到处看日志,看多了反而没方向。我习惯用一个固定的四段定位法:终端有没有发出、路由器有没有转发、出口机器有没有收到、响应有没有回来。每一段用一个抓包或者一条会话记录确认,四段走完,问题必然定位在某一段之间。

具体操作上,先在终端发起一个请求,同时在三个位置开抓包,按时间戳对齐。如果终端有出去、路由器没转发,问题在路由或防火墙;如果路由器转发了、出口机器没收到,问题在链路上(网线、VLAN、ARP);如果出口机器收到了、响应没回来,问题在回程路由或目标不可达。这套方法听起来笨,但胜在不会漏。

还有个小技巧:用会话跟踪表看状态。如果会话一直是 SYN_SENT,说明请求发出去了但没人应答;如果是 ESTABLISHED 但应用不通,那就是 MTU 或者应用层的问题。这个判断比看日志快得多。

5. 家庭与小团队场景的取舍经验

配置能跑通只是及格线,真正难的是让它长时间跑下去不出事,以及在你不在场的时候别人也能看懂。这部分没有标准答案,全是从反复折腾里攒出来的经验。

5.1 访客网络与设备级限速的顺带用法

既然已经把出口统一了,顺手把访客网络隔开是很划算的事。做法是单独开一个无线信号,绑到独立的网段,配一条防火墙规则禁止它访问内网其他网段,只允许它走出口。这样来访的人连上就能上网,但碰不到你的打印机、NAS 和后台管理页面。

设备级限速也值得配。我一般给两类设备单独限速:一类是常年跑下载的设备,不限制的话它能把整条带宽吃干净;另一类是智能家居设备,它们流量不大但连接数多,容易把路由器的会话表撑满。限速策略写在出口机器上比写在路由器上效果好,因为那里能看到完整的流量视图。

5.2 长期运行的可靠性取决于几个容易忽略的细节

跑了几个月之后我发现,出问题的往往不是配置本身,而是几个硬件和运维层面的细节。第一是散热,小主机塞在弱电箱里,夏天温度上来之后转发性能明显下降,表现是高峰期卡顿,很多人以为是带宽不够,其实是设备降频了。第二是连接数,便宜的设备会话表只有几千条,设备一多就开始丢新连接,症状是随机某些设备上不了网。

第三是配置备份。我现在养成一个习惯,每次改完配置就导出一次,文件名带上日期。因为隔几个月再看自己的配置,经常会想不起来某条规则是干嘛的,有备份至少能回滚。第四是变更记录,简单的文本文件就行,写清楚改了什么、为什么改、什么时候改的。这个习惯帮我省过至少两次大麻烦,因为出问题时能快速定位到最近一次变更。

还有一点:不要迷信定时重启。早期我也设置过每天凌晨自动重启,后来发现重启只是把内存泄漏的影响延后了,并没有解决根本问题,而且重启那几分钟正好是某些设备做定时任务的时间,反而容易出岔子。与其定时重启,不如把内存和连接数监控起来,看到趋势不对再处理。

最后分享一个我一直在用的小习惯:所有设备地址都写在便签上贴在机柜门内侧,包括管理地址、账号归属和互联关系。听起来很土,但当你半夜被叫起来处理问题、手边只有手机的时候,这张纸比任何文档都快。

6. 关于这套配置我踩过的几个具体坑

再说三个印象最深的,都是配置看起来完全正确但就是不通的情况。

第一个是网线接错口。路由器上有的口是 LAN、有的是 WAN,出口机器接在 WAN 口上,逻辑上完全说不通,但物理上就是不通。我当时盯着配置看了半小时,最后拔下来一看接口标签才发现。现在我的习惯是接完线先看一眼指示灯和口标,再动配置。

第二个是防火墙的默认策略。有的设备默认入站全拒,我配好了端口映射却忘了加入站放行规则,外面访问不进来。这类问题的特征是:内网访问正常、外网访问不通,抓包能看到请求到达但被丢弃。排查时优先看防火墙的计数器和丢弃日志,比看规则列表快。

第三个是地址冲突。有台设备手工设了静态地址,恰好落在 DHCP 池范围内,路由器又把这个地址分给了另一台设备,两边时好时坏,间歇性断网。这种故障最难查,因为它是概率性的。后来我养成习惯,DHCP 池一定从 .100 开始,固定设备一律放在 .2 到 .99,物理上就不会撞。

这三个坑说起来都很低级,但真实环境里出问题的往往就是这种低级错误。配置逻辑再漂亮,线接错了、地址撞了,一样白搭。所以我现在排错的第一件事永远是:先确认物理层,再看地址层,最后才看策略层。顺序对了,能省掉一大半时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进