0x00 前言
基于 PVE + ImmortalWrt 23.05 编写,其他版本可能会有一些差异。
功能:路由器作为网关,通过 OpenClash 代理,同时支持 IPv4 和 IPv6,通过 SmartDNS 实现 DNS 分流和优选
关于为什么要使用 SmartDNS,可以参考我的另一篇文章: 软路由与 DNS 折腾笔记。当然如果你嫌麻烦也可以不用 SmartDNS,直接使用 OpenClash 的 DNS 功能。
本配置之所以称为 “指北”,是因为大多数人第一次接触 OpenWrt 时,看见 LuCI Web 界面里的各种配置选项会 “找不着北”,因此这篇文章命名为 《OpenWrt 配置指北》
0x01 PVE
网卡直通
编辑文件: /etc/default/grub
找到以下行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
修改为
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream"
参考: https://github.com/ivanhao/pvetools/issues/34
更新 grub
update-grub
重启
reboot
安装 OpenWrt
PVE 界面选择 创建虚拟机
常规
只选择一个开机自启动就好
操作系统
选择 不使用任何介质
,因为我们要导入 OpenWrt 直接作为磁盘
右边操作系统选择 Linux 6.x - 2.6 Kernel
系统
机型选择可选q35
和i440fx
,q35 更新一点,我更建议使用 q35
如果你使用的固件文件名中带有 combined-efi
,那么:
BIOS 选择 OVFM (UEFI)
,下面 添加 UEFI 磁盘
取消勾选,因为 UEFI 分区已经在 OpenWrt 的磁盘中了, 但是在虚拟机启动时会有一条警告: WARN: no efidisk configured! Using temporary efivars disk.
,因为我们没有添加一块 UEFI 磁盘到虚拟机中,这是正常的,不影响使用。
如果固件中带有 qemu-ga
,那么勾选 Qemu 代理
(此软件包类似于 VMware Tools,可以实现虚拟机与宿主机的交互,例如关机、重启、获取 IP 等)
磁盘
删除默认的磁盘,直接点击下一步,待会创建虚拟机后再导入 OpenWrt 磁盘
CPU
通俗的来讲,插槽就是 CPU 的数量,核心就是每个 CPU 的核心数,这里根据自己的需求选择,类别选择 host
,这样可以让虚拟机直接使用宿主机的 CPU,并且支持 CPU 的所有特性。
如果你使用的 CPU 性能比较差,可以增加这台虚拟机的 CPU 权重,这样当宿主机 CPU 负载比较高时,这台虚拟机会优先分配 CPU 资源。
内存
根据自己的需求选择
网络
默认的虚拟网卡留着就行,不要删除,后面用于访问 PVE 管理界面
创建完成后不要启动虚拟机,我们还要导入 OpenWrt 磁盘
导入 OpenWrt 磁盘
注意:我这里使用的是 qcow2
格式的磁盘,如果你使用的是 vmdk
或 img
格式的磁盘,请自行在网络上搜索如何导入,这里不再赘述。
使用 qm importdisk
命令导入磁盘:
qm importdisk 100 /path/to/immortalwrt-x86-64-generic-squashfs-combined-efi.qcow2 local --format qcow2
100
是虚拟机的 ID,/path/to/immortalwrt-x86-64-generic-squashfs-combined-efi.qcow2
是 OpenWrt 的磁盘路径,local
是 PVE 的存储空间,默认是 local-lvm
,如果你使用的是其他存储空间,请自行替换。(我合并了 local
和 local-lvm
,所以我这里使用的是 local
,如果你也想整合自己的磁盘空间,也可以研究一下,这里不过多赘述)
导入完成以后,在虚拟机的 硬件
选项卡中,可以发现多了一块 未使用的磁盘
,我们选中它,点击 编辑
,然后在 总线/设备
中选择 SATA
,如果你使用的是 SSD
则可以进一步勾选 SSD 仿真
,这样可以提高性能。
导入完成后可以删除刚刚上传的磁盘文件,因为已经导入到 PVE 的存储空间中了。
添加硬件直通的网卡
在虚拟机的 硬件
选项卡中,点击 添加
,选择 PCI 设备
,然后选择你要直通的网卡。
不要勾选所有功能
现在虚拟机有两种网卡,一种是显示为 网络设备 (net0)
的虚拟网卡,用于访问 PVE 管理界面,另一种是显示为 PCI 设备 (net1)
的直通网卡,用于 OpenWrt 直通硬件网卡作为 WAN 和 LAN 使用。
OpenWrt 中的网络结构如下:
- eth0: 虚拟网卡,用于访问 PVE 管理界面
- eth1: 直通网卡,用于 WAN
- eth2 - ethx: 直通网卡,用于 LAN
OpenWrt 中的网卡配置会在此文中的下半部分提及
设置开机引导
在虚拟机的 选项
选项卡中,选中 引导顺序
并编辑,启用刚刚导入的 OpenWrt 磁盘,如果有其它磁盘或设备被勾选可以取消勾选
这样就完成了 OpenWrt 的安装,现在可以启动虚拟机了
0x02 OpenWrt
网络配置
默认有一个 WAN6
网卡,将其删除,以免干扰后面的配置
在 全局网络选项
中,将 IPv6 ULA 前缀
删除。
WAN
协议选择 PPPoE
,填写你的宽带账号和密码即可,高级设置
中的 获取 IPv6 地址
选择自动,勾选 使用默认网关
和 委托 IPv6 前缀
; IPV6 分配长度
选择 已禁用
LAN
首先在 设备
中,配置设备 br-lan
,网桥端口选择希望作为 LAN 口的网口,上面提到的用于 LAN 的直通网卡和 eth0 虚拟网卡在这里可以全部勾选
在 高级设置
中,IPV6 分配长度
选择 64
,IPv6 后缀
填写 eui64
在 DHCP 服务器
-> IPv6设置
中,RA 服务
选择 服务器模式
,禁用 DHCPv6 服务
和 NDP 代理
还有 本地 IPV6 DNS 服务器
(IPV4 的 DNS 服务器地址可以提供 AAAA 解析,而且运营商给的 IPV6 前缀变化时,会有一小部分时间路由器的 IPV6 地址变化,而客户端没有及时更新,所以这里干脆禁用 IPV6 DNS 服务器地址,A 解析和 AAAA 解析都通过 IPV4 DNS 服务器地址解析),IPV6 RA 设置
中,默认路由器
选择 在可用的前缀上
,勾选 启用 SLAAC
,取消勾选 RA标记
中的所有选项
注意:RA 服务
和DHCPv6 服务
以及NDP 代理
这三个选项在更新 OpenWrt 后可能会自动启用,所以每次更新后都务必检查一下。
详细设置如图:
另外如果想访问光猫,可以添加一个新接口,名称随意,协议选择 DHCP 客户端
或自行配置静态 IP,设备选择连接光猫的网口,然后在编辑接口 -> 高级配置
中,取消勾选 使用默认网关
,配置 使用网关跃点
为 99
,在 防火墙设置
选项卡中,创建/分配防火墙区域
选择 WAN
,这样就可以访问光猫了。
DNS
在 网络
-> DHCP/DNS
的 过滤器
选项中,取消勾选 重绑定保护
和 禁止解析 IPv6 DNS 记录
,这样解析到内网的域名和 AAAA 记录可以被正常解析
例如 www.example.com
解析到 192.168.1.254
,我们在内网可以通过域名正常访问
另外在 限制
选项中,删除默认的 最小缓存 TTL
(默认为60, 部分固件会存在一个 3600 的默认选项,所以要把 DNS 最小 TTL 设置项删除)
SmartDNS
在一段时间的使用下来,发现连接一些国内的网站并不能优选,且运营商 DNS 解析到的 IP 有时不是最优
为了更好的网络体验,调研一番以后,决定使用 SmartDNS + OpenClash 这样的组合
并且通过 OpenClash 分流国内外 DNS 查询
SmartDNS 服务使用的端口为:6053
第二 DNS 服务器端口为:6153
流程图:
之前 ImmortalWrt 默认配置了 SmartDNS 的第二服务器,但是在最新的版本中已经删除了,所以我们需要手动配置一下
已删除: https://github.com/immortalwrt/packages/commit/f187ad1d5d5e86f37760631aef764c4f05dc709f
首先设置好第二 DNS 服务器的端口和组名,我这里设置为 6153
和 Global
然后在 高级设置
里选择 测速模式
为 tcp:80,ping
, 这样可以选择日常访问时最快的 IP 地址(不选择 tcp:443 端口优先的原因是如果与 OpenClash 同时开启会导致 libcrypto 挂掉 原因未知,接着会把 uhttpd 带崩,导致访问不了 OpenWrt 的 Web 管理页面),再删除 域名TTL
的默认值,默认 3600 太长了,删除后会使用上游 DNS 的 TTL,最小 TTL 我设置成了 5 秒(默认 600 秒),因为某些视频网站的 PCDN 的域名 TTL 可能会很短,所以设置成 5 秒,这样可以避免 DNS 缓存导致访问缓慢,,附上我的配置截图:
常规设置:(不勾选 自动设置 Dnsmasq
)(打码部分为运营商 DNS):
你也可以填写你喜欢的国内公共 DNS 服务商
注意这里国际组的 DNS 配置最好填写 DOT,因为不需要额外 Bootstrap 解析,服务器组名填写 Global
(和上一步设置的一样),另外在配置 Global
组 DNS 服务器时,记得勾选 从默认组中排除
,以免影响到国内组解析
OpenClash
这里的配置比较多且复杂,有几个常见的 Q&A:
Q: 节点不支持 UDP 代理,勾选 UDP 流量转发
有什么用?
A: 启用 UDP 流量转发
只是为了让 OpenClash 支持 UDP,如果节点不支持 UDP 代理,那么 UDP 流量会自动被节点 Block,不会影响使用,但是有一些海外的游戏可能会无法连接,你可能需要使用支持 UDP 代理的节点,但游戏加速我更推荐使用加速器。
Q: 为什么要勾选 绕过中国大陆 IP
?
A: 如果不勾选,国内的流量也会走 Clash 内核进行直连,虽然不会影响使用,但是会降低一点性能,缺点就是关于国内网站的分流会不起作用,比如分流 bilibili 番剧到 HK,在进入 Clash 内核前就被判断为中国大陆 IP,所以不会走代理,关于这种特殊情况你可以考虑不使用此选项。
Q: 节点不支持 IPv6,勾选 IPv6流量代理
有什么用?
A: 如果你的网络环境支持 IPv6,那么可以勾选 IPv6流量代理
,这样 OpenClash 会将 IPv6 流量代理到节点,如果节点不支持 IPv6,那么会自动切换为 IPv4 代理,不会影响使用,并且由于勾选了 绕过中国大陆 IPv6
,所以国内 IPv6 流量不会受到影响。如果你的网络环境支持 IPv6,并且你没有勾选 IPv6流量代理
,那部分海外网站会直接通过 IPv6 访问,可能会影响到你的网络冲浪;如果你对访问中国大陆的 IPv6 网站没有需求,你可以考虑禁止 IPv6 的解析,同时不勾选 IPv6流量代理
,这样既不会影响到 BT 连接 IPv6 下载,也不会影响你 IPv4 的网络冲浪。
Q: 为什么我使用 https://test-ipv6.com 检测我不支持 IPv6?
A: 和上面的问题一样,由于 test-ipv6.com 是海外网站,你的节点如果不支持 IPv6,那么会自动切换为 IPv4 代理,所以 test-ipv6.com 检测不到你的 IPv6 地址,你可以使用以下位于中国大陆的 IPv6 测试网站:
Q: 为什么我的 Instagram/YouTube 客户端 无法加载 / 访问很慢?
A: 确保勾选了 禁用 QUIC
,如果 Instagram 还是无法加载,说明 Instagram 已经将 QUIC 的相关域名或连接资源缓存到了本地,可以尝试卸载重装 (Meta 系的 APP 基本都有这个问题,尽量避免在裸连环境下打开 Instagram)
Q: 为什么 Microsoft Copilot in Bing 无法使用?
A: 因为 Microsoft 域名默认解析是国内 IP,且 GeoSite 为 CN,默认会绕过内核,可通过配置 绕过中国大陆 IPv4 黑名单
和 绕过中国大陆 IPv6 黑名单
加入域名: bing.com
解决
插件设置 - 模式设置
勾选 使用 Meta 内核
(原版内核已停更)
运行模式中,Redir-Host 的兼容模式和混合模式根据自己的网络环境选择
如果你选择的是兼容模式,勾选 UDP 流量转发
插件设置 - 流量控制
勾选 禁用 QUIC
、绕过中国大陆 IP
,仅允许常用端口
选择 默认常用端口
如果你想使用 OpenClash 代理内网中客户端的 WARP 客户端流量,使其作为 WARP 的前置代理,有两种方法:
- 禁用
绕过中国大陆 IP
和仅允许常用端口
- 如果你不想影响内网中其它设备的上网,可以在
仅允许常用端口流量
中填写以下端口:
21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889 500 854 859 864 878 880 890 891 894 903 908 928 934 939 942 943 945 946 955 968 987 988 1002 1010 1014 1018 1070 1074 1180 1387 1701 1843 2371 2408 2506 3138 3476 3581 3854 4177 4198 4233 4500 5279 5956 7103 7152 7156 7281 7559 8319 8742 8854 8886
这里整合了 WARP 所需要的端口和 OpenClash 的默认常用端口
注意: 请确保使用支持 UDP 的节点作为 WARP 的前置代理,否则会导致 WARP 无法正常连接。
插件设置 - DNS 设置
本地 DNS 劫持
选择 使用 Dnsmasq 转发
勾选 禁止 Dnsmasq 缓存 DNS
插件设置 - IPv6 设置
勾选 IPv6流量代理
、UDP 流量转发
、允许 IPv6 类型 DNS 解析
、绕过中国大陆 IPv6
IPv6代理模式
选择 TProxy 模式
GEO 数据库订阅
、大陆白名单订阅
选择一个自己喜欢的时间自动更新
覆写设置 - DNS 设置
由于 Fallback 即将被弃用,我们将使用 nameserver-policy 来分流 DNS,达到 DNS 分流和防泄露的效果
勾选 自定义上游 DNS 服务器
不勾选 追加上游 DNS
、追加默认 DNS
NameServer 使用 SmartDNS 第二服务器
FallBack 和 Default-NameServer 可不填
OpenClash 集成了 nameserver-policy
的自定义功能,所以我们可以很方便的配置,在自定义选项中加入:
"geosite:cn,private,apple":
- 127.0.0.1:6053
这样,SmartDNS 就会接管所有的 DNS 请求,也就做到了 DNS 分流和优选解析的目的。
至此,OpenClash 已经配置完成,在配置订阅里添加自己的订阅链接并更新订阅就能正常使用了。
注意: OpenClash 在更新系统后不会自动启动,需要手动启动一次。
如果你的订阅提供商的节点域名解析比较奇怪,可添加一个 SmartDNS 国内组或是任意你喜欢的国内 DNS 服务器到default-nameserver
并勾选节点域名解析
或在配置文件的 DNS 下添加类似下面的选项:
以下为示例:
proxy-server-nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
UPnP
由于 OpenWrt 现已使用 nftables 作为默认防火墙,如果你没有公网 IPv4 地址,启用 UPnP 有一定的可能性会无法自动配置端口映射,可以在 UPnP 的高级设置选项卡中,启用 使用 STUN
碰碰运气,如果还是无法自动配置端口映射,那么只能在防火墙中手动设置端口映射了。
常用的国内 STUN 服务器:
- stun.qq.com
- stun.miwifi.com
端口均为 3478
关于 BBR
开启 BBR 可能会导致长连接挂掉,可能会让你的网络体验变差,所以不推荐开启或是在编译中启用,家用路由不像 VPS,不需要考虑 TCP 的拥塞控制。