OpenWrt 安装与配置完整流程总结
OpenWrt 安装与配置完整流程总结
一、安装 OpenWrt 到硬盘
准备工作:
- 准备一个带有 PE 的启动 U 盘
- 准备以下文件并放入 U 盘中:
- physdiskwrite V0.5.3(写盘工具)
- openwrt-x86-64-generic-squashfs-combined.img(OpenWrt 镜像文件)
安装步骤:
- 使用 PE 启动系统
- 将 PE 启动 U 盘插入电脑
- 开机进入 BIOS,设置从 U 盘启动
- 进入 PE 系统
- 使用 physdiskwrite 写入镜像
- 在 PE 系统中,以管理员权限运行 CMD
- 进入 U 盘目录
- 执行写盘命令:
physdiskwrite.exe -u openwrt-x86-64-generic-squashfs-combined.img - 选择要写入的硬盘序号(通常为 0)
- 确认信息无误后,输入 y 确认写入
- 等待写入完成
重要提示:
- 此操作会清空目标硬盘的所有数据,请提前备份重要数据
- 写入完成后,必须立即进行分区扩容,如果重启进入过 OpenWrt 系统后再进行分区扩容将不会有任何效果
二、扩展 rootfs 分区
使用 GParted 扩展分区(推荐):
- 准备 GParted 启动 U 盘
- 制作一个 GParted Live USB 启动盘
- 将 GParted U 盘插入电脑
- 启动 GParted
- 从 GParted U 盘启动系统
- 进入 GParted 图形界面
- 扩展 rootfs 分区
- 在 GParted 中选择刚刚写入 OpenWrt 的硬盘
- 找到 rootfs 分区(通常显示为未格式化或 ext4 格式的分区)
- 找到硬盘上灰色未使用的空间(在 rootfs 分区之后)
- 选中 rootfs 分区,右键点击,选择"调整大小/移动"(Resize/Move)
- 将分区大小扩展到使用所有可用空间
- 点击"应用"(Apply)执行操作
- 等待操作完成
- 验证扩容
- 重启计算机并拔掉所有 U 盘
- 启动 OpenWrt 系统
- 在 OpenWrt 命令行中输入:
df -h - 确认 overlayfs:overlay 的大小已等于硬盘大小
三、配置网络(静态 IP、网关、DNS)
重要:在安装 OpenClash 之前,必须先配置静态 IP,确保网络连接稳定。
配置静态 IP(两种方式):
方法一:使用 Web 界面(推荐,图形化操作)
- 登录 OpenWrt Web 界面(默认地址通常是 192.168.1.1)
- 进入 网络 → 接口 → LAN
- 点击"编辑"按钮
- 在"基本设置"中:
- IPv4 地址:192.168.1.2
- IPv4 子网掩码:255.255.255.0
- IPv4 网关:192.168.1.1
- 在"高级设置"中:
- 使用自定义的 DNS 服务器:223.5.5.5 114.114.114.114
- 点击"保存并应用"
方法二:使用 SSH 命令
在 OpenWrt SSH 中执行以下命令:
uci set network.lan.ipaddr='192.168.1.2'
uci set network.lan.netmask='255.255.255.0'
uci set network.lan.gateway='192.168.1.1'
uci set network.lan.dns='223.5.5.5 114.114.114.114'
uci commit network
/etc/init.d/network restart
配置项说明:
ipaddr:OpenWrt 的静态 IP 地址(旁路由:192.168.1.2)netmask:子网掩码gateway:网关地址(主路由:192.168.1.1)dns:DNS 服务器(阿里云:223.5.5.5,114:114.114.114.114)
四、更新软件源并安装支撑软件
- 更新软件源
opkg update - 删除精简版 dnsmasq,安装完整版(重要:必须单独安装)
opkg remove dnsmasq opkg install dnsmasq-full --force-overwrite
说明:dnsmasq-full 必须单独强制安装,不能与其他包一起安装,否则可能版本冲突。
五、安装 OpenClash
- 确定防火墙类型
在安装 OpenClash 之前,需要先确定系统使用的是 iptables 还是 nftables:
检查方法:
which iptables which nft nft list tables | grep fw4判断标准:
- 如果 nft list tables 能列出 table inet fw4 → 使用 nftables (firewall4)
- 如果只有 iptables 命令 → 使用 iptables
OpenWrt 24.10.5 使用 nftables (firewall4)
- 卸载轻量版 dnsmasq,强制安装完整版(重要:必须先处理)
opkg remove dnsmasq opkg install dnsmasq-full --force-overwrite - 安装 OpenClash 依赖包
依赖包来源:OpenWrt 官方软件源(通过 opkg 安装)
opkg update opkg install bash dnsmasq-full curl ca-bundle ip-full ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base说明:这些依赖包来自 OpenWrt 官方软件源,通过 opkg 包管理器安装
- 下载并安装 OpenClash
访问 https://github.com/vernesong/OpenClash/releases/ 查看最新版本
根据系统架构(x86_64、arm64 等)和防火墙类型(iptables/nftables)选择对应版本
示例(nftables 版本):
wget -O /tmp/openclash.ipk https://github.com/vernesong/OpenClash/releases/download/v0.47.046/luci-app-openclash_0.47.046_all.ipk opkg install /tmp/openclash.ipk说明:安装完成后,OpenClash 服务不会自动启动,需要手动启动和配置
- 启动 OpenClash 服务
安装完成后,OpenClash 不会自动启动,需要:
- 登录 OpenWrt Web 界面
- 进入 OpenClash → 全局设置
- 点击"启动"按钮启动服务
或使用命令:
/etc/init.d/openclash start - 导入订阅
- 登录 OpenWrt Web 界面
- 进入 OpenClash → 配置订阅
- 添加订阅链接
- 更新配置文件
- 配置加速模式
在 OpenClash Web 界面配置:
- 进入 OpenClash → 全局设置 或 模式设置
- 运行模式:选择 Redir-Host(兼容)模式(不要用 Fake-IP)
- 代理模式:选择全局(Global)模式或规则(Rule)模式
- 手动指定加速节点:在"节点选择"中选择一个可用的节点
重要设置(在 OpenClash Web 界面):
- DNS 设置:关闭 DNS 代理和 DNS 劫持(避免 Fake-IP 问题)
- 模式设置:确保 DNS 增强模式为 redir-host,不是 fake-ip
- 保存配置并重启 OpenClash
如何修改 Redir-Host:
- 在 OpenClash Web 界面:模式设置 → 运行模式 → 选择 Redir-Host(兼容)
- 在 OpenClash Web 界面:DNS 设置 → DNS 增强模式 → 选择 redir-host
- 验证 Fake-IP 已关闭
在 OpenWrt 上执行:
nslookup www.baidu.com 223.5.5.5 nslookup www.baidu.com应该返回真实 IP(如 110.242.69.21),不是 198.18.x.x
六、配置 iKuai 主路由(下一跳分流)
- 在 iKuai 上配置端口分流(下一跳分流)
- 登录 iKuai 管理界面
- 进入 网络设置 → 端口分流(或 分流设置 → 端口分流)
- 添加新规则:
- 分流方式:下一跳网关
- 下一跳网关:192.168.1.2(OpenWrt 旁路由 IP,不能是 192.168.1.1)
- 源地址:需要通过加速的网段(如 192.168.6.0/24、192.168.192.0/18 等)
- 协议:任意
- 状态:启用
重要:下一跳网关必须指向旁路由(192.168.1.2),不能指向主路由自己(192.168.1.1),否则会导致路由循环。
- 关闭 DHCP(如果 OpenWrt 作为旁路由)
方法一:使用 Web 界面(推荐,图形化操作)
- 登录 OpenWrt Web 界面
- 进入 网络 → DHCP/DNS
- 在"基本设置"中,找到"忽略此接口"选项
- 勾选"忽略此接口"(或设置为"忽略")
- 点击"保存并应用"
方法二:使用 SSH 命令
在 OpenWrt 上执行:
uci set dhcp.lan.ignore='1' uci commit dhcp /etc/init.d/dnsmasq restart让主路由(iKuai)负责 DHCP 分配
- 验证下一跳是否生效
在客户端执行:
tracert -d www.baidu.com应该看到:
- 第1跳:192.168.6.1(iKuai 的 LAN2 网关)
- 第2跳:192.168.1.2(OpenWrt 旁路由)← 说明下一跳已生效
- 第3跳及之后:正常出网
七、配置 OpenWrt SNAT(开启回流)
为什么需要 SNAT:
当 iKuai 配置下一跳将流量转发到 OpenWrt 时,OpenWrt 收到的包源地址仍然是客户端网段(如 192.168.6.x)。当 OpenWrt 将这些包转发回 iKuai 时,iKuai 会看到"源地址是 192.168.6.x 但从连接 iKuai 的接口来"(虽然物理上不是 lan1,但逻辑上是从同一个接口转发),可能触发反向路径检查(RPF)而丢包,导致"开启下一跳后无法上网"。
SNAT 的作用:将来自指定网段的流量源地址伪装成 OpenWrt 的 IP(192.168.1.2),让 iKuai 只看到来自 192.168.1.2 的流量,避免丢包。
配置 SNAT(nftables/firewall4 方式,推荐):
方法一:使用 firewall4.user(最稳定,推荐)
这是 firewall4 的标准持久化方式,重启后自动生效:
注意:不能使用 cat 命令一次性写入,需要分别执行每条 nft 命令。
在 OpenWrt SSH 中分别执行以下命令(每条命令单独执行):
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.6.0/24 masquerade
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.192.0/18 masquerade
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.88.0/24 masquerade
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.8.0/24 masquerade
然后创建持久化文件(将上述命令写入文件,以便重启后自动执行):
cat > /etc/firewall4.user <<'EOF'
# SNAT for policy-routed subnets to iKuai via br-lan
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.6.0/24 masquerade
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.192.0/18 masquerade
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.88.0/24 masquerade
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.8.0/24 masquerade
EOF
chmod +x /etc/firewall4.user
/etc/init.d/firewall restart
如何确定需要 SNAT 的网段:
- 在 iKuai 管理界面查看"端口分流"或"下一跳分流"规则
- 记录所有"源地址"网段
- 为每个网段添加一条 SNAT 规则
验证 SNAT 规则是否生效:
nft list chain inet fw4 srcnat
应该看到类似输出:
table inet fw4 {
chain srcnat {
type nat hook postrouting priority srcnat; policy accept;
oifname "br-lan" ip saddr 192.168.6.0/24 masquerade
oifname "br-lan" ip saddr 192.168.192.0/18 masquerade
...
}
}
防火墙状态说明:
/etc/init.d/firewall status 显示 inactive 或 active with no instances 是正常现象,不代表防火墙没工作。
正确的验证方法:
nft list tables | grep fw4
nft list chain inet fw4 srcnat
如果能看到 table inet fw4 和 SNAT 规则,说明防火墙正常工作。
八、验证配置
- 验证基础网络配置
在 OpenWrt 上:
ip addr show br-lan ip route show | grep default ping -c 4 192.168.1.1在客户端(如 192.168.6.2):
ipconfig /all ping 192.168.6.1 - 验证 SNAT 规则
nft list chain inet fw4 srcnat - 验证下一跳分流
在客户端执行:
tracert -d www.baidu.com应该看到第2跳是 192.168.1.2(OpenWrt 旁路由)
- 验证 OpenClash
在 OpenWrt 上:
ps w | grep -E "clash|mihomo|openclash" | grep -v grep netstat -lntp | grep -E "7890|7891|7892|7893" nslookup www.baidu.com在客户端测试加速服务:
curl.exe -m 10 -U "Clash:密码" -x http://192.168.1.2:7890 http://ip.sb应该显示加速出口 IP,不是本地 IP
- 完整链路测试
开启 iKuai 下一跳规则后,在客户端测试:
Test-NetConnection www.baidu.com -Port 443 curl.exe http://ip.sb应该能正常访问,不再出现 TTL expired
九、常见问题排查
- TTL expired 错误
现象:ping www.baidu.com 返回 Reply from 192.168.1.2: TTL expired in transit
原因:缺少 SNAT 规则
解决:添加 SNAT 规则(见第七步)
- Fake-IP 问题(ping 返回 198.18.x.x)
现象:ping www.baidu.com 返回 PING www.baidu.com (198.18.0.8)
原因:OpenClash 使用了 Fake-IP 模式
解决:
- 在 OpenClash Web 界面:模式设置 → 运行模式改为 Redir-Host
- 在 OpenClash Web 界面:DNS 设置 → 关闭 DNS 代理和 DNS 劫持
- 确保配置文件里 enhanced-mode: redir-host
- 重启 OpenClash 和 dnsmasq
- 在 Windows 客户端执行:ipconfig /flushdns
- 开启下一跳后无法上网
如何判断是"没出去"还是"没回来":
方法一:使用 tcpdump 抓包(最准确)
在客户端持续访问网站,在 OpenWrt 上执行:
tcpdump -ni br-lan "src 192.168.6.2 and tcp port 443" -c 10 tcpdump -ni br-lan "dst 192.168.6.2 and tcp port 443" -c 10判断标准:
- 第一个命令能看到 SYN → 去程已到 OpenWrt(不是"没出去")
- 第一个有 SYN,但第二个完全没回包 → 没回来(SNAT/回程路由问题)
- 第一个完全看不到包 → 没出去(iKuai 下一跳没生效)
方法二:使用 tracert
在客户端执行:
tracert -d www.baidu.com- 第1跳是 192.168.6.1(正常)
- 第2跳是 192.168.1.2 → 去程到了 OpenWrt
- 第3跳及之后全是 * * * → 从 OpenWrt 往外转发/回程断了
- 第2跳就是 * * * → iKuai 没把流量送到 OpenWrt
常见原因和解决方法:
- 缺少 SNAT 规则 → 添加 SNAT 规则(见第七步)
- 下一跳配置错误 → 下一跳必须指向 192.168.1.2,不能是 192.168.1.1
- 加速服务认证问题
现象:curl -x http://192.168.1.2:7890 http://ip.sb 返回 407 Proxy Authentication Required
原因:OpenClash 启用了代理认证
解决:
- 查看日志获取账号密码:
tail -f /tmp/openclash.log | grep -i "账户密码" - 使用认证信息:
curl -U "Clash:密码" -x http://192.168.1.2:7890 http://ip.sb - 或在 OpenClash 设置中关闭代理认证
- 查看日志获取账号密码:
- opkg update 卡住或很慢
常见原因:
- IPv6 优先但 IPv6 不通 → 临时禁用 IPv6:
sysctl -w net.ipv6.conf.all.disable_ipv6=1 - 系统时间不对 → 校时
- OpenClash 劫持了路由器自身流量 → 停 OpenClash 测试
- 切换国内镜像源(清华/中科大)
- IPv6 优先但 IPv6 不通 → 临时禁用 IPv6:
十、关键命令速查
网络相关:
ip route show
ip route get 192.168.6.2
ip addr show
/etc/init.d/network restart
防火墙相关:
/etc/init.d/firewall restart
nft list tables
nft list chain inet fw4 srcnat
nft add rule inet fw4 srcnat oifname "br-lan" ip saddr 192.168.6.0/24 masquerade
OpenClash 相关:
tail -f /tmp/openclash.log
ps w | grep -E "clash|mihomo|openclash" | grep -v grep
netstat -lntp | grep -E "7890|7891|7892|7893"
/etc/init.d/openclash restart
DNS 相关:
nslookup www.baidu.com 223.5.5.5
nslookup www.baidu.com
/etc/init.d/dnsmasq restart
加速服务测试:
curl -v --connect-timeout 3 --max-time 10 -U "Clash:密码" -x http://127.0.0.1:7890 http://ip.sb
curl.exe -m 10 -U "Clash:密码" -x http://192.168.1.2:7890 http://ip.sb
网络诊断:
tcpdump -ni br-lan "src 192.168.6.2 and tcp port 443" -c 10
tcpdump -ni br-lan "dst 192.168.6.2 and tcp port 443" -c 10
tracert -d www.baidu.com
Windows 客户端测试:
ipconfig /all
ipconfig /flushdns
Test-NetConnection www.baidu.com -Port 443 -InformationLevel Detailed
curl.exe -I --connect-timeout 5 https://www.baidu.com
tracert -d www.baidu.com
十一、易错点总结
- 下一跳配置错误
❌ 错误:下一跳网关设置为 192.168.1.1(主路由自己)
✅ 正确:下一跳网关设置为 192.168.1.2(旁路由)
- dnsmasq-full 安装错误
❌ 错误:opkg install dnsmasq-full bash curl ...(与其他包一起安装)
✅ 正确:opkg install dnsmasq-full --force-overwrite(单独强制安装)
- SNAT 持久化方式错误
❌ 错误:直接写 /etc/nftables.d/99-lan2-snat.nft 文件,格式错误
✅ 正确:使用 /etc/firewall4.user 文件,用 nft add rule 命令
- Fake-IP 未关闭
❌ 错误:只改了"运行模式"为 Redir-Host,但 DNS 仍返回 198.18.x.x
✅ 正确:同时关闭 DNS 代理和 DNS 劫持,确保配置文件里 enhanced-mode: redir-host
- 防火墙状态判断错误
❌ 错误:看到 /etc/init.d/firewall status 显示 inactive 就认为防火墙没工作
✅ 正确:用 nft list tables | grep fw4 和 nft list chain inet fw4 srcnat 验证
- 加速服务端口使用错误
❌ 错误:curl -x http://127.0.0.1:7891 http://ip.sb(用 HTTP 协议访问 SOCKS5 端口)
✅ 正确:curl -x socks5h://127.0.0.1:7891 http://ip.sb(用 SOCKS5 协议)
- 分区扩容时机错误
❌ 错误:写入镜像后先重启进入 OpenWrt,再扩容分区
✅ 正确:写入镜像后立即扩容,不要先重启
十二、如何获取准确值
- 如何判断防火墙类型
nft list tables | grep fw4如果能看到 table inet fw4 → nftables (firewall4)
- 如何获取需要 SNAT 的网段
在 iKuai 管理界面查看"端口分流"或"下一跳分流"规则的"源地址"字段
- 如何获取 OpenWrt 的 LAN 接口名
uci show network.lan.ifname通常是 br-lan
- 如何获取 OpenClash 加速服务端口
在 OpenClash Web 界面首页查看,或执行:
netstat -lntp | grep -E "7890|7891|7892|7893"通常是:HTTP 7890,SOCKS5 7891,Redir 7892,Mixed 7893
- 如何获取 OpenClash 加速服务认证信息
tail -f /tmp/openclash.log | grep -i "账户密码"通常是 Clash:密码(密码是随机生成的字符串)
- 如何判断是否 Fake-IP
nslookup www.baidu.com如果返回 198.18.x.x → Fake-IP 已启用(需要关闭)
如果返回真实 IP(如 110.242.69.21)→ Fake-IP 已关闭(正常)
- 如何判断是"没出去"还是"没回来"
在客户端持续访问网站,在 OpenWrt 上执行:
tcpdump -ni br-lan "src 192.168.6.2 and tcp port 443" -c 10 tcpdump -ni br-lan "dst 192.168.6.2 and tcp port 443" -c 10- 第一个能看到 SYN → 去程已到 OpenWrt
- 第一个有 SYN,但第二个完全没回包 → 没回来
- 第一个完全看不到包 → 没出去
适用版本:OpenWrt 24.10.5, OpenClash v0.47.046
最后更新:2026-01-21