树莓派 4B 做家庭网关:从刷机到跑满千兆的完整记录

树莓派 · 7 分钟阅读· 14 次阅读

家里原来那台运营商光猫做路由,问题很明显: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℃ 以上。是过热降速,不是掉链路。

解决:

  1. 给 USB 网卡贴了个小铝散热片(3 块钱)
  2. 把树莓派从弱电箱里拿出来(弱电箱夏天能到 45℃)
  3. 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设备和主网混在一起不安全。

H
homelab萌新

请问博主用的什么散热方案?我的4B跑一周软路由温度就上70了。

发表评论

验证码

提交后需站长审核,通过后才会显示。