树莓派 4B 做家庭网关:从刷机到跑满千兆的完整记录
家里原来那台运营商光猫做路由,问题很明显:DHCP 租约只能改到 12 小时、没有静态路由、DNS 不能自定义、IPv6 防火墙形同虚设。
我手上有一块树莓派 4B(4G 版),加一个 USB 3.0 千兆网卡,一共花了不到 400 块,替掉了光猫的路由功能。跑了半年,写下完整过程。
一、硬件与拓扑
光猫(桥接模式)
└─ eth0(板载千兆)→ PPPoE 拨号 → WAN
└─ eth1(USB3.0 千兆网卡)→ 交换机 → 全屋设备
树莓派 4B 的板载网口和 USB 3.0 控制器共享一条 PCIe 2.0 x1 通道(理论 5Gbps,实际约 4Gbps)。做双向千兆路由时,两个网口加起来 2Gbps 已经吃掉了不少余量,实测能跑到 940Mbps 单口满速,但同时双向跑满会掉到 700Mbps 左右。
如果家里有 NAS 且内网有大流量,别用树莓派做单臂路由,会很难受。
二、系统与基础配置
用 Raspberry Pi OS Lite (64-bit, Bookworm)。刷完先做这几件事:
# 关掉不必要的服务
sudo systemctl disable --now avahi-daemon
sudo systemctl disable --now cups
sudo systemctl disable --now bluetooth
# 固定 USB 网卡名字(USB 网卡重启后可能变 eth1/eth2)
sudo nano /etc/systemd/network/10-wan.link
按 MAC 固定网卡名:
[Match]
MACAddress=00:e0:4c:68:xx:xx
[Link]
Name=wan0
然后装 pppoe 和 dnsmasq:
sudo apt install pppoe dnsmasq iptables-persistent
/etc/ppp/peers/dsl-provider:
plugin rp-pppoe.so
nic-wan0
user "你的宽带账号"
noauth
persist
mtu 1492
mru 1492
defaultroute
replacedefaultroute
usepeerdns
注意 usepeerdns 会把运营商 DNS 写进 /etc/resolv.conf,而我后面要用 dnsmasq 做内网 DNS,所以要改成 nodefaultroute 之外再加一行 nodns,否则 dnsmasq 起来会抢 53 端口失败。
三、坑一:MTU 没改,网页一半打不开
PPPoE 有 8 字节开销,MTU 必须是 1492。系统默认 1500,表现是:能 ping 通、能打开一部分网站、但图片和视频加载到一半卡死。
原因是 TCP 的 MSS 协商用的是 1500,大包在 PPPoE 链路上被丢弃,而 ICMP 的「需要分片」消息被上游过滤,导致 PMTU 发现失效。
修复方式有两个,我都做了:
# 1. 网卡 MTU
sudo ip link set wan0 mtu 1492
sudo ip link set br0 mtu 1492
# 2. 强制 MSS 钳制(关键)
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
第二条才是真正的解法。第一条只影响本机发出的包,转发路径上客户端的包还是 1500。
四、坑二:dnsmasq 抢不到 53 端口
systemd-resolved 默认占着 53 端口。树莓派 OS 默认装了它。
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
dnsmasq 配置:
interface=br0
bind-interfaces
domain-needed
bogus-priv
cache-size=2000
server=223.5.5.5
server=119.29.29.29
# 内网域名
address=/nas.home/192.168.10.20
address=/router.home/192.168.10.1
bind-interfaces 很重要。不加的话 dnsmasq 会监听 0.0.0.0:53,跟 PPPoE 起来时的动态接口冲突,可能拒绝启动。
五、坑三:USB 网卡发热掉速
这是最折磨人的一个。跑了两三天后,速度从 940Mbps 掉到 300Mbps,重启恢复,几小时后又掉。
dmesg 里什么都没有,ethtool 看链路还是 1000Mbps 全双工。
最后用热成像看了一下:USB 网卡的 RTL8153 芯片温度 78℃,树莓派的 USB 控制器也在 70℃ 以上。是过热降速,不是掉链路。
解决:
- 给 USB 网卡贴了个小铝散热片(3 块钱)
- 把树莓派从弱电箱里拿出来(弱电箱夏天能到 45℃)
- USB 网卡不要用长的延长线,插在远离 HDMI 的那个口
改完以后连续跑了三个月没有掉速。
六、实测数据
用 iperf3 测了三组:
| 场景 | 结果 |
|---|---|
| 内网 → 树莓派(单流) | 938 Mbps |
| 内网双向同时 | 720 Mbps / 690 Mbps |
| 外网下载(500M 宽带) | 470 Mbps |
内网双向同时跑只有 720Mbps,这就是树莓派 4B 的上限。如果家里有两台机器互传大文件,这个数字会让人不爽。
七、值得做吗
如果你只是想让家里有个能自定义 DHCP、DNS、防火墙的路由,树莓派 4B 完全够用,而且功耗只有 5W 左右。
但如果你有 NAS、经常内网传 4K 素材、或者想跑满千兆双向,直接上 N100 双网口小主机。我现在给朋友装都推荐那个,贵 300 块,省两周折腾。
八、这套方案的运维
我把所有配置放在一个 git 仓库里,三份文件:interfaces、dnsmasq.conf、firewall.sh。每次改之前先 commit,改坏了 git checkout 回来重启服务,两分钟。
另外加了一个 cron,每天凌晨把 iptables-save 和 pppoe 日志归档到 NAS。有一次 PPPoE 半夜断了三次,就是靠日志发现是运营商在换 BRAS,第二天打电话过去直接报了时间点,对面没得赖。
评论 (2)
补充一个:跑网关记得把交换机口做成VLAN隔离,不然IoT设备和主网混在一起不安全。
请问博主用的什么散热方案?我的4B跑一周软路由温度就上70了。
发表评论