OpenWrt 配置不完全指北
Fanx / 2023-07-21 / Linux / 阅读量 12404

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 界面选择 创建虚拟机

常规

只选择一个开机自启动就好
'安装-1'

操作系统

选择 不使用任何介质,因为我们要导入 OpenWrt 直接作为磁盘
右边操作系统选择 Linux 6.x - 2.6 Kernel
'安装-2'

系统

机型选择可选q35i440fx,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 等)
'安装-3'

磁盘

删除默认的磁盘,直接点击下一步,待会创建虚拟机后再导入 OpenWrt 磁盘

CPU

通俗的来讲,插槽就是 CPU 的数量,核心就是每个 CPU 的核心数,这里根据自己的需求选择,类别选择 host,这样可以让虚拟机直接使用宿主机的 CPU,并且支持 CPU 的所有特性。
如果你使用的 CPU 性能比较差,可以增加这台虚拟机的 CPU 权重,这样当宿主机 CPU 负载比较高时,这台虚拟机会优先分配 CPU 资源。
'安装-4'

内存

根据自己的需求选择

网络

默认的虚拟网卡留着就行,不要删除,后面用于访问 PVE 管理界面
创建完成后不要启动虚拟机,我们还要导入 OpenWrt 磁盘

导入 OpenWrt 磁盘

注意:我这里使用的是 qcow2 格式的磁盘,如果你使用的是 vmdkimg 格式的磁盘,请自行在网络上搜索如何导入,这里不再赘述。
使用 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,如果你使用的是其他存储空间,请自行替换。(我合并了 locallocal-lvm,所以我这里使用的是 local,如果你也想整合自己的磁盘空间,也可以研究一下,这里不过多赘述)
导入完成以后,在虚拟机的 硬件 选项卡中,可以发现多了一块 未使用的磁盘,我们选中它,点击 编辑,然后在 总线/设备 中选择 SATA,如果你使用的是 SSD 则可以进一步勾选 SSD 仿真,这样可以提高性能。
导入完成后可以删除刚刚上传的磁盘文件,因为已经导入到 PVE 的存储空间中了。
'安装-5'

添加硬件直通的网卡

在虚拟机的 硬件 选项卡中,点击 添加,选择 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 分配长度 选择 64IPv6 后缀 填写 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

流程图:

SmartDNS 流程图

之前 ImmortalWrt 默认配置了 SmartDNS 的第二服务器,但是在最新的版本中已经删除了,所以我们需要手动配置一下

已删除: https://github.com/immortalwrt/packages/commit/f187ad1d5d5e86f37760631aef764c4f05dc709f

首先设置好第二 DNS 服务器的端口和组名,我这里设置为 6153Global
第二 DNS 配置图

然后在 高级设置 里选择 测速模式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

OpenClash 配置

这样,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 的拥塞控制。

1 + 2 =
3 评论
    mihomoEdge Chromium 128Windows 10 / 11
    2024年09月20日 回复

    bbr不建议在家用网络中开启,家用网络环境下没有那么多的丢包,反而可能会造成堵塞

      FanxChrome 129Mac OS X
      2024年09月22日 回复

      @mihomo 是的

    HinataChrome 128Windows 10 / 11
    2024年09月20日 回复

    很完美的教程,希望能有一个immrotalwrt+homeproxy组合的配置教程。