普通视图

发现新文章,点击刷新页面。
昨天以前Dolingou

EasyTier内网穿透及组网教程

2025年3月30日 08:00
😀
最近出门的次数变得越来越多,在外出的时间,家里的网络维护以及内网数据资料的获取成为了一个新的难题。之前我也有尝试过使用Tailscale以及Zerotier等方式进行内网穿透回家,但是由于Zerotier和Tailscale的中心服务器都是在国外,同时父母家那边的网络由于是社区宽带,已经不知道NAT了多少次,所以远程管理的效果还差也很折磨。这次发现了一个新的内网穿透软件:EasyTier,可以在一定程度上缓解上述提到的问题。这篇文章进行一些EasyTier的配置讲解
notion image

📝 EasyTier 介绍

EasyTier是一个去中心化的VPN组网方案,由Rust和Tokio驱动。相对于Zerotier、Tailscale的区别也在于去中心化这个特点,客户端即服务端,处于不同网络环境下的客户端在组网的同时,也是服务端的一部分,提供基于RPC的中继能力。相比于Zerotier于Tailscale的中心化组网方案,EasyTier在具有多客户端的情况下,借助P2P异地组网,相比传统的中心化组网方案,成功率更高,可实现更好的内网穿透效果,更有效的利用家宽的上下行带宽。

EasyTier 特点

以下部分内容摘选自EasyTier的Github项目介绍页面
  • 去中心化:无需依赖中心化服务,节点平等且独立。
  • 安全:支持利用 WireGuard 加密通信,也支持 AES-GCM 加密保护中转流量。
  • 高性能:全链路零拷贝,性能与主流组网软件相当。
  • 跨平台:支持 MacOS/Linux/Windows/Android,未来将支持 IOS。可执行文件静态链接,部署简单。
  • 无公网 IP 组网:支持利用共享的公网节点组网,
  • NAT 穿透:支持基于 UDP 的 NAT 穿透,即使在复杂的网络环境下也能建立稳定的连接。(据说在NAT4-NAT4网络下也可能打洞成功)
  • 子网代理(点对网):节点可以将可访问的网段作为代理暴露给 VPN 子网,允许其他节点通过该节点访问这些子网。
  • 智能路由:根据流量智能选择链路,减少延迟,提高吞吐量。
  • TCP 支持:在 UDP 受限的情况下,通过并发 TCP 链接提供可靠的数据传输,优化性能。
  • 高可用性:支持多路径和在检测到高丢包率或网络错误时切换到健康路径。
  • IPV6 支持:支持利用 IPV6 组网。
  • 多协议类型: 支持使用 WebSocket、QUIC 等协议进行节点间通信。
  • Web 管理界面:支持通过 Web 界面管理节点。

个人使用感受

目前我的网络环境为电信宽带,具有公网IPv4 + 公网IPv6,手机使用联通5G,正常情况下可以实现在建立连接之后3-5秒内实现P2P的内网穿透,不再借助中继服务器进行数据传输,同城延迟在50ms左右,如果是相同运营商的宽带,理论上同城延迟会更低。
同时,在CoalCloud(碳云)的VPS,在启用EasyTier作为节点后,与家里的Debian旁路网关和手机均可即时建立P2P连接,无需EasyTier提供公共服务器进行数据传输。

📝 EasyTier 安装方法

目前EasyTier提供了多种安装方式,以适应不同的系统平台,同时提供多种第三方工具,可用于对EasyTier节点进行管理,例如EasyTier Game ( Windows )EasyTier Manager ( Windows )luci-app-easytier ( OpenWrt )等。
我个人目前将EasyTier部署在家庭网络内的旁路网关上,并使用了点对网的子网代理,整体使用官方所提供的一键安装脚本。同时为了进行中继通信和在与NAT44网络内设备建立连接情况下,我通过Docker Compose方式将EasyTier也部署在了CoalCloud的VPS上。在旁路网关部署未使用Docker Compose的原因在于我需要使用点对网的子网代理,即通过旁路网关作为跳板,实现对局域网内其他设备的访问与管理,如果通过Docker实现,可能会增加网络的复杂性,所以只使用了脚本安装。
EasyTier不区分服务端与客户端,所以的节点所使用的程序都是一样的,所以在了解以下基于Debian的节点安装及配置之后,可以举一反三,在其他设备进行配置。如果使用OpenWRT,可以尝试在软件仓库中搜索,大部分软件仓库均已收录EasyTier。

EasyTier 一键安装脚本

首先确保你的系统以及安装了wgetunzip 这两个必须的依赖,如果没有安装可通过如下命令安装(Debian、Ubuntu等使用apt进行软件包管理的系统):
然后通过如下命令进行EasyTier的脚本一键安装:
默认脚本下载位置位于/tmp 临时文件夹下,安装完成后可进行删除。

EasyTier 基础配置

EasyTier安装后,默认的配置文件位于/opt/easytier/config/default.conf ,下面列出我的配置文件宫参考,你也可以通过config_generator生成自己的配置文件:
各项参数意义如下:
instance_name: 实例名称
instance_id : 实例的uuid,可以使用config_generator生成
ipv4 :当前设备的虚拟局域网IPv4地址,如果你需要手动为设备指定虚拟局域网的IPv4地址,则需要此项,否则可删除。
dhcp : 如果你需要手动为当前设备指定虚拟局域网IPv4地址,并已经包含了ipv4的参数项,则此项填写为false,如果你希望自动为当前设备分配虚拟局域网IPv4地址,则填写true.
listeners : 一般情况下无需改动。如果你希望使用不同的端口,则自行修改端口并对端口进行防火墙放行。
rpc_portal : 默认端口为0,在官方文档中表示默认会尝试使用15888,但实际并没有使用,EasyTier启动后无法通过easytier-cli进行数据获取,报错信息如下所示。所以建议修改监听端口为15888
network_name:虚拟局域网的名称。EasyTier是通过network_namenetwork_secret进行网络的识别与连接确认,所以需要客户端的network_namenetwork_secret 完全一致。建议使用复杂一些的网络名称
network_secret :虚拟局域网的网络密钥。
uri :节点地址,可使用官方提供的节点(tcp://public.easytier.cn:11010),如果你自建了VPS节点,也可填写tcp://IP:PORT ,默认端口为11010。也可以查看EasyTier 公共服务器列表,选择最适合自己网络环境的公共服务器节点。
enable_kcp_proxy :是否开启KCP代理,将TCP流量转换为KCP流量,提升传输速度与降低延迟。建议开启。
latency_first : 延迟优先,建议开启。
enable_exit_node:是否设置当前节点为出口节点。目前建议关闭,由于EasyTier无法进行DNS劫持,所以暂时无法像Tailscale或者Zerotier使用出口节点进行翻墙等科学上网操作。
dev_name : 设置tun网卡名称,如果你的设备具有多个程序在使用tun设备,那么建议修改一下名称,避免产生冲突。
proxy_forward_by_system : 使用系统转发替代EasyTier内置转发。相对来说性能会有所提高,但是你需要对防火墙有一定的了解,或者你的节点部署在局域网环境内,没有开启防火墙。 bind_device : 没有在配置项中列出的部分。即是否绑定物理设备,如果你的机器使用了很多的虚拟网络设备,建议删除该项,使其绑定物理网卡,避免产生无法连接问题 use_smoltcp : 是否使用用户态协议栈,避免操作系统防火墙导致的无法子网代理 / KCP 代理。个人目前是删除了该项,因为暂时没有发现因防火墙导致的无法子网代理问题,同时在开启用户态时,性能损耗较为严重。 relay_all_peer_rpc : 转发所有对等节点的RPC数据包,帮助非当前虚拟局域网的其他节点建立连接。为了安全以及流量考虑,建议关闭或删除。 enable_encryption : 是否禁用加密。false为开启加密,true为禁用加密,默认为false

防火墙放行EasyTier端口

EasyTier默认监听端口为11010 ,如果你使用系统防火墙,需要对端口进行放行。同时如果部署在家庭网络内,需要在路由器的防火墙对11010端口也需要进行放行操作(Forward)。

EasyTier 运行命令

启动EasyTier

其中@default即使用defalt.conf配置文件,以下皆同。控制命令基于Systemd。

重启EasyTier

停止EasyTier

查看EasyTier运行状态

EasyTier-CLI命令

查看EasyTier已连接的节点

返回结果类似于如下,即已经建立连接的节点和目前的基本情况,包括是否使用P2P、延迟、丢包、NAT类型等:

查看EasyTier当前节点信息

返回结果大概与下面的信息相似,包括当前的虚拟局域网IPv4地址,子网代理范围,节点ID、公网IPv4地址、公网IPv6地址等。

EasyTier 子网代理

子网代理即点对网的组网方案,可通过一台跳板机进行局域网内其他设备的访问,且无需为局域网内其他设备配置EasyTier。例如你的EasyTier部署在主路由上,但在外面时候想访问家里的NAS,那么就需要点对网的组网方案。
EasyTier的点对网组网非常简单,在配置文件中增加如下部分:
cidr即你需要实现点对网组网的网段,例如我家里的局域网网段为10.0.0.0/24,那么即填写这个网段,如果你的是192.168.1.1类似的局域网地址,那么对应的cidr为192.168.1.0/24

🤗 总结归纳

目前在测试过程中还存在如下问题或未测试项:
  • 出口节点目前不能代理DNS流量,即EasyTier无法对设备的DNS进行劫持,所以无法实现通过节点进行科学上网。目前也不支持Magic DNS功能。
  • 完全NAT44且不具有IPv6公网地址情况下的内网穿透表现还未进行测试。目前已经确认在一方具有IPv6情况下
  • WireGuard目前还未进行测试,因为我基本上不用WireGuard。这几天看看抽空研究一下。

📎 参考文章

 
💡
有关Easytier安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
 

InnerTune,一个第三方Youtue Music客户端

2024年10月6日 08:00
😀
自从网易云音乐的黑胶VIP到期之后,网易云音乐变得越来越难用,哪有听歌还要看广告之后才能听的,而且很多音乐提供的版本音质差就算了,有的只播放一个开头就因为不是VIP自动切歌,尤其是在健身房时候,突然切歌的伤害实在是太大了。在Android上,没有什么太好的选择,我又不是苹果用户,所以Apple Music就算了,选来选去,最后还是决定用Youtube Music。但是Youtube Music Android版本本身也有个问题,在不是Premium会员的情况下,是没有办法背景播放的,例如在手机息屏或者切换应用程序之后,音乐就暂停了,但是这个对于Android用户来说不是什么问题,毕竟我们什么样的App都有。
notion image

📝 InnerTune介绍

InnerTune是一个基于Material 3设计风格的YouTube Music客户端,专为Android平台开发,是一个开源项目,提供了YouTube Music官方客户端的绝大多数功能,并极大的提升在没有订阅Youtube Premium情况下的听歌体验。而且InnerTune非常贴心的内置了Proxy代理选项,可以方便的通过科学上网来访问Youtube Music的曲库。
InnerTune项目地址如下:
InnerTune
z-huangUpdated Mar 12, 2025
项目从2020年2月11日在Github提交了第一次Commit,到现在已经近5年的时间,是一个长期在维护的项目,所以暂时不用担心烂尾等问题。目前项目总计获得了4.3K的Star,266的Fork,1015条Issues已经被解决,是一个很负责的项目。
整体程序大小24.6M,比网易云音乐那种动辄占用1G多的程序简洁太多了,而且日常运行中也不会有事没事发个Push通知或者自己唤醒耗电。要说唯一的缺点,就是得有代理科学上网了,而且听歌要费流量。
目前已经是我手机上主要听音乐的App,即便是我在订阅了Youtube Premium的情况下。

功能特点:

  • 无广告播放:可以从YouTube/YouTube Music播放歌曲,且没有广告干扰。
  • 后台播放:支持在后台播放音乐,即使切换到其他应用,音乐也能继续播放。
  • 搜索功能:支持从YouTube Music搜索歌曲、视频、专辑和播放列表。
  • 登录支持:用户可以通过YouTube Music账号登录获取个性化推荐和收藏内容。
  • 缓存与离线播放:可以缓存和下载歌曲,支持离线播放。
  • 同步歌词:提供与歌曲同步显示的歌词功能。
  • 歌词翻译:内置歌词翻译功能,帮助用户理解外语歌曲。
  • 跳过静音:自动跳过歌曲中的静音部分,提升播放体验。
  • 音频标准化:自动调整音量,保持不同歌曲之间的音量一致。
  • 节奏/音高调整:可以调节歌曲的播放速度和音调,满足不同需求。
  • 动态主题:根据系统主题动态变化应用的外观,带来个性化体验。
  • Android Auto支持:在Android Auto环境中使用该应用,适用于车载系统。
  • 个性化快捷选择:提供快速选择功能,便捷找到用户喜爱的音乐。
  • Discord Rich Presence支持:与Discord集成,展示正在播放的歌曲信息。

程序界面:

程序界面整体遵循Material 3设计风格,简洁不花哨,完全够用。

主界面:

notion image

音乐播放界面及歌词界面:

notion image
notion image
notion image
 

设置界面:

notion image

InnerTune下载地址

目前开发者提供三个下载方式,Github、F-Droid市场以及IzzyOnDroid市场,通过下面图片点击超链接即可进入下载页面。
需要注意:如果通过Github Release进行下载*.apk 安装包进行下载,手机用户需要选择full_arm64-v8a.apk 的安装包:

InnerTune提示Unknown Error播放失败

最近InnerTune出现音乐无法播放问题(Songs not playable),提示Unknown Error,对应的InnerTune版本为0.5.10版本,解决方法如下:

使用Debug的Foss版本

如果出现播放失败问题,例如InnerTune版本为0.5.10 ,在播放页面提示Unknown Error,可以尝试使用debug版本,目前InnerTune Debug版本工作正常:

自行编译安装包

另外一种解决办法为尝试自行编译InnerTune的APK安装包,步骤大概如下:

1. 设置开发环境

下载Android Studio:在你的电脑上下载Android Studio,访问https://developer.android.com/studio。这是一款官方的集成开发环境(IDE),专门用于安卓应用开发。

2. 下载或克隆InnerTune仓库

访问InnerTune的GitHub仓库:https://github.com/z-huang/InnerTune/archive/refs/heads/dev.zip,下载或克隆项目的ZIP文件。

3. 解压项目

如果下载的文件是压缩包(ZIP格式),请解压项目文件。

4. 在Android Studio中打开项目

启动Android Studio,点击左上角菜单按钮,选择File -> Open,然后选择解压后的项目文件夹。

5. 生成签名APK

点击顶部左侧的菜单按钮,然后依次选择Build -> Generate Signed App Bundle / APK
选择APK选项,然后点击Next
如果你已经有签名密钥,请提供密码并继续;如果没有,请选择Create New创建新密钥。只需要填写路径、别名和密码即可,其他信息可以随意填写。完成后点击Next
选择fossRelease构建目标,然后点击Create按钮。
等待1到10分钟,直到构建完成。

6. 定位生成的APK文件

如果右下角弹出通知,标题为Generate signed APK with locate button,点击通知中的locate按钮。
APK文件会显示在你的默认文件浏览器中。你可以通过USB、电子邮件或其他方式将APK文件传输到你的手机。

7. 备份并替换现有InnerTune应用

在使用新APK之前,请在当前InnerTune应用的设置中创建备份。
只有完成备份后,才能卸载现有的InnerTune应用。
定位你制作的APK文件,像安装其他APK一样进行安装。

8. 恢复备份并登录Google账号

打开新安装的应用,从设置中恢复之前的备份。
如果你遇到问题,请尝试登录或退出你的Google账号。一些用户发现,在登录和退出账号后再进行操作可以解决问题。

9. 安全提示

切勿安装他人提供的APK:出于明显的安全原因,强烈建议你亲自制作和安装APK文件。这是确保应用安全的最佳方式。

📎 参考文章

 
💡
有关Android APP安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

以太坊(ETH)公共RPC节点推荐

2023年3月25日 08:00
😀
以太坊(Ethereum as known as ETH)是一种基于区块链技术的开源平台,支持智能合约(Smart Contract)、去中心化应用(DApps)以及加密货币代币发行(Token)等功能。作为一个分布式系统,以太坊网络由众多节点组成,并通过公共RPC(Remote Procedure Call)接口提供与其他节点通信的方式,可以将RPC理解为提供接入区块链网络的入口,类似一扇门,我们所有在ETH链上的交易,均需要通过这扇门才能进行。本文将介绍以太坊的公共RPC节点。
 

📝 什么是以太坊公共RPC节点?

以太坊(ETH)公共RPC节点是一种与以太坊网络进行交互的方式,通过RPC,允许开发人员查询区块链数据、广播交易以及执行智能合约(Smart Contract)等操作。这些节点由不同的服务提供商托管,可以通过使用HTTP或WebSocket协议连接到它们,并通过节点提供的JSON-RPC接口与以太坊的区块链网络(ETH Mainnet)通信。

🤗 为什么需要以太坊公共RPC节点?

在链上交互、交易时,程序需要与以太坊网络进行交互时,或者作为开发者在开发DApps和智能合约时,在自己的节点上运行完整的以太坊客户端可能会很耗费资源和时间。相反,使用公共RPC节点可以更快地获取数据和执行交易,同时还可以节省部署和维护以太坊节点所需的成本。
在ETH拥堵的时候,通过切换公共RPC节点,选择延迟较低的RPC入口,减少延迟,避免塞车,加快交易速度,抢占先机。需要注意的是,切换RPC节点,并不能降低Gas费用,RPC解决的是区块链的入口问题,而不是解决整条链的性能与费用问题。

📎 常用的以太坊公共RPC节点有哪些?

  1. https://mainnet.infura.io - Infura是以太坊和IPFS的托管节点服务,提供了以太坊主网和测试网络的RPC节点。
  1. https://cloudflare-eth.com - Cloudflare提供的以太坊主网RPC节点。
  1. https://api.mycryptoapi.com/eth - MyCrypto API提供的以太坊主网RPC节点。
  1. https://rpc.slock.it/mainnet - Slock.it提供的以太坊主网RPC节点。
  1. https://eth.rpc.rivet.cloud - Rivet提供的以太坊主网RPC节点。
  1. https://mainnet-rpc.dexon.org - Dexon提供的以太坊主网RPC节点。
  1. https://eth-mainnet.alchemyapi.io/v2/{API_KEY} - Alchemy提供的以太坊主网RPC节点,可申请私有api key使用。
  1. https://rpc.moonriver.moonbeam.network - Moonriver提供的以太坊主网RPC节点。
  1. https://eth.rpc.tor.us - Torus提供的以太坊主网RPC节点。
  1. https://mainnet-rpc.thundercore.com - ThunderCore提供的以太坊主网RPC节点。
  1. https://rpc.ankr.com/eth - Ankr提供的ETH主网RPC节点。付费版本支持Websocket协议。
  1. https://quicknode.com - 提供支持DApp构建者使用的专业以太坊RPC和Web3 API接入服务。需要注册,免费版提供http provider和wss的API。
  1. https://eth.llamarpc.com - llamarpc提供的以太坊主网RPC节点,提供隐私保护
  1. https://eth.drpc.org - drpc提供的以太坊主网RPC节点,提供隐私保护
以上这些节点,都是由相对知名与安全的厂商提供,例如Cloudflare,借助他们的服务调度与边缘计算网络,能够更快、就近实现接入ETH网络,实现交易。在选择上,我一般是对这些节点都做测速,选择延迟最低的来使用。同时,例如Alchemy这种需要自己申请api key的节点,在访问请求数量上会相比其他节点更少一些,所以速度上也会较快一些。
 

英文版本

 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

Recommendation of ETH Public RPC Nodes

2023年3月9日 08:00
💰
Ethereum (ETH) is an open-source platform based on blockchain technology that supports smart contracts, decentralized applications (DApps), and functions such as cryptocurrency token issuance. As a distributed system, the Ethereum network consists of numerous nodes and provides a way to communicate with other nodes through a public Remote Procedure Call (RPC) interface. RPC can be understood as an entry point for accessing the blockchain network, much like a door. All transactions on the ETH chain require this door to be accessed. This article will introduce public RPC nodes for Ethereum.

What is an Ethereum public RPC node?

An Ethereum (ETH) public RPC node is a way to interact with the Ethereum network, allowing developers to query blockchain data, broadcast transactions, and execute smart contracts through RPC. These nodes are hosted by various service providers and can be connected to via HTTP or WebSocket protocols, communicating with the Ethereum blockchain network (ETH Mainnet) through the JSON-RPC interface provided by the nodes.

Why do we need Ethereum public RPC nodes?

When interacting and trading on the blockchain, programs need to communicate with the Ethereum network. Running a complete Ethereum client on one's own node as a developer when developing DApps and smart contracts can be resource-intensive and time-consuming. Instead, using public RPC nodes can allow for faster data retrieval and transaction execution while saving costs associated with deploying and maintaining an Ethereum node.
During times of ETH congestion, switching public RPC nodes and selecting RPC entry points with lower latency can reduce delays, avoid traffic jams, increase transaction speed, and gain a competitive edge. It is important to note that switching RPC nodes does not necessarily reduce gas fees. RPC solves the problem of access to the blockchain rather than addressing the overall performance and cost issues of the entire chain.

What are some commonly used public RPC nodes for Ethereum?

  • https://mainnet.infura.io - Infura provides hosted node services for Ethereum and IPFS, offering RPC nodes for both the Ethereum mainnet and test networks.
  • https://eth-mainnet.alchemyapi.io/v2/{API_KEY} - Alchemy offers an Ethereum mainnet RPC node, with a private API key available upon request.
  • https://eth.rpc.tor.us - Torus manages an Ethereum mainnet RPC node.
  • https://rpc.ankr.com/eth - Ankr provides an ETH mainnet RPC node. Their paid version also supports the WebSocket protocol.
These nodes are all operated by reputable and secure vendors, like Cloudflare. They leverage service scheduling and edge computing networks to achieve faster, more localized access to the ETH network, facilitating transactions. When choosing a node, I typically run speed tests on all options and pick the one with the lowest latency. It's worth noting that nodes requiring API key applications, such as Alchemy, often have fewer access requests than their counterparts. This can result in improved speed.

挖Kaspa应该选哪家矿池

2023年3月3日 08:00
Kaspa最近几天的涨势可以用超乎寻常来形容,真的是涨疯了!不少老矿工也因为这一波涨势,准备再次开机开挖,为区块链的建设添砖添瓦(开机!加卡!电表转的飞快!国家电网合作伙伴!)。附图是今天在miningpoolstat上的PoW Token热度截图,目前Kaspa已经进入矿币排行的前20 13,且算力还在不断的上涨中,截至目前,网络总算力491.97 Th/s700.71 TH/s,相比上次文章内容更新,网络总算力又上升了将近10%, 难度(Difficulty) 491.83 T 748.08 T,综合来说算是为数不多能够正收益的PoW加密货币(也就是矿币)。我也是第一次简单难度比算力还高的情况。球球各位大佬别卷了呜呜呜,孩子连矿渣都挖不到了。
Nvidia RTX 3070显卡,日收益为$0.32;
Nvidia RTX 4080显卡,日收益为$0.65;
矿老板们最爱的AMD R580,日收益$0.09。
虽然比不上巅峰时期的ETH,但是也算是正收益,终于可以打开矿机了。但依旧提示不要盲目投资,当心血本无归。
我已经卖飞了。全仓卖飞。
notion image

📝 主旨内容

在矿池的选择上,首先考虑到我与看到这篇文章的您,可能都处于东亚地区,所以以是否具有东亚的节点(例如香港、新加坡、韩国等等)作为一个重要的考虑因素,同时结合矿池总算力、矿池最低付款门槛、手续费等进行综合。
在挖矿所使用的Proxy(代理)上,可以参考TAG Internet
 

支持KASPA的矿池列表

矿池名称
手续费
起付门槛
目前算力
是否有亚洲节点
SSL
图标
1 %PPLNS
100
48.80 TH/s
支持
0.9 %PROP 0.9 %SOLO
1
36.37 TH/s
有(香港、韩国)
支持
0.8 %PPLNS
100
34.78 TH/s
有(香港)
支持
0.8 %PPLNS
100
10.71 TH/s
未知
1 %PPLNS
100
6.77 TH/s
不支持
0.75 %PPLNS 0.75 %SOLO
100
4.99 TH/s
支持
f2pool.com(鱼池)
1 %PPLNS
未知
3.96 TH/s
支持
1 %PPS+
100
3.41 TH/s
未知
gpumine.org(已跑路)
1 %PPS+
30
1.69 TH/s
未知
1 %PPLNS 1 %PPS
10
1.38 TH/s
未知
我现在在使用的是acc-pool的香港节点,延迟控制在40ms(accepted 41ms)左右。
最后,强烈建议不要!不要!不要!使用woolypooly矿池,这家矿池偷算力基本上已经在业界臭名昭著了,请注意。
The LARGEST POOL FRAUD in the history! WOOLY POOLY!

🤗 总结归纳

  • Kaspa 网络算力显著增长,目前总算力达到 700.71 TH/s,难度为 748.08 T。
  • 矿池选择考虑因素:东亚节点可用性、总算力、最低付款门槛和手续费。
  • 强烈建议避免使用 woolypooly 矿池,因其存在偷算力问题。
  • 推荐的交易所为 Gate.io 和 MEXC,用于 Kaspa 交易和出金。

📎 更新

f2pool(鱼池)已开始支持kaspa挖矿
软件及程序参考:Kaspa挖矿软件
在交易出金方面,Kaspa推荐的交易所为:芝麻开门(Gate.io)和抹茶(MEXC)。其他不入流的小交易所不建议使用。
 
💡
有关Kaspa挖矿上的问题,欢迎您在底部评论区留言,一起交流~
 

新矿工初入DEFI的必备工具

2022年2月12日 08:00
😀
不少新矿工是趁着这波动物币的热潮,才进入到了DEFI领域,开始接触区块链、DEFI、DEX(去中心化交易所)、以及流动性挖矿等等。由于DEX本身的特点,以及目前还处于发展阶段,功能性相比CEX(中心化交易所,例如币安等等)有所欠缺。下面就列出一些我自己常用的工具。工欲善其事必先利其器。

1. 钱包

钱包顾名思义就是存取代币的地方,在DEFI领域中,钱包是一切的基础,有钱包才存在支付的可能,也就才有后续各种智能合约的执行。
以上是我在使用的两款,Trust Wallet为App,MetaMask是Chrome插件,用在PC上,现在也提供了手机版本的App。 同在交易所的钱包相比,这两者区别于在中心化交易所的钱包仅仅是余额,而参与DEFI是需要一个自己的钱包的,这个钱包也可以称为冷钱包。

2. 交易

与CEX(中心化交易所)不同,DEX并没有审核上所的规范,也就是DEX上可以买到任何在链上发行的代币,这些代币中可能有蕴含百倍的可能,也可以只是一缕空气。
DEFI中所有的交易,都需要通过DEX进行,BSC链上为PancakeSwap、BakerySwap、ApeSwap, ETH链上位Uniswap、SushiSwap、1inch, HECO上为MEDX。其他类似SOL链的DEX也在蓬勃的发展中(截至到现在,sol上也已经有很多家dex在提供服务,更多的公链也不断的在完善在dex领域的布局)。

3. 链上记录查询

加密货币的交易都是有迹可循的,通过地址、或者hash就可以查找到对应的交易记录,公开且透明

4. 图表

由于DEX并不提供交易的价格趋势表,所以需要通过第三方的图表来进行价格的监控
Bog:BoggedFinance - Part of the BogTools Ecosystem (能够查看Ape池的代币价格)

5. 流动性挖矿/质押挖矿管理

矿工们往往是趋利的,并且不会将所有的代币放在一个Yield池子中。同时当代币用于提供流动性,或质押挖矿的时候,钱包里是看不到的,所以就需要一款工具能够查看分布于不同Yield池子里面的质押情况以及收益情况。
0xtracker:0xTracker | Hellonext(链接已失效)
BSC & ETH & Polygon打赏地址:
0x026C3c919A70F4d08518Fc4f637A28260901C57c

6. 浏览器

浏览器推荐Brave或者Microsoft Edge,无论如何也得是Chromium核心的浏览器,这样才可以方便安装Metamask等等插件。但是不建议使用国产的360浏览器等。
同时由于部分撸空投需要隐藏或者擦除指纹,类似的WebRTC插件只有Chromium浏览器可以安装,所以还是推荐这些。
此为以前旧文,由于知乎的审核政策,所以迁移至自己的博客。
 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

探索Polygon网络的公共RPC节点

2022年1月18日 08:00
😀
本文推荐多个可靠的Polygon主网RPC地址,包括MaticVigil、Polygon官方等提供的节点,从而可以选择延迟最低的RPC服务器加速交易。了解如何安全且高效地与Polygon区块链交互,适合开发者和加密货币爱好者阅读。
 

📝 主旨内容

 
Polygon是一个基于以太坊的可扩展Layer 2解决方案,通过增加网络吞吐量和降低交易费用来提高以太坊网络的性能。今天为大家推荐一些常见的Polygon公共RPC地址:
  1. https://rpc-mainnet.maticvigil.com - MaticVigil提供的Polygon主网RPC节点。
  1. https://polygon-rpc.com - Polygon官方提供的Polygon主网RPC节点。
  1. https://rpc-mainnet.matic.network - Matic Network提供的Polygon主网RPC节点。
  1. https://matic-mainnet.chainstacklabs.com - Chainstack Labs提供的Polygon主网RPC节点。
  1. https://rpc-mainnet.moonbeam.network - Moonbeam Network提供的Polygon主网RPC节点。
  1. https://matic-mainnet-full-rpc.bwarelabs.com - BwareLabs提供的Polygon主网RPC节点,目前已迁移到Blast使用。
  1. https://rpc-mainnet.matic.quiknode.pro - QuikNode提供的Polygon主网RPC节点。
  1. https://rpc-mainnet.maticvigil.com/v1/{your-api-key} - MaticVigil提供的Polygon主网RPC节点,需要申请私有api key。
  1. https://rpc-mainnet.matic.network/v1/{your-api-key} - Matic Network提供的Polygon主网RPC节点,需要申请私有 api key。
  1. https://matic-mainnet-archive-rpc.bwarelabs.com - BwareLabs提供的Polygon主网归档RPC节点,目前已迁移到Blast使用。
  1. https://polygon-rpc.com/ - Ankr提供的Polygon主网RPC节点
这些公共RPC地址可以用于与Polygon网络进行交互,例如获取区块链数据、广播交易等。使用公共RPC地址时,要注意请求来源和数据安全性。建议开发人员在生产环境中使用自己的节点或者受信任的第三方节点服务。
 

📝 英文版本

 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

【Horace And Pete】百年酒馆 第一季 1080P 阿里云

2020年10月1日 08:00
😀
《Horace and Pete》(百年酒馆)是一部美国电视剧,由作家和演员Louis C.K.编剧、导演和主演。这部剧集讲述了两兄弟Horace和Pete经营的一家酒吧的故事,这家酒吧一直由他们的祖先经营,传至两人,已经百年。剧集主要探讨了家族之间的复杂关系、社会经济阶层的问题、政治失望和文化变迁。这是一部种类独特、定位明确、电视现实主义剧集,令很多观众反思人生和生活。
 

📝 剧集介绍

 
《Horace and Pete》(百年酒馆)展示了当代社会的一些阴暗面和问题,比如家庭问题、政治失望、社会经济阶层的差异等等。它的情节和人物都非常真实,关注的是生活中的细节和琐事,让人产生一种压抑和沉重的感觉。此外,这部剧还有很多悲剧元素,角色面临的是一些遭遇和困境,比如精神疾病、家庭暴力、性侵等问题,这些情节会让观众感到非常的悲伤和绝望。因此,看完这部剧可能会让人感到很沉重。
《Horace and Pete》(百年酒馆)在荧屏上的表现和创新得到了大多数评论家的好评,并吸引了数千名观众。尽管没有受到多少主流媒体和工会的认可和奖励,但剧集仍然斩获了一些国内和国际荣誉,包括:
  1. 2017美国影视艺术与科学学院奖 - 突出原创短剧的一般杰出表演
  1. 2017 Writers Guild America奖 - 最佳短剧系列剧本
  1. 2017Online Film Critics Society奖 - 最佳短剧系列
  1. 2017隐形画廊最佳网剧
虽然荣誉与奖项相对较少,但这并不影响《Horace and Pete》成为一部经典影视作品,获得广泛的认可。
这也是我最喜欢的一部美剧。
为什么不用Torrent做种方式?因为我的上传带宽都给了网心云。

元数据信息

IMDB评分:8.4/10
IMDB编号:tt5425186
TVDB编号:309765
豆瓣:26719562
类型: 剧情 / 喜剧
制片国家/地区: 美国
语言: 英语
首播: 2016-01-30(美国)
集数: 10
单集片长: 67分钟
又名: Horace & Pete
该剧共有10集,每一集的时长不同。最短的一集为30分钟,最长的一集为67分钟。该剧的首播日期是2016年1月30日。
该剧的主演包括:Louis C.K.、Steve Buscemi、Edie Falco、Alan Alda、Jessica Lange 等(路易·C·K / 史蒂夫·布西密 / 埃迪·法可 / 史蒂夫·赖特 / 阿伦·阿尔达 / 杰西卡·兰格 / 艾迪·布莱恩特 / Kurt Metzger / 丽贝卡·豪尔)。
 
 

云服务器(VPS)购买之后的防火墙配置

2024年9月4日 08:00
😀
炭云煤老板买了一台香港云服务器,用来放tiny-tiny-rss、监控面板还有跑一些Docker服务,主要用于监控一下家里OpenWRT的主路由和旁路由这些网络状态,速度稳定性什么的都OK,就是网页功能不提供防火墙配置的相关选项,我安装的系统是Ubuntu 22.04,还使用的是iptables ,我也还懂一点点,搞一些基础的防火墙规则配置还是没问题的。那就自己上手弄一下配置吧。

📝 IPv4规则配置

首先建议先使用iptables -L查看已有规则,确保不会和已有规则形成冲突。同时防火墙规则配置建议按照顺序进行,先进行本地配置,再进行放行端口配置,最后进行全局配置,避免iptables规则配置到一半登不进服务器的情况。

允许本地回环接口

允许 lo 接口的流量,本地回环的流量是系统自身的通信,不应被阻止。

允许已建立的连接

允许已建立和相关的连接继续通过,以便服务器正常处理响应流量

允许特定服务端口

允许你需要的服务端口流量,如 SSH、HTTP/HTTPS、DNS 等。具体端口按需要的顺序添加。

SSH

如果你已经在sshd_config中修改了SSH的监听端口,那下面的22修改成你自己配置的端口

HTTP(80)和HTTPS(443)

基础访问流量

Tinny Tinny RSS (181)

DNS

如果你在云服务器上需要搭建DNS服务器,那么建议放行。如果没有这个计划,那不添加DNS端口规则也可以。

ICMP (Ping)

允许ICMP流量,用于服务器可用性检测。

限制SSH登录尝试

添加限制SSH登录尝试的规则,保护服务器免受暴力攻击。目前配置的3分钟5次(1分钟1次也很棒了)。

日志记录和丢弃其他流量

添加日志记录规则,并丢弃所有其他未明确允许的流量。

设置默认策略

所有规则添加完成后,设置默认策略为丢弃未匹配到的输入流量和转发流量,允许输出流量。这个步骤通常放在规则之后是为了避免在规则设置过程中意外中断服务。

规则保存

我使用的是Ubuntu系统,在不想使用iptables-saveiptabels-restore的情况下,希望每次系统重启可以自动加载已经配置好的规则,所以需要使用iptables-persistent

📝 IPv6规则配置

因为云服务器也有分配IPv6地址,我在平常也更倾向使用IPv6,所以IPv6的iptables防火墙规则也需要进行配置。具体与IPv4的规则配置基本相同,配置使用的命令由iptables更换为ip6tables

允许本地回环接口

允许 lo 接口的流量,本地回环的流量是系统自身的通信,不应被阻止。

允许已建立的连接

允许已建立和相关的连接继续通过,以便服务器正常处理响应流量

允许特定服务端口

允许你需要的服务端口流量,如SSH、HTTP/HTTPS、DNS等。具体端口按需要的顺序添加。

SSH

如果你已经在sshd_config中修改了SSH的监听端口,那下面的22修改成你自己配置的端口

HTTP(80)和HTTPS(443)

基础访问流量

Tinny Tinny RSS(181)

DNS

如果你在云服务器上需要搭建DNS服务器,那么建议放行。如果没有这个计划,那不添加DNS端口规则也可以。

ICMP(Ping)

允许ICMP流量,用于服务器可用性检测。

限制SSH登录尝试

添加限制SSH登录尝试的规则,保护服务器免受暴力攻击。这里建议如果有修改sshd_config的SSH服务监听端口的话,修改后的端口和原22端口都添加限制登录尝试规则,扫22端口的没有好人。

日志记录和丢弃其他流量

添加日志记录规则,并丢弃所有其他未明确允许的流量。

设置默认策略

所有规则添加完成后,设置默认策略为丢弃未匹配到的输入流量和转发流量,允许输出流量。这个步骤通常放在规则之后是为了避免在规则设置过程中意外中断服务。

规则保存

我使用的是Ubuntu系统,在不想使用iptables-saveiptabels-restore的情况下,希望每次系统重启可以自动加载已经配置好的规则,并且支持IPv4和IPv6的规则。以上这些需求,通过iptables-persistent可以实现。
安装过程中的提示全部Yes。 进行已配置规则保存:
检查是否成功加载:

📎 参考文章

 
💡
有关云服务器(VPS)安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

在Steam Deck上玩国服最终幻想14

2021年7月2日 08:00
😀
XIVLauncherCN是一个针对《最终幻想14》国服玩家定制的启动器(Launcher),可以快速、便捷地启动游戏、管理插件(addons)和进行路径设置。该软件由一名中国玩家开发,旨在改善FF14国服玩家在游戏启动、插件管理等方面的体验。通过XIVLauncherCN,可以绕过最终幻想14的国服官方启动器,从而实现在Steam Deck上尽情畅玩FF14。同时FF14本身对手柄的优化也极其良好,不少UP主也尝试并通过了使用手柄通关高难本。
XIVLauncherCN提供了多种崭新的功能,如安装插件时的模块化界面、插件备份和恢复功能以及在自定义路径下安装游戏等。此外,该软件也带有常见插件的中文版,可满足广大玩家在使用插件时的语言需求。

安装步骤:

准备工作

切换到桌面模式
按住电源按钮。 选择“切换到桌面模式”

安装 XIVLauncherCN

请打开“Discover Store”,搜索“XIVLauncherCN”,然后进行安装。
如果您希望将Final Fantasy XIV安装于您的Deck的MicroSD卡或默认以外的其他文件夹 (~/.xlcore_cn/ffxiv),则需要下载Discover Store中的Flatseal(可选)。

拷贝国服游戏文件

鉴于盛趣已经删除了前期的游戏补丁,因此启动器并不能从头开始下载游戏。因而我们建议您通过各种其他的途径下载国服游戏文件,并将其转移到Steam Deck中。

添加非 Steam 游戏

通过在Steam桌面模式中选择“添加游戏”,向下滚动并单击XIVLauncherCN复选框,随后单击“添加所选程序”来加入Steam游戏库中。为了使国服启动器正常运行并下载登陆二维码,您必须将XIVLauncher的“启动目录”替换为一个具备写入权限的目录,如:/home/deck或者任何一个非只读目录。
同时,请注意将XIVLauncher的“启动选项”替换为以下语句:
然而需要注意的是 - 在这个特定的 XIVlLauncher 配置下,Valve 并没有提供更安全的密码存储方式,所以它会将您的密码存储于 Steam Deck 中。如果您对此有质疑,请减掉上述语句中的"XL_SECRET_PROVIDER=FILE"。这样一来,XIVLauncher 便无法保存您的密码,但仍能运转。
请勿为XIVLauncher设置兼容模式。XIVLauncher是本地的Linux应用程序,在其上开启兼容模式将会破坏其基本功能。

允许外部文件夹访问 XIVLauncher

请运行 Flatseal, 在左侧边栏,向下滚动,并找到XIVLauncherCN。在窗口的主要部分中,向下滚动至“文件系统”选项板块。请点击场景右侧“其他文件夹”的文件夹图标,并输入您所安装最终幻想 XIV 的安装路径。默认情况下,MicroSD 的安装路径应该为/run/media/mmcblk0p1。
在此之后,一定要将启动目录更改为可访问的目录。

切换到游戏模式

请在桌面上点击“返回游戏模式”按钮。

第一次设置/运行游戏

要在Steam中运行XIVLauncherCN,请首先打开Steam。然后启动XIVLauncherCN,点击左下角的齿轮图标以设置游戏数据路径以及Dalamud注入相关设置。在确保您做出更改后,请单击确认按钮。接着,输入您的用户名,点击登录按钮,在弹出窗口中完成二维码扫描,并启动XIVLauncher以更新游戏。
出现窗口提示时,请点击“Steam”按钮,并选择“FINAL FANTASY XIV Online Free Trial”选项。稍等片刻后,最终幻想 XIV 国服就在Steam Deck上成功运行啦!!

最后

折腾完之后,登录上去看看,就可以关机了。 游戏阳痿是没救的。
 

📎 参考文章

 
 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

同步豆瓣RSS到Twitter(X.com)的另一个方案:Dlvr.it

2023年8月15日 08:00

背景

notion image
💡
IFTTT在今年5月份的时候,把Twitter的同步部分功能加入到了会员清单里面,只允许Premium会员使用,不再免费开放,这造成我从5月份开始的读书、看电影和听音乐的内容无法再从豆瓣通过RSS的方式发送到Twitter(也许现在应该叫X,该死的马斯克)。
我大概是在7月份才发现这个问题,所以开始在Google上寻找各种IFTTT的替代品。基于豆瓣提供RSS的前提,以及自己的自身需要等情况,选择基于以下标准:
  • 免费:我的对自动化的需求仅停留在同步豆瓣的内容到Twitter,并不需要其他功能,所以我希望在花费上尽可能的免费。
  • 支持RSS → Twitter同步
  • 同步频率:最低限度每日一次
  • 非山寨厂商:由于需要Twitter账户的授权,所以我希望是一个尽可能可靠的服务商,从而避免对我的Twitter账户的滥用。
  • 尽量的操作简单
期间,我大概尝试了Microsoft的Automate、Make、Zapier等等,均无法直接或间接满足以上的需求。但是最终,我找到了dlvr.it

Dlvr.it配置同步RSS至Twitter

notion image
豆瓣提供RSS的方式输出动态信息,而在同步至Twitter的过程中,也是需要RSS。Dlvr.it恰巧就支持Website Feed。
notion image
在选择Website Feed之后,填入我们在豆瓣的rss地址,在Dlvr.it获取到feed信息之后,点击Connect,然后点击POST SETTING进入发布绑定页面。
notion image
在发布绑定页面可以编辑feed的名称,同步更新的时间(这个选择Share Immediately,也就是feed更新后立即发布),以及第一篇发什么(这个默认就可以),然后就可以进入到账户绑定页面。
notion image
点击Connect New即可进行Twitter账户的选择绑定,同时也支持Mastodon账户、Facebook账户、Instagram账户等等的绑定。

支持的社交媒体账户

Dlvr.it对目前的大多数热门社会化媒体账户都有支持,以下是可以进行绑定的列表:
  • Facebook
  • Threads
  • Pinterest
  • Linedin
  • Google Business Profile
  • Bluesky
  • Instagram
  • Tiktok
  • Reddit
  • Wordpress
  • Tumblr
  • Blogger
  • Discord
  • Mastodon
  • Feed
  • Slack
  • StockTwits
  • Nextdoor
上面标注加粗的都是我目前在用的服务。

Dlvr.it的价格

最重要的!最重要的!是免费的!
免费版支持2个社交账户,每个月最多发送50条同步信息,可以添加3个feed,feed的更新时间是3个小时。
当然也有收费的套餐,但是免费版本已经足够我们进行日常的同步使用。

2024年12月30日更新

目前dlvr.it免费版已经无法同步Twitter,但是通过Pipedream可以解决,具体可见:🐦使用Pipedream同步RSS至Twitter(X.com)
 
 
 

面向PageSpeed Insights的WordPress优化

2022年8月19日 08:00
😀
Does not use passive listeners to improve scrolling performance;本文介绍了如何针对Google的PageSpeed Insights工具优化WordPress网站性能。文章涵盖包括使用被动事件监听器改善滚动性能、优化最大内容绘制图像的加载、使用新一代图片格式如WebP、改善链接和按钮的可访问性等优化方案。

📝 WordPress优化内容

最近在使用Google提供的PageSpeed Insights(Lighthouse)进行WordPress的优化,希望在网页的访问速度以及访问体验上,能够做到更好。同时也发现不少坑可以填,也改变了我一些关于写博客的想法,这篇文章就主要用来记录填坑的记录。目前我在使用的WordPress版本为6.1.1版本。目前的优化情况如下:
notion image
总体来说情况还不错。但是在使用Google Adsense的Auto Ads之后,Performance表现分数有所下降,在将Auto Ads的<script>放在footer之后,依旧会存在js加载耗时长以及CLS偏移问题,之后一段时间的重心就放在如何优化Google Adsense的代码以及Google Fonts字体上。另外值得注意的是,在浏览器的开发者工具中,使用lighthouse所得的分数,相比PageSpeed Insights会高,最终应该是以PageSpeed Insights为准,毕竟更接近Google以及搜索引擎的视角。造成这种情况的原因是,Lighthouse使用的是自己网络与设备,相对来说网络情况与设备性能都会更好,而PageSpeed Insights所使用的是平均情况下的网络情况与设备,例如3G网络和模拟比较古早的移动设备性能,这也更贴合日常用户访问时所使用的网络与设备性能。
单纯在系统层面与网络的层面的优化就不在本篇文章里面进行叙述了,例如使用CDN内容分发网络进行加速,使用Redis等持久化缓存,通过sysctl.conf优化服务器吞吐性能,以及nginx优化等等。以下的操作内容,在完成代码修改之后,记得清空WordPress以及Cloudflare的缓存后再重新进行跑分,避免缓存影响。Cloudflare的清空缓存位置位于:
今天我们就面向PageSpeed Insights优化!

1. Does not use passive listeners to improve scrolling performance

这种情况一方面是因为在Cloudflare打开了Rocket Loader的功能(因为我在使用Cloudflare的CDN提供网站的加速)。可以在Speed选项卡中关掉。
Quote:
So that notice is being triggered for the Cloudflare Rocket Loader feature - you can disable this in the Speed tab of your Cloudflare dashboard.
另一方面,这个问题也来源于WordPress的自带评论功能存在移动端访问的缺陷,没有使用Passive Listeners。通过将如下代码添加至主题的js文件中可以解决,代码已经经过压缩:
但是需要注意,修复这个问题后,评分并不会上升,仅仅是减少一个红色报错。

2. Largest contentful paint image was lazily loaded.

一般这种问题都是出现在首页中的banner图,或者首页的轮播图。通过使用浏览器开发者工具,对主题代码定位,可以找到对应的图片使用了loading= “lazy”标签。解决方式也很简单,对引用图片the_post_thumbnail()的funtion添加指定loading参数,这样既可以不完全关闭WordPress默认的lazy加载策略,又可以让首屏大图直接进行加载。
代码的意思就是在调用文章缩略图的同时,赋予loading一个空值,替代WordPress默认提供的lazy值。

3. Serve images in next-gen formats

一般PageSpeed Insights的这个提示,都是由于使用了png、jpg、jpeg、bmp等旧格式图片,需要将图片格式修改为.webp格式。
也就是需要将网站所使用的传统png、jpg、jpeg、gif等格式图片,更换为.webp或者.avif格式文件,因为后面两者能够提供更好的压缩率以及更好的质量,从而缩小整体页面大小,提高加载速度。
什么是WebP格式:
WebP是一种同时提供失真与无失真压缩的图片档案格式,目的在于减少图片的档案大小、提高图片档案在网路上的传送时间,但同时又能和JPG与PNG等格式相同的图片品质。根据维基百科的资料显示,WebP的档案大小比PNG档少了45%,即使PNG档已经使用压缩工具进行压缩处理过,WrbP仍可以减少28%的档案大小。
notion image
转换格式的事情,我们通过插件解决。我现在在使用的是Plus WebP这个插件,可以通过ajax批量将已经上传媒体库的图片进行格式转换,同时支持质量选择,并替换掉旧文章中的媒体链接,而且难能可贵的是,没有花哨的界面,也不收费。
当然,Smush也是一个不错的选择。

4. Links do not have a discernible name

这个问题不是Performance(性能)问题,是一个Accessibility(易用性)问题,原因在于对于部分链接,未添加有效的说明。
通过PageSpeed Insights查看出现问题的<a href=""></a>的位置,定位之后,在<a>标签内增加:

5. Buttons Do Not Have Accessible Names

同样是一个Accessibility(易用性)问题,原因在于对于<button>,也就是按钮没有进行有效的描述。
通过PageSpeed Insights查看出现问题的<button></button>的位置,定位之后,在<button>标签内增加:

6. Serve static assets with an efficient cache policy

这个问题是由于缓存策略引起的,每个站点的缓存策略不同,处理方式也不同。但是需要注意,修复这个问题后,评分并不会上升。
例如在Moby这里,缓存的时间是由Cloudflare进行控制,那么就需要在Cloudflare的控制台中进行缓存时间(TTL)的修改。不用担心修改后无法及时更新内容,这个缓存策略主要是针对字体等静态内容。
具体位置:Caching - Configuration - Browser Cache TTL
在缓存时间的选择上,目前最低选择5天的情况下,是不会在PageSpeed Insights报错。
同时,在网站运行趋于稳定之后,对CSS以及JS修改减少,5天的缓存期也不会影响网站或博客的样式呈现。如果真的需要修改CSS样式或者JS,那么完成之后记得在Cloudflare清空一次缓存。

7. <code></code>标签内容太长,CSS不折行或样式错误问题

我在修改整个主题的过程中,发现code标签存在样式错误的问题。解决办法为找到<code>对应的样式,增加:

8. 尽量不要使用Google Adsense的Auto ads

Google Adsense的Auto Ads会主动在页面中插入更多JavaScript脚本,可能导致页面加载时间增加,尤其是在低端设备和网络环境下。而Google将页面速度纳入排名因素,如果广告脚本延迟了主要内容(如文本或图片)的加载,可能对SEO产生负面影响。同时,若Auto Ads导致交互延迟(如CLS 累积布局偏移、FID 输入延迟),可能影响页面在搜索结果中的排名。
周末时候,我需要抽出一些时间重新规划一下Google Adsense的位置。自动广告很简单,但是会严重影响页面的加载速度以及页面偏移量,体验非常差。

📝 WordPress优化总结

这篇文章写于我还是使用WordPress的时期,现在我已经将博客迁移到了NotionNext,并且也做了一定的优化,具体优化内容可以参考:
 

OpenWRT限速插件推荐:QoS Mate

2024年9月19日 08:00
😀
OpenWRT上的Qos插件并不算太多,相对知名的有luci-app-sqm和OpenWRT官方的tc,今天为大家介绍一款OpenWRT新的Qos插件:QosMate
Qos插件的主要作用是管理局域网与公网之间的网络流量,通过不同的算法,对不同的流量分配优先级,从而提高整体的网络性能。在我这种长期上下行跑满的网络环境下(BT、PCDN等等),如果不想因为上传或下载服务影响到家庭网络日常的使用,例如打游戏、观看流媒体等等,配置Qos还是有很大的必要。

📝 QosMate介绍

QosMate是最近在OpenWRT论坛上新发布的一个OpenWRT插件,支持几乎全部OpenWRT架构,不论是X86mipsel_24kcarm_cortex-a9还是arm_cortex-a7。同时由于QosMate作者已经提供了二进制的运行文件,所以也不需要预编译或重新编译固件安装,在安装上来说,已经是很方便了。

算法支持

QoSMate提供了两种队列调度算法供用户选择:HFSC(分层公平服务曲线)和CAKE(Common Applications Kept Enhanced)。
  • HFSC:适用于需要精细控制不同类型流量的环境。它通过分层调度来确保实时应用(如在线游戏、VoIP)的带宽优先分配。
  • CAKE:CAKE算法应该是大多数人都熟悉的一种算法,专为简化和优化家庭网络而设计,具有自动调整网络带宽的功能,帮助减少延迟问题,尤其是当多设备同时连接网络时。

插件自动配置

QoSMate提供了自动设置选项,通过自动速度测试来分析用户的网络情况并根据测试结果进行相应的调整。用户可以简单地点击“自动设置”,QoSMate会自动计算最佳的下载和上传速率,并根据实际网络带宽调整流量分配。同时,还允许用户输入游戏设备的IP地址,以确保游戏流量得到优先处理,这对需要低延迟的应用尤为有利。

游戏流量优化

除了自动配置功能,QoSMate还专门提供了针对游戏的流量优化选项。通过设置特定的队列调度算法(如pfifofq_codel),确保游戏数据包在传输中享有低延迟的优先级,从而提高在线游戏的流畅度,降低延迟和丢包。

与SQM对比

在讨论QoS管理时,不得不提到另一个常见的OpenWRT插件——SQM(Smart Queue Management)。作为广泛应用的插件,SQM 也能很好地管理家庭网络流量。QoSMate与SQM的功能对比如下:
特性
QoSMate
SQM
调度算法
支持HFSC和CAKE
主要支持CAKE和fq_codel
自动配置功能
支持,自动测速并根据结果进行限速及优先级配置
无自动测速功能,需要手动设置带宽限速
游戏优化
提供专门的游戏流量优化,支持手动指定设备优先级
无专门的游戏优化功能,主要依赖 CAKE 调度
灵活性
提供更多高级配置选项,适合有网络管理经验的用户
配置简单,适合普通用户
使用界面
配置更复杂,提供更精细的控制
界面简洁易用
QoSMate提供了比SQM更加灵活的网络流量管理功能,特别是针对游戏流量的优化能力,使其非常适合对网络质量有更高要求的用户。同时QosMate可以进行自动测速及自动配置,降低Qos插件的使用门槛。

📝 QosMate安装方法

QosMate目前并没有提供*.ipk 的包安装方式,无法通过opkg直接进行安装,需要通过SSH在终端进行安装。

安装须知

在安装QoSMate之前,请确保:
  1. 已禁用并停止任何现有的QoS服务或脚本(如SQM、Qosify、DSCPCLASSIFY、SimpleHFSCgamerscript等),以避免冲突。
  1. 重新启动路由器,以清除旧设置,确保一个干净的启动环境。
  1. Qos插件需安装在主路由上,即直接与外网进行连接的拨号路由。在旁路由或旁路网关上安装没有作用,同时如果使用硬件加速情况下,可能存在无法精确控制的情况。
  1. 使用更为贴近官方OpenWRT固件的版本,例如ImmortalWRT。选择固件可以参考《2025年国内OpenWRT主流固件对比 | Deep Router

QosMate后端执行文件安装

使用以下命令安装QoSmate后端(其中包含主脚本/初始化脚本/hotplug和配置文件):
 
如果无法正常连接raw.githubusercontent.com ,可使用下面命令安装,或替换为可使用的其他CDN:

Luci前端控制页面安装

与我们熟悉的其他OpenWRT插件安装方式不同,QosMate的前端UI控制界面安装是通过在/www/luci-static/resources/view文件夹下直接建立目录及页面文件方式安装,没有使用*.ipk的包安装方式,个人猜测可能是作者不想编译OpenWRT各种架构的软件包,但不一定对。
 
如果无法正常连接raw.githubusercontent.com ,可使用下面命令安装:

🤗 QosMate使用指南

安装后,通过下面的命令启动QoSmate服务:
或者,通过OpenWRT的Luci控制页面的方式进行使用。
  • 访问OpenWRT的LuCI控制网页界面,并打开网络 - QoSmate
notion image
  • 配置基本设置。对于基础配置,调整以下关键参数:
    • WAN接口:选择你的 WAN接口,一般为wan
    • 下载速度 (kbps):设置为实际下载速度的80%-90%
    • 上传速度 (kbps):设置为实际上传速度的80%-90%
    • 根队列调度算法:选择HFSC(默认)或CAKE
  • 应用更改。

自动配置

如果你更倾向于自动配置,QoSmate提供了自动设置功能:
  1. 在QoSmate设置页面,点击Start Auto Setup
  1. (可选)输入游戏设备的IP地址以优先处理其流量,地址支持IPv4和IPv6。
  1. 等待宽带网络测速和配置完成。
注意:基于路由器的测速可能会低估你的实际网速。为了获得更准确的设置,可以从局域网设备运行测速,例如使用fast.com或者speedtest,并手动输入结果。自动设置为初步配置提供了方便,但为了获得最佳性能,可能需要手动微调。

已知问题

如果通过/etc/init.d/qosmate 命令无法启动QosMate,或者通过Luci控制页面无法启动QosMate,并提示XHR错误,一般是因为raw.githubusercontent.com 在国内无法访问的原因,所以导致连接超时,需要修改/etc/init.d/qosmate 文件:
通过vim 打开/etc/init.d/qosmate ,修改SCRIPT_URLHOTPLUG_SCRIPT_URL 所对应的地址,替换为镜像CDN地址:

📎 参考文章

 
💡
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

Twitter Click'n'Save,Twitter视频下载脚本

2023年3月5日 08:00
📌
最近Twitter上小黄视频那么多,这个脚本你难道不尝试一下,把赛博菩萨们的资源都保存下来。Twitter Click'n'Save 是一个基于油猴脚本(greasyfork)的网页处理工具,主要用于在 Twitter 平台上保存多媒体资料(如视频、图片等)时进行自动化下载保存操作。

🍿 Twitter Click'n'Save介绍

notion image
Twitter Click'n'Save 是一个基于油猴脚本(greasyfork)的网页处理工具,主要用于在 Twitter 平台上保存多媒体资料(如视频、图片等)时进行自动化操作。 通过监测用户在 Twitter 上的点击触发下载推文(Tweet)内的视频或者图片,甚至是gif。特别是对于喜爱Twitter上的图片或视频内容的用户来说,这个工具提供了快速、高效的极为方便的收集和下载方式。而且这个油猴脚本不需要直接与 Twitter API 交互,因此可以确保用户可以安全且不受限制地使用它来下载推文中的多媒体资料。
相比同类脚本,Twitter Click'n'Save的另一个优点是,现在还在更新,其他大部分的脚本由于依赖Twitter的API,目前都处于暂停更新的状态。
同时,这个油猴脚本会让资料以最适当的文件名保存(下载)下来。而且该脚本还会保存Twitter推特视频下载历史,这样你就不用重新下载某个你不需要的多媒体文件了。
最近Twitter上小黄视频那么多,这个脚本你难道不尝试一下?

Twitter Click'n'Save增强功能:

  1. 把推文(Tweets)中的链接直接转化为链接以及在浏览器标题中合并;
  1. 高亮显示已访问的推文(Tweets)链接;
  1. 自动展开“折叠区域”,免除手动点开的麻烦;
  1. 隐藏签名栏、注册攻略、趋势和推荐话题等Twitter界面元素,但是不包括广告。

Twitter Click'n'Save使用方法:

仅需三步即可开始使用推特视频下载油猴插件:
  1. 点击下载按钮(从greasyfork网站下脚本),或直接点击这个链接
  1. 在你的用户脚本管理器(例如TampermonkeyGreasemonkeyViolentmonkey等)中确认安装即可。
  1. 刷新你的Twitter推特页面,然后你会在Tweets推文的视频或者图片左上角看到一个的按钮,点击之后即可下载对应的视频、图片或者GIF。已经下载过的视频或者图片,红色的按钮会变成绿色。

Twitter Click'n'Save下载地址:

Greasyfork下载地址:Twitter Click'n'Save

2025年国内OpenWRT主流固件项目对比

2025年3月7日 08:00
😀
从2018年我开始接触LEDE固件开始,到现在稳定使用ImmortalWRT作为软路由(旁路网关)的生产环境固件,中间也使用过各种OpenWRT的第三方固件。这些固件大多是在官方OpenWRT的基础上进行定制开发,提供更贴合国内用户使用习惯的功能。今天这篇文章,主要是对目前主流的第三方OpenWRT固件进行梳理与介绍,算是一篇OpenWRT入门的文章,提供一些固件选择上的建议。

📝 国内OpenWRT固件开发环境介绍

OpenWRT大概在2017年左右开始进入国内,那个时候OpenWRT还叫LEDE,但都是基于Linux系统内核所开发的路由器系统。OpenWRT在国内的发展,与两个关键词具有强关联关系:科学上网与软路由。科学上网作为部分互联网从业者的刚需,在需求的不断升级下,演变为需要家庭网络的设备均可以通过路由器使用,从而为智能电视、笔记本电脑、iPad等智能终端设备提供翻墙服务,且这一类人的动手能力本身就相对较强。而软路由,作为用户群体庞大的X86架构,天然与OpenWRT适配,在各种虚拟机的加持下,笔记本电脑、NUC等等搭配一个交换机,均可以成为高性能、高扩展性的路由器。
随着LEDE合并至OpenWRT,OpenWRT的开发和版本发布越来越规范化以及软路由设备的性能提升与推陈出新,国内主流的OpenWRT第三方固件也逐渐形成,大多数使用者在选择OpenWRT固件时,更趋向于选择这些知名开发者或团队开发的固件,原因如下:

功能的完善性

国内目前主流的OpenWRT系统固件分支的开发者,基本都处于持续更新状态,对上游OpenWRT的版本更新跟进相对更积极。同时由于OpenWRT官方固件对路由器常用功能的完善,以及软件库的建设,相对来说在高版本的固件中,功能更完善。

系统的稳定性

目前国内主流的OpenWRT开发者或开发团队均在OpenWRT固件开发领域深耕多年,例如大雕Lean的LEDE,从2020年开始开发维护至今;Lienol的OpenWRT固件从2019年开始开发维护至今等等。开发者和团队在OpenWRT系统、硬件驱动等方面的熟悉程度也相对较高,从而固件的稳定程度也更高,较少出现各种离奇的Bug。即便存在Bug,在Github进行反馈后也会即使进行修复。

软件生态的完整性

主流团队所开发的OpenWRT固件基本都有自己固件的opkg软件源,这些固件的软件源均为编译时所产生,同时经过开发者或开发团队的调整与优化,在兼容官方固件软件的同时,也能够提供一些类似科学上网或其他独特的固件加成。
对于通用插件,例如Docker、文件管理、DDNS、内网穿透、FullCone全锥NAT等等,目前主流的固件均可以正常支持,所以这些在下面的对比中,也不再作为独立对比项出现。部分科学上网插件,由于各种原因,未收录于官方OpenWRT软件源中,对于使用OpenWRT官方软件源的固件,由于未编译集成特定依赖(例如kmod-*),可能需要进行编译安装,这在一定程度上增加了固件的使用门槛,所以也会将软件源的丰富程度作为一个衡量指标。

几乎为0的盈利能力

国内的OpenWRT固件开发者基本都是为爱发电,在这方面所能获得的收益无限趋近于零。事实上国内开源开发者在通过开源项目获取的收益一直都不是很乐观,这也是大部分开发者放弃OpenWRT这个开源项目固件开发与维护的原因之一。目前在OpenWRT固件圈子内,主要的盈利与收费方式为:定制编译、闭源驱动固件收费、合作与推广特定硬件软路由等等。

📝 国内主流OpenWRT固件

目前在国内的软路由领域,OpenWRT的固件开发有且仅有以下五个主流的开发者或开发团队:
  • ImmortalWRT
  • Lienol源码固件
  • Lean源码固件
  • iStoreOS固件
  • KWRT固件(原openwrt.ai)
本篇文章的介绍重点也围绕这五个OpenWRT的第三方固件进行展开,对比项也与日常使用、固件安装与插件是否全面更为相关,系统特殊优化部分就不班门弄斧了。其他的第三方固件,类似X-WRT、CatWRT主要用于校园网,基于Lean开源固件,但追求稳定性,经过多所高校学生和开源开发者认证)、BleachWRT、eSir、DD-WRT或者其他恩山论坛的固件等等,或因使用规模较小,或目标使用场景限定,或仅编译添加软件包等,就不包括在这篇固件对比文章中。
在系统架构上,由于我个人使用的架构是X86_64的软路由,所以本片内容更倾向于在X86_64架构下的OpenWRT表现。

📝 ImmortalWRT

notion image
ImmortalWRT,作者1715173329 (Tianling Shen),项目自2020年3月1日开始。项目作为OpenWRT的fork分支,主要为国内用户提供更贴近国内网络情况的OpenWRT固件。
最新版本:ImmortalWRT 24.10,Linux Kernel版本为6.6

ImmortalWRT的优势:

  • 默认配置国内的软件源
  • 默认系统参数优化
  • ImmortalWRT软件源收录一些OpenWRT没有的应用,相对更全,例如Dae、OpenClash等科学上网插件。
  • 替换部分精简版系统软件为完整版(例如dnsmasq-full)
  • 支持opkg在线安装kmod模块
  • 内核跟进更为迅速
  • 提供在线编译与下载选项

ImmortalWRT的缺点:

  • 部分硬件驱动为开源版本,性能与稳定性可能不如闭源的商业版本
  • 软件源对闭源的软件不进行收录
  • 默认固件预分配磁盘空间较小,只有300MB,需要自己手动扩容。

ImmortalWRT的相关地址

IPK软件仓库:ImmortalWrt Downloads

📝 Lienol源码固件

Lienol源码固件,作者Lienol,项目自2019年开始。在硬件支持方面较为广泛,对多种硬路由均有很好的兼容与支持,这也使得对Lienol的当前OpenWRT版本难以确认。
最新版本:OpenWRT 24.10, 最高支持Linux Kernel版本为6.6.79 ,编译后版本默认空间450MB ,后续使用需要自行扩容

Lienol固件的优势:

  • 预置热门插件(例如Passwall、SSR Plus+等,这两个插件也是最早一批在OpenWRT上的师夷长技以制夷插件,预置插件降低使用门槛)
  • 相对OpenWRT官方固件更轻量化,移除非必要组件,适配低配设备,例如硬路由等
  • 传闻更稳定
  • 及时跟进上游OpenWRT官方更新

Lienol固件的缺点:

  • 轻量化及深度定制带来的系统兼容性下降,跨固件安装插件可能存在问题。
  • 定制化门槛较高,无法在线自定义编译固件,需手动自行编译固件。

Lienol的相关地址

📝 Lean源码固件(QWRT+)

Lean源码固件作者为coolsnowwolf (coolsnowwolf),又称大雕LEDE固件,同样是来自恩山论坛的大神。大雕Lean应该是国内很早一批开始做OpenWRT固件的开发者(那时候LEDE还没有合并到OpenWRT分支,大雕是在LEDE的基础上进行开发,大概是在18.0版本之前)。Lean的LEDE项目自2020年5月开始,初期提供了不要OpenWRT的插件,例如luci-app-adbyby、UnblockNeteaseMusicGO等插件,部分插件至今还在发挥作用。目前
最新版本:OpenWRT 24.10,最高支持Linux Kernel版本为6.6.75

Lean源码固件优势

  • 收费固件(QWRT)使用闭源驱动,性能更好,例如MTK系列,经miaoer指正,主要以高通QCA系列为主
  • 早期支持Fullcone NAT、SFE(Shortcut Forwarding Engine)混合加速等
  • 模块化代码结构通过 package/lean 目录提供独立的功能包
  • 第三方衍生版本较多,例如eSir、Sirpdboy等,插件与配置可共享使用。

Lean源码固件缺点

  • 部分使用闭源驱动的固件版本需要购买(QWRT)
  • 轻量化及深度定制带来的系统兼容性下降,跨固件安装插件可能存在问题。
  • 定制化门槛较高,无法在线自定义编译固件,需手动自行编译固件。
  • 版本过多,选择恐惧症。
  • 文档碎片化严重,分散在恩山论坛的各个角落
  • 需要使用OpenWRT官方软件源或镜像软件源

Lean的相关地址

📝 iStoreOS固件

notion image
iStoreOS固件的开发团队来自Koolshare,其目标是将OpenWRT打造为一个轻NAS系统,即在OpenWRT的基础上,通过磁盘与存储相关功能和插件的优化,使软路由具备NAS功能。同时对功能及界面进行优化,对新手软路由用户的体验较好,门槛较低。
最新版本:OpenWRT 22.03.7 (24.10 kernel 6.6目前处于内测阶段)

iStoreOS固件优势

  • 集成软件中心KoolCenter,插件安装门槛进一步降低
  • NAS功能集成,适合有内网存储与传输的用户
  • 功能界面优化,更适合新手入门使用
  • 颜值相对较高
  • 升级时可保留插件
  • 支持在线升级,免刷固件

iStoreOS固件缺点

  • 固件内部分插件闭源
  • 无法在线定制固件
  • 硬路由兼容范围较窄(仅支持ARS2、H6XK、H88K、R2S、R4S、R4SE、R5S、R66S、R68S、R6S、RPI4、RTD1619B、Station P2、T68M、X86_64等)
  • 系统版本落后,对新版本插件可能存在不兼容

iStoreOS相关地址:

Github:iStoreOS

📝 KWRT固件(原kiddin9固件)

notion image
KWRT固件作者kiddin9,最早是开发了OpenWRT的在线编译网站,后续在用户数量增长之后,开始进行第三方固件的开发。
最新版本:OpenWRT 23.05

KWRT固件优势

  • 提供自建软件仓库(软件源),插件数量有保证
  • 提供在线编译及自定义编译
  • 预置配置支持编译时选择,例如伪装成iStoreOS、预置Docker、预置科学上网插件等
  • 支持一键配置旁路由模式,降低旁路由用户使用门槛
  • 支持opkg在线安装k-mod模块

KWRT固件缺点

  • 在线固件编译需要登录,免费账户存在限制
  • 内核版本跟进不及时
  • 开发者较少为系统进行定制优化

KWRT相关地址:

在线编译固件:https://openwrt.ai/

🤗 总结归纳

ImmortalWRT
Lienol源码固件
Lean源码固件(QWRT+)
iStoreOS
KWRT固件(原kiddin9固件)
最新OpenWRT版本
24.10
24.10
24.10
22.03
23.05
最新内核版本
6.6
6.6
6.6
5.15
5.15
在线定制编译(固件选择器)
固件软件源
自建软件源
官方软件源
官方软件源(腾讯云)
自建软件源
自建软件源
kmod模块安装
上游版本跟进
帮助文档
插件数量
丰富
较少
较少
丰富
丰富
付费
免费
免费
闭源驱动版本需付费
免费
定制固件有限额,按需付费
  • 在线定制编译:即固件是否提供在线编译选择器,并提供编译时预装插件选择和预执行脚本配置系统
  • 固件软件源:使用自建软件源还是官方软件源。一般来说,自建软件源的插件数量大于官方软件源,同时在国内的访问情况更好。
  • 上游版本跟进:是否及时跟进OpenWRT官方版本
  • 帮助文档:是否提供帮助手册用于配置OpenWRT系统,或提供Debug手册等。
  • 插件数量:软件源提供的*.ipk 插件数量。当软件源未提供插件的*.ipk文件时,部分情况下需要通过编译来进行安装,麻烦。
  • 付费:是否固件是否收费或付费情况。
综上所述,ImmortalWRT是我最为推荐具有一定动手能力的用户使用的固件,也是我目前在使用的固件。固件系统纯净且稳定,没有乱七八糟的高大全,也就没有了乱七八糟的依赖关系和满目录拉屎的配置文件,同时又提供免费的在线编译与定制化编译软件包,也支持uci-defaults自定义首次运行脚本配置。同时开发者社区也很活跃,有Telegram群组,即便是出现问题解决起来也很快。
个人不太推荐使用恩山论坛的各种高大全固件,作为系统洁癖的我,一方面担心这些开发者编译的固件不够稳定,另一方面也担心系统存在后门。

📎 参考文章

 
💡
有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

OpenWRT路由动态域名解析(DDNS)配置指南|no-ip.com实战教程

2025年2月28日 08:00
😀
DDNS(Dynamic Domain Name System)是动态IP家庭网络实现远程访问的核心技术,旨在解决普通家庭宽带IP地址随机变化的痛点。将你随时变化的公网IP地址(如:58.210.76.123)自动绑定到一个固定域名(如:yourhome.ddns.net),从而可以通过域名直接访问家庭网络,而不用担心因为IPv4地址变化而造成的无法访问。

📝 为什么需要动态域名解析?

当你的家庭网络满足以下条件时,DDNS是在非家庭网络环境下,远程访问家庭内部局域网设备的必备方案:
  1. 从运营商获取动态公共IP地址(非固定IP,也不一定是公网IPv4地址)
  1. 需要远程访问内网设备(如:NAS存储、IP摄像头、WEB服务器)
  1. 主路由器不支持DDNS功能(常见于运营商定制光猫)

📝 网络拓扑示意图


📝 配置三部曲(附具体操作指令)

步骤①:注册域名服务

✅ 推荐选择 no-ip.com 免费套餐。登录后,通过左侧菜单的NO-IP HOSTNAME添加新的动态域名并配置生成DDNS KEY。添加完成域名后,需要记录Username和Password,用于后续在DDNS相关程序中使用。需要注意的是,NO-IP.COM 的IPv4和IPv6动态域名解析是分开的,如果需要双栈解析,需要配置两个动态域名。
notion image
✅ 创建类似yourhome.ddns.net的二级域名,no-ip.com提供了很多二级域名后缀可供选择。

步骤②:OpenWRT软件安装

大部分软件源均有ddns-scripts的安装包,如果你所使用的软件源没有,且无法使用Lucky或者DDNS-GO等替代品,那么也可以参考《OpenWRT 软件源整理》修改OpenWRT的OPKG软件源。
⚠️ 注意:需保持设备联网状态,安装耗时约2分钟;同时,如果需要Luci图形界面,也可以使用Lucky或者DDNS-GO

步骤③:配置文件修改

使用SSH连接后编辑/etc/config/ddns

📝 疑难解答要点

Q:如何验证配置成功? A: 执行日志查看指令:
成功时显示good [你的公网IP]响应
Q:公网IP检测失败怎么办? ✅ 尝试替换ip_url为以下服务:

📝 最佳实践建议

  1. 安全加固:建议开启两步验证生成独立API密码
  1. 端口转发规则:在主路由设置仅限于必要端口
  1. 自动续期:no-ip免费域名需每月登录确认
  1. 备选方案:可同步配置Cloudflare DDNS
  1. IP更新频率限制:多数DDNS限制5分钟/次的更新请求,高频触发会被暂时封禁
  1. 地域性屏蔽风险:部分国外服务商域名(如.ddns.net)可能受区域防火墙干扰
  1. 数据隐私条款:检查服务商的隐私政策,避免监控请求日志(优先选择DuckDNS等开源方案)
  1. 重要服务建议至少配置两个不同提供商的DDNS,通过DNS轮询(Round Robin)实现故障转移,例如主用Dynu+备用ClouDNS。

📝 免费的DDNS服务提供商

服务商
免费域名示例
核心优势
核心限制
适合场景
DuckDNS
xxx.duckdns.org
开源/无需注册/API简洁
仅4个子域名可绑定
树莓派/IoT设备
no-ip.com
xxx.ddns.net
客户端支持广泛/稳定性高
需30天登录验证避免过期
家庭NAS/摄像头监控
Afraid.org
xxx.afraid.org
支持自定义域名/子域名不限量
界面老旧/唤醒邮件可能进垃圾箱
开发者/多设备用户
ClouDNS
xxx.ip-dynamic.com
支持IPv6/流量统计功能
每月需手动激活服务(官网点一次)
IPv6网络环境
Dynu
xxx.dynu.net
Web管理友好/API灵活
域名续期需手动跳转操作
小型企业远程办公
华为云DDNS
需自有域名
国内访问延迟低/解析速度快
需已注册备案域名
中国大陆本地化服务

📎 参考文章

💡
任何配置问题,欢迎在评论区留下你的网络拓扑和使用场景! 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

MikroTik RouterOS 7.18更新内容

2025年2月28日 08:00
😀
MikroTik RouterOS 7.18更新已经出来大概1周多的时间了,我也第一时间(出去游玩回来之后)进行了更新。相比RouterOS 7.17版本,RouterOS 7.18版本的更新日志非常的长,且内容细碎,所以进行了一部分整理。截至到目前,RouterOS 7.18.1版本也已经更新。
notion image

📝 MikroTik RouterOS 7.18更新内容

▍关键功能更新

1. IPv6全面加速

  • L2TP/VXLAN/IPsec全面支持IPv6硬件加速
  • /31 CIDR支持(优化点对点链路子网划分)

2. BTRFS高级存储功能

  • 支持在线调整RAID阵列、子卷快照、数据去重
  • 通过SSH执行btrfs send/receive跨设备同步数据

3. 5G/LTE增强

  • ⚡ 新增eSIM管理(支持动态配置认证)
  • Quectel RG255C-GL等新款工业模组适配
  • 5G CA(载波聚合)信息可视化(需支持模组)

4. 企业级流量管控

改进点
CLI验证命令
SMB多版本兼容性修复
/file/smb/shares print
CAKE QoS智能限速
/queue type/print where name="CAKE"
万级队列稳定性提升
/system resource monitor

5. 硬件芯片级加速

  • CCR2116的IPsec吞吐提升至2.4Mpps
  • CRS354支持VXLAN硬件卸载

6. 容器Container功能优化

  • 修改默认容器镜像变更为https://lscr.io ,避免部分区域Dockerhub无法访问
  • 支持访问容器镜像时使用HTTP重定向(反向代理成为可能)
  • 允许通过 remote-image 属性指定容器镜像地址
  • 默认使用容器根目录的父目录进行解压,使得容器层文件直接下载到目标磁盘

▍关键缺陷修复清单(按风险等级分类)

高危漏洞修复

  • CVE-2024-2983:HTTP API未授权访问(用户管理模块)
  • 无限MAC更新循环:Bridge模块内存泄漏漏洞(v7.17引入)
  • PPPoE服务崩溃:部分Alpine架构设备IPsec异常

业务连续性改进

  1. Safe-Mode增强/system script add name=pre-upgrade source={...}(新增安全模式脚本接口)
  1. 动态DNS容灾/ip cloud set back-to-home-files=yes(新增云端配置恢复)
  1. 硬件兼容性
    • 华为SP570/580网卡驱动支持
    • 修正RB4011默认网口命名冲突

    ▍性能对比实测

    测试设备:CCR2004-16G-2S+
    场景
    7.16.8
    7.18beta6
    提升率
    WireGuard 1K隧道
    78Kpps
    106Kpps
    35%↑
    IPv6 BGP收敛
    420ms
    280ms
    33%↓
    SMB多客户端吞吐
    850Mbps
    1.1Gbps
    29%↑

    ▍升级指南(注意事项)

    1. 强制预检清单
      1. 回滚策略
        • 保留7.16系统镜像:/system backup save name=pre718 exclude=" sensitive-data"
        • 升级后24小时内执行基线性能测试
        1. 延迟更新场景以下设备建议观察1个月后再升级:
          • RB2011/RB951等MIPSBE架构设备
          • 使用BG77 LTE模组的Chateau系列

          ▍典型配置案例

          MLAG高可用集群(新增心跳检测)

          IPv6快速部署模板

          ▍完整更新日志

          *) 60ghz - improved system stability; *) bgp - fixed certain affinity options not working properly; *) bgp - improved system stability when printing BGP advertisements; *) bgp - make NO_ADVERTISE, NO_EXPORT, NO_PEER communities work; *) bond - added transmit hash policies for encapsulated traffic; *) bridge - added MLAG heartbeat property; *) bridge - avoid duplicate VLAN entries with dynamic wifi VLANs; *) bridge - do not reset MLAG peer port on heartbeat timeout (log warning instead); *) bridge - fixed endless MAC update loop (introduced in v7.17); *) bridge - fixed missing S flag on interface configuration changes; *) bridge - improved stability when using MLAG with MSTP (introduced in v7.17); *) bridge - improvements to MLAG host table updates; *) bridge - process more DHCP message types (decline, NAK, inform); *) bridge - removed controller-bridge (CB) and port-extender (PE) support; *) bridge - show VXLAN remote-ip in host table; *) btest - allow limiting access to server by IP address; *) certificate - fixed localized text conversion to UTF-8 on certificate creation; *) chr - fixed limited upgrades for expired instances; *) chr/x86 - added network driver for Huawei SP570/580 NIC; *) chr/x86 - fixed error message on bootup; *) chr/x86 - fixed GRE issues with ice network driver; *) chr/x86 - Realtek r8169 updated driver; *) cloud - added "Back To Home Files" feature; *) cloud,bth - use in-interface matcher for masquerade rule; *) console - added dsv.remap to :serialize command to unpack array of maps from print as-value; *) console - added file-name parameter to :serialize; *) console - allow ISO timezone format in :totime command; *) console - allow tab as dsv delimiter; *) console - allow to toggle script error logging with "/console settings log-script-errors"; *) console - do not autocomplete arguments when match is both exact and ambiguous; *) console - do not show numbering in print follow; *) console - fixed "get" and "proplist" for certain settings; *) console - fixed issue where ping command displays two lines at the same time; *) console - fixed issue with disappearing global variable; *) console - implement scriptable safe-mode commands and safe-mode handler; *) console - improved hints; *) console - log errors within scripts to the system log; *) console - make non-pseudo terminals work with imports; *) console - put !empty sentence when API query returns nothing; *) console - renamed "back-to-home-users" to "back-to-home-user"; *) container - add default registry-url=https://lscr.io; *) container - allow HTTP redirects when accessing container registry; *) container - allow specifying registry using remote-image property; *) container - improved image arch choice; *) container - use parent directory of container root-dir for unpack by default, so that container layer files are downloaded directly on target disk; *) defconf - added IPv6 FastTrack configuration; *) device-mode - do not allow changing CPU frequency if "routerboard" is not allowed by device mode (introduced in v7.17); *) device-mode - fixed feature and mode update via power-reset on PPC devices; *) dhcpv4-client - allow selecting to which routing tables add default route; *) dhcpv4-client - fixed default option export output; *) dhcpv4-server - fixed "active-mac-address" update when client has changed MAC address; *) dhcpv4-server - fixed framed-route removal; *) dhcpv4-server - fixed lease assigning when server address is not bind to server interface (introduced in v7.17); *) dhcpv6-client - added "validate-server-duid" option; *) dhcpv6-client - allow specifying custom DUID; *) dhcpv6-client - do not run script on prefix renewal; *) dhcpv6-relay - added option to create routes for bindings passing through relay; *) dhcpv6-server - respond to client in case of RADIUS reject; *) discovery - advertise IPv6 capabilities based on "Disable IPv6" global setting; *) discovery - improved stability during configuration changes; *) discovery - report actual PSE power-pair with LLDP; *) discovery - use power-via-mdi-short LLDP TLV only on pse-type1 802.3af; *) disk - add disk trim command (/disk format-drive diskx file-system=trim); *) disk - allow to add swap space without container package; *) disk - allow to set only type=raid devices as raid-master; *) disk - cleanup raid members mountpoint, improve default name of file base block-device; *) disk - do not allow adding device in raid when major settings mismatch in superblock and config; *) disk - do not allow configuring empty slot as raid member; *) disk - fix detecting disks on virtual machines; *) disk - fixed removing device from raid while resyncing; *) disk - fixed setting up dependent devices when file-based block-device becomes available; *) disk - fixed showing free space on tmpfs (introduced in v7.17); *) disk - improved stability; *) disk - improved system stability when SMB interface list is used (introduced in v7.17); *) disk - mount multi-device btrfs filesystems more reliably at startup; *) disk - set non-empty fs label when formatting by default; *) dns - do not show warning messages for DNS static entries when they are not needed; *) ethernet - fixed issue with default-names for RB4011, RB1100Dx4, RB800 devices; *) ethernet - fixed link-down on startup for ARM64 devices (introduced in v7.16); *) ethernet - improved link speed reporting on 2.5G-baseT and 10Gbase-T ports; *) fetch - added "http-max-redirect-count" parameter, allows to follow redirects; *) fetch - do not require "content-length" or "transfer-encoding" for HTTP; *) file - added "recursive" and "relative" parameters to "/file/print" for use in conjunction with "path" parameter; *) file - allow printing specific directories via path parameter; *) file - improved handling of filesystems with many files; *) firewall - allow in-interface/in-bridge-port/in-bridge matching in postrouting chains; *) firewall - fixed incorrectly inverted hotspot value configuration; *) firewall - increased maximum connection tracking entry count based on device total RAM size; *) hotspot - fixed an issue where extra "flash/" is added to html-directory for devices with flash folders (introduced in v7.17); *) igmp-proxy - fixed multicast routing after upstream interface flaps (introduced in v7.17); *) iot - added new "iot-bt-extra" package for ARM, ARM64 which enables use of USB Bluetooth adapters (LE 4.0+); *) iot - improvements to LoRa logging and stability; *) iot - limited MQTT payload size to 32 KB; *) ip - added support for /31 address; *) ippool - added pool usage statistics; *) ipsec - added hardware acceleration support for hEX refresh; *) ipsec - fixed chacha20 poly1305 proposal; *) ipsec - fixed installed SAs update process when SAs are removed; *) ipv6 - added ability to disable dynamic IPv6 LL address generation on non-VPN interfaces; *) ipv6 - added FastTrack support; *) ipv6 - added routing FastPath support (enabled by default); *) ipv6 - added support for neighbor removal and static entries; *) ipv6 - fixed configuration loss due to conflicting settings after upgrade (introduced in v7.17); *) l2tp - added IPv6 FastPath support; *) l3hw - added initial HW offloading for VXLAN on compatible switches; *) l3hw - added neigh-dump-retries property; *) l3hw - fixed /32 (IPv6 /128) route offloading when using interface as gateway; *) l3hw - fixed partial route offloading for 98DX224S, 98DX226S, 98DX3236 switches; *) l3hw - respect interface specifier (%) when matching a gateway; *) log - added CEF format support for remote logging; *) log - added option to select TCP or UDP for remote logging; *) lte - added at-chat support for EC21EU; *) lte - added basic support for Quectel RG255C-GL modem in "at+qcfg="usbnet",0" USB composition; *) lte - added confirmation-code parameter for eSIM provisioning; *) lte - added initial eSIM management support; *) lte - fixed cases where the MBIM dialer could get stuck; *) lte - fixed Huawei ME909s-120 support; *) lte - fixed interface recovery in mixed multiapn setup for MBIM modems; *) lte - fixed missing 5G info for "/interface lte print" command; *) lte - fixed missing IPv6 prefix advertisement on renamed LTE interfaces; *) lte - fixed prolonged reboots on Chateau 5G ax; *) lte - fixed SIM slot initialization with multi-APN setups; *) lte - improved automatic link recovery and modem redial functions; *) lte - improved initialization for external USB modems; *) lte - lte monitor, show CQI when modem reports it as 0 - undetectable, no RX/down-link resource block assigned to modem by provider; *) lte - R11eL-EC200A-EU fixed online firmware upgrade and added support for firmware update from local file; *) lte - R11eL-EC200A-EU improved failed connection handling and recovery; *) lte - reduce modem initialization time for R11e-LTE-US; *) lte - reduced SIM slot switchover time for modems with AT control channel (except R11e-LTE); *) lte - removed nonexistent CQI reading for EC200A-EU modem; *) net - added initial support for automatic multicast tunneling (AMT) interface; *) netinstall - try to re-create socket if link status changes; *) netinstall-cli - fixed DHCP magic cookie; *) ospf - fixed DN bit not being set; *) ospfv3 - fixed ignored metric for intra-area routes; *) ovpn - added requirement for server name when exporting configuration; *) ovpn - disable hardware accelerator for GCM on Alpine CPUs (introduced in v7.17); *) ovpn-client - added 1000 character limit for password; *) pimsm - fixed incorrect neighbor entry when using lo interface; *) poe-out - added "power-pair" info to poe-out monitor (CLI only); *) poe-out - added console hints; *) poe-out - added new modes "forced-on-a" and "forced-on-bt" (CLI only); *) poe-out - upgraded firmware for 802.3at/bt PSE controlled boards (the update will cause brief power interruption to PoE-out interfaces); *) port - improved handling of USB device plug/unplug events; *) ppc - fixed HW encryption (introduced in v7.17); *) ppp - add support for configuration of upload/download queue types in profile; *) ppp - added support for random UDP source ports; *) ppp - fixed setting loss when adding new ppp-client interface for BG77 modem from CLI; *) ppp - properly cleanup failed inactive sessions on pppoe-server; *) ptp - do not send packets on STP blocked ports; *) ptp - improved system stability; *) qos-hw - fixed global buffer limits for 98CX8410 switch; *) queue - improved system stability when many simple queues are added (introduced in v7.17); *) queue - improved system stability; *) queue - prevent CAKE bandwidth config from potentially causing lost connectivity to a device; *) resolver - fixed static FQDN resolving (introduced in v7.17); *) rip - fixed visibility of added key-chains in interface-template; *) rose-storage - add btrfs filesystem add-device/remove-device/replace-device/replace-cancel commands to add/remove/replace disks to/from a live filesystem; *) rose-storage - add btrfs filesystem balance-start/cancel commands; *) rose-storage - add btrfs filesystem scrub-start, scrub-cancel commands (CLI only); *) rose-storage - add btrfs transfers, supports send/receive into/from file for transferring subvolumes across btrfs filesystems; *) rose-storage - add support to add/remove btrfs subvolumes/snapshots; *) rose-storage - added support for advanced btrfs features: multi-disk support, subvolumes, snapshots, subvolume send/receive, data/metadata profiles, compression, etc; *) rose-storage - allow to separately mount any btrfs subvolumes; *) rose-storage - fixes for btrfs server; *) rose-storage - update rsync to 3.4.1; *) rose-storage,ssh - support btrfs send/receive over ssh; *) route - added /ip/route/check tool; *) route - added subnet length validation on route add; *) route - do not use disabled addresses when selecting routing id; *) route - fixed busy loops (route lockups); *) route - fixed incorrect H flag usage; *) route - improved stability when polling static routes via SNMP; *) route - properly resolve imported BGP VPN routes; *) routerboot - disable packet switching during etherboot for hEX refresh ("/system routerboard upgrade" required); *) routerboot - improved stability for IPQ8072 ("/system routerboard upgrade" required); *) routing-filter - improved stability when using large address lists (>5000); *) routing-filter - improved usage of quotes in filter rules; *) sfp - fixed missing "1G-baseX" supported rate for NetMetal ac2 and hEX S devices; *) sfp - improved linking with certain QSFP modules on CRS354 devices; *) sfp - improved system stability with some GPON modules for CCR2004 and CCR2116 devices; *) sfp,qsfp - improved initialization and linking; *) smb - fixed connection issues with clients using older SMB versions (introduced in v7.17); *) smb - fixes for SMB server; *) smb - improved system stability; *) snmp - added "mtxrAlarmSocketStatus" OID to MIKROTIK-MIB; *) snmp - added disk serial number through description field; *) snmp - sort disk list and assign correct disk types; *) ssh - improved channel resumption after rekey and eof handling; *) supout - added IPv6 settings section; *) supout - added per CPU load information; *) switch - allow entering IPv6 netmask for switch rules (CLI only); *) switch - fixed dynamic switch rules created by dot1x server (introduced in v7.17); *) switch - fixed issues with inactive hardware-offloaded bond ports; *) switch - improved egress-rate on QSFP28 ports; *) switch - improved system stability for CRS304 switch; *) switch - improvements to certain switch operations (port disable, shaper and switch initialization); *) system - added option to list and install available packages (after using "check-for-updates"); *) system - do not allow to install multiple wireless driver packages at the same time; *) system - do not cause unnecessary sector writes on check-for-updates; *) system - enable "ipv6" package on RouterOS v6 downgrade if IPv6 is enabled; *) system - fixed a potential memory leak that occurred when resetting states after an error; *) system - force time to be at least at package build time minus 1d; *) system - improved HTTPS speed; *) system - improved stability on busy systems; *) system,arm - automatically increase boot part size on upgrade or netinstall (fixed upgrade failed due to a lack of space on kernel disk/partition); *) tile - improved system stability; *) traceroute - added "too many hops" error when max-hops are reached; *) traceroute - limit max-hops maximum value to 255; *) user - improved authentication procedure when RADIUS is not used; *) vxlan - added disable option for VTEPs; *) vxlan - added IPv6 FastPath support; *) vxlan - added option to dynamically bridge interface and port settings (hw, pvid); *) vxlan - added TTL property; *) vxlan - changed default port to 4789; *) vxlan - fixed unset for "group" and "interface" properties; *) vxlan - replaced the "inherit" with "auto" option for dont-fragment property (new default); *) webfig - added confirmation when quitting in Safe Mode; *) webfig - do not reload form when failed to create new object; *) webfig - fixed "TCP Flags" property when inverted flags are set in console; *) webfig - fixed datetime setting under certain menus; *) webfig - fixed displaying passwords; *) webfig - fixed Switch/Ports menu not showing correctly; *) webfig - hide certificate information in IP Services menu when not applicable; *) webfig - remember expand/fold state; *) wifi - added max-clients parameter; *) wifi - avoid excessive re-transmission of SA Query action frames; *) wifi - fix issue which made it possible for multiple concurrent WPA3 authentications to interfere with each other; *) wifi - implement steering parameters to delay probe responses to clients in the 2.4GHz band; *) wifi - log a warning when a client requests power save mode during association as this may prevent successful connection establishment; *) wifi - re-word the "can't find PMKSA" log message to "no cached PMK"; *) wifi - try to authenticate client as non-FT client if it provides incomplete set of FT parameters; *) wifi-qcom - fix reporting of radio minimum antenna gain for hAP ax^2; *) wifi-qcom - prevent AP from transmitting broadcast data unencrypted during authentication of first client; *) winbox - added "Copy to Provisioning" button under "WiFi/Radios" menu; *) winbox - added "Last Logged In/Out" and "Times Matched" properties under "WiFi/Access List" menu; *) winbox - added "Reset Alert" button under "IP/DHCP Server/Alerts" menu; *) winbox - added L3HW Advanced and Monitor; *) winbox - added missing options under "System/Disk" menu; *) winbox - added TCP settings under "Tools/Traffic Generator/Packet Templates" menu; *) winbox - do not show 0 Tx/Rx rate under "WiFi/Registration" menu when values are not known; *) winbox - do not show LTE "Antenna Scan" button on devices that do not support it; *) winbox - fixed locked input fields when creating new certificate template; *) winbox - show LTE "CA Band" field only when CA info is available; *) winbox - show warning messages for static DNS entries; *) x86 - fixed "unsupported speed" warning;

          📎 参考文章

           
          💡
          有关RouterOS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

          Dae搭配AdGuard Home使用指南

          2024年11月7日 08:00
          😀
          在之前配置好家庭网络环境后,稳定运行了很久,大致上也基本满足日常需要,但是还有一些小的问题需要去解决。之前使用的是Dae + MosDNS配置,由DAE劫持流量进行最后的分流和代理,MosDNS主要用于DNS的并发请求和使用DOH、DOT服务,同时也负责DNS去广告。在使用过程中,由于MosDNS的队列化和无图形界面配置,进行特殊规则配置过于麻烦,最终决定还是在整体的DNS链路中增加AdGuard Home单独负责去广告和相关特殊规则的指定,MosDNS仅作为DNS转发器使用,不再兼顾过滤器的作用。
          由于Dae(大鹅)的DNS处理方式与OpenClash、Singbox等不同,是通过劫持流量方式实现,无法直接指定端口进行DNS劫持,所以主要的配置部分在于Dae,MosDNS与AdGuard Home的配置部分基本维持原有配置即可。
          另一个配置前提:由于我在主路由RouterOS上已经使用ospf进行了国内外流量的分流,所以此教程可能不一定适合于完全使用Dae进行分流的用户,如果存在分流错误等问题,可以尝试修改Global配置中的连接选项为domain++模式。

          📝 Dae配置部分

          Daed安装

          其实这部分说明文档里面已经很完善,可以参考Github上的教程。我自己使用的是Daed,目前最新的Daed版本是0.9.0版本。相比于Dae,Daed提供一个可视化的网页管理面板,日常进行自定义配置时候更为方便一些。在资源占用上,Daed相比Dae占用的内存要多一些,大概多出100mb左右。
          Debian或者Ubuntu安装执行如下命令:
          其他系统可参考:
          getting-started.md
          daeuniverse

          Global配置

          连接选项使用domain模式,其他无需修改。不需要使用Dae的domain+domain++ 模式。

          DNS

          由于处理DNS分流和解析不再由Dae负责,所以DNS部分的配置非常简单:
          其中adg即AdGuard Home,配置为AdGuard Home监听的地址和端口。此处我使用的默认53端口,如果53端口已经被占用或者存在其他问题,可替换为其他非标端口。

          路由部分

          路由部分需要在原有的配置基础上,对AdGuard Home进程、MosDNS进程以及系统默认的NetworkManager进程使用direct(must)规则特殊处理,从而避免产生路由回环。
          同时,为了在AdGuardHome中可以正确的显示各设备的IP地址,需要对geoip:private 规则进行修改,使用direct(must)规则。如果使用的是direct规则,那么在AdGuard Home中显示的设备信息均为localhost(127.0.0.1)

          Route整体规则

          整体规则大致如下,里面有一些自定义的配置,可以根据自己需要进行删减。

          direct与direct(must)区别

          must_rules表示不将DNS流量重定向到dae并继续匹配。对于单一规则,directmust_direct的区别在于direct会劫持和处理DNS请求(用于流量分割使用),但must_direct不会。当存在DNS请求的流量循环时,must_direct很有用。must_direct也可以写成direct(must)
          在上述配置中,以AdGuard Home为例,即进程AdGuardHome匹配的规则不进行DNS流量的劫持和处理且为直连,由AdGuard Home及其上游进行处理,同时由于规则:
          将通过Google DNS的流量使用代理处理,从而避免DNS污染。

          📝 AdGuard Home配置部分

          AdGuard Home部分没有什么需要特别注意配置的,只需要指定上游DNS为Dae所在机器IP地址即可。需要注意的是,如果使用MosDNS作为Dae的DNS解析服务程序,AdGuard Home中不要指向MosDNS的地址,会造成内存泄露以及高CPU占用。公共DNS服务器可以参考:国内外DNS推荐列表 | Dolingou
          我所使用的MosDNS配置文件可以参考:mosdns-config-with-no-leak
          notion image

          🤗 总结归纳

          目前情况良好,暂时没有出现错误问题,且能够更方便的对特定客户端、域名进行放行。

          后续

          由于AdGuard Home与Dae处于同一台机器,在使用must_direct规则时会造成DNS泄露问题,但如果使用direct规则,在AdGuard Home中又无法正常识别发出DNS请求的客户端,所以我最终还是选择在PVE中新建一个CT容器(LXC),单独负责AdGuard Home和Tailscale。AdGuard Home的上游DNS指向Dae所在的内网IP地址,同时在Dae中,对private部分规则使用direct规则,既满足避免DNS泄露的需要,又满足对各客户端DNS请求的管理。
          这也是我第一次使用LXC,CT模板使用的是alpine,目前对效能感到满意,在未开启AdGuard Home时,CPU占用几乎没有,内存占用13MB左右,开启AdGuard Home的情况下,单核CPU占用0.4%,内存占用不到50MB。
          在使用局域网其他机器作为DNS入口时,需要在Dae的Routing中增加以下配置,避免DNS请求环路,将下面的10.0.0.20 替换为你的DNS服务入口IP地址。
           
          同时由于内存泄露问题,建议使用Dae而非Daed,同样配置文件,在Dae下内存占用不到500M,但是Daed基本要奔着1G去了,长时间使用情况下,Daed的内存泄露问题更为严重。在Dae的版本上,目前我在使用Dae 0.9rc2情况下,存在CPU占用虚高问题,0.8版本未出现问题。
          我自身配置问题,与Daed无关,配置正确情况下,未发现Daed出现内存泄露情况。同时初始内存占用也没有1G。
          另外,如果使用其他机器作为DNS入口,那么其指向的DNS应为Dae所在机器的IP,不要直接指向MosDNS,由Dae再指向MosDNS,避免DNS重复劫持,造成内存泄露与CPU高占用,配置文件大致如下:
          AdGuard Home中的上游DNS指向Dae所在机器IP,同时Dae的DNS部分配置指向MosDNS端口

          关于AdGuard Home的卸载

          由于已经在LXC容器中单独部署了AdGuard Home,所以原来Debian机器上的AdGuard Home就可以卸载了,首先找到AdGuard Home二进制文件的位置,Debian/Ubuntu系统的位置一般位于/opt/AdGuardHome
          执行以下命令注销AdGuard Home相关服务
          删除AdGuard Home工作文件夹

          📎 参考文章

           
          💡
          有关AdGuard Home安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

          使用Pipedream同步RSS至Twitter(X.com)

          2024年12月30日 08:00
          😀
          之前使用过IFTTTDlvr.it进行RSS到Twitter的同步,现在这两个平台都已经收费,无法继续白嫖。在尝试同步RSS到BlueSky的时候发现了PipeDream这个网站,允许用户使用Python或者NodeJS搭建简单的工作流,所以理论上也是可以将RSS同步到Twitter,例如个人博客、豆瓣在看在读等等支持通过RSS Feed输出的信息流。在完成实践并测试成功之后,有了这篇指南,希望可以帮助到需要的朋友。尽管Twitter已经改名叫X,但是我还是更习惯称呼它为Twitter,那是一个黄金时代。

          📝 RSS同步Twitter搭建前提

          • 一个Twitter开发者平台账号,申请入口为:Developer Platform,个人使用免费Plan即可,每个月允许500条POSTS。对于同步豆瓣或者个人博客来说,足够使用。Twitter开发者平台注册时会要求填写申请理由,例如:
          notion image
          我这里提供一份开发者平台申请理由范本,可根据自己需要修改:
          🛠
          Synchronize RSS to my personal X account for recording movies I have watched, music I have listened to, or content I have posted on my blog, etc. This functionality allows me to maintain a comprehensive and organized record of my personal experiences, preferences, and creative outputs. By integrating RSS feeds with my X account, I can easily keep track of the various forms of media I engage with, whether it's a captivating film that I watched over the weekend, a new album that I discovered and fell in love with, or an insightful blog post that I crafted and shared with my audience.
          This synchronization process not only enhances my personal organization but also serves as a digital diary of sorts, capturing my evolving tastes and interests over time. It provides a convenient way to look back at my past activities and reflect on how my preferences have changed or remained consistent. Moreover, this feature can be a valuable tool for personal branding, allowing me to showcase my diverse interests and creative endeavors to my network.
          Totally personal applications, this system is designed to cater to my individual needs and privacy preferences. It ensures that all the data being synchronized is managed within the confines of my personal X account, offering a secure and private space where I can store and access my records without any external interference. This level of personalization and control is crucial for maintaining the integrity of my digital identity and ensuring that my personal data remains protected and accessible only to me.
          In summary, this RSS synchronization feature transforms my X account into a multifunctional hub where I can document, organize, and reflect upon my personal and creative experiences. It's a tool that not only simplifies my daily interactions with various forms of media but also enriches my digital presence by offering a detailed and dynamic representation of my personal journey.
          • 一个PipeDream账号,申请入口为:pipedream,可以使用Google或者Github账号登录。同样免费计划即可,可以创建3个工作流,足够使用。

          📝 RSS同步Twitter配置流程

          获取Twitter Key And Tokens

          打开https://developer.x.com/en/portal/projects-and-apps,在左侧菜单点击Projects & AppsOverview ,然后系统已经自动生成了一个App,我们需要的是获取这个App的Api以及认证所需的Token。
          点击User authentication settings 下的Set Up 按钮,进入配置页面:
          notion image
          • App Permissions选择Read and write ,因为我们要发布推文;
          • Type of App选择Web App, Automated App or Bot
          • App InfoCallback URLWebsite URL 填写自己的域名,如果没有就填写pipedream的。
          • 点击Save 会输出一个Client ID和Token,但是这个不是我们需要的,没有什么用。
          返回Overview页面,点击PROJECT APP后面的小钥匙图标:
          notion image
          点击Access Token and Secret 后面的Generate 按钮,会生成Access Token和Access Token Secret,一定要复制保存下来,等下会用到。
          点击API Key and Secret 后面的Regenerate ,会生成API KeyAPI Key Secret,同样保存下来,等下在PipeDream中会用到。

          配置Pipedream环境变量

          现在假设你已经完成了Pipedream的注册,进入后管理后台,点击左侧菜单的Settings ,然后选择Environment Variables
          notion image
          点击右上的+ New Variable 添加新的变量,总计需要添加4条,对应关系如下:
          • TWITTER_ACCESS_SECRET : 获取的Access Token Secret
          • TWITTER_ACCESS_TOKEN : 获取的Access Token
          • TWITTER_API_SECRET : 获取的API Key Secret
          • TWITTER_API_KEY : 获取的API Key Secret
          对应关系不要搞乱,变量名称也不要有错误。

          配置Pipedream Project和Workflow

          点击左侧菜单的Projects ,然后点击右上角的+ New Project ,填写项目名称,建议填写英文,字数不要太多,因为如果想要删除项目,要重新输入一遍项目名称,很麻烦。例如我就填写Twitter,然后点击Create Project ,完成项目的创建。
          在列表中点击刚刚创建的项目名称,然后点击页面中硕大的一个+New 按钮,选择Workflow ,修改一下Workflow的名称,同样名称写的简单点,不然删除很麻烦,其他内容不用动,直接Create Workflow

          添加RSS Trigger触发器

          notion image
          点击Add Trigger ,先添加一个触发器。因为我们是想在RSS有新的条目时,自动发送一条推文,所以这里的触发器就是RSS Feed。
          notion image
          My Sources中选择New Item in RSS Feed
          notion image
          Timer :建议选择8小时查询一次,降低请求。UTC懒得选择的话,维持默认也可以。
          Feed URL :填写你要读取的RSS Feed地址。
          Published After:维持默认不用管。如果想避免发送重复内容或者一次发送太多,可以选择当前时间较前一点点的时间。
          点击Save and continue 完成Trigger触发器的配置。Pipedream会尝试读取你填写的RSS Feed地址,并返回读取结果。

          添加RSS触发动作

          完成上面RSS Trigger的创建之后,我们就需要配置当RSS有新的内容时,所要触发的动作,也就是在Twitter上发送一条推文。
          点击画板上,Trigger下面的+号来添加Action。
          notion image
          选择NodeRun Node Code
          notion image
          在右侧的代码编辑器中,复制下面的代码内容:
          然后点击Test 进行代码测试,如果没有问题的话,这时候你的Twitter中就会有一条自动发送消息。然后点击Deploy完成这个通过Pipedream推送RSS内容到Twitter的工作流部署。

          Twitter推文(Tweet)效果

          notion image
          效果大概如图所示(有点丑,但可以用),可根据自己需要对以下代码部分进行修改:
          之后如果我有新的代码调整,也会同步更新到这篇文章内。

          Twitter同步代码优化版本

          • 增加了针对影视、音乐、读书不同的emoji;
          • 增加了封面图上传功能;
          • 增加了错误判断。

          🤗 总结归纳

          整个教程整体来说没有太多的技术难度,主要就是一些复制与粘贴的工作。不过因为之前已经在Pipedream中使用了2个Workflow用于BlueSky的RSS同步,所以一共3个的Workflow限制目前刚刚好,如果再多的话,免费版的账号就不支持了。后续会尝试将BlueSky和Twitter的同步尝试写在一个Workflow里。
          如无意外,这应该是2024年的最后一篇正式文章。提前祝大家新年快乐,2025年一切顺利。

          2025/01/02 更新

          代码目前存在一个问题,当URL含有中文字符时,在Twitter会产生截断,我想想办法怎么修一下。

          📎 参考文章

           
          💡
          有关Workflow安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

          OpenWRT配置Bird使用OSPF国内外动态路由分流

          2024年12月29日 08:00
          🛠
          之前写过一篇关于RouterOS上使用OSPF("Open Shortest Path First",翻译为中文是“开放式最短路径优先”)进行国内外动态路由分流的文章,当时就在想,国内使用RouterOS作为主路由的人群应该不是很多,大多数的人有这个需要的人,使用的主路由系统应该都是OpenWRT或者其衍生版本。今天的文章就把之前的坑补上,将在OpenWRT系统中,使用Bird实现OSPF动态路由的国内外分流。

          📝 OpenWRT配置动态路由背景

          • 主路由器:OpenWRTImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
            • 光猫桥接,接口为wan
            • 内核版本为5.15.167(stable)
            • 架构X86_64
          • 旁路由(旁路网关):OpenWRT(ImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
            • 接口为br-lan,网关为主路由IP地址
            • 运行OpenClash作为科学服务
            • 内核版本为5.15.167(stable)
            • 架构X86_64

          📝 为什么要使用OSPF进行分流

          在目前大多数网友使用OpenWRT路由系统的场景中,旁路由(旁路网关)应该是很大一部分,从而决定有一定基数的用户还保留着使用代理需要使用旁路由(旁路网关)这种习惯,从最初的各种盒子,到后来的Hyper-V虚拟机,再进阶到All in One的PVE,将Clash、SingBox、Dae等代理软件放在旁路由(旁路网关)应该已经称为很多使用者的一种习惯。而在使用过程中所配置的网络拓扑结构,随着不断的修改、缝补、优化,迁移起来的工作量也相对较大,从而在另一方面也继续维持这种习惯的惯性。
          以上都是我个人作为使用者的一些猜测。对于我来说,在使用旁路由(旁路网关)这种拓扑结构,并在主路由进行分流的原因主要有以下两点:

          增加直连效率

          不管是Clash系列还是Singbox系列,或者直连性能非常恐怖的Dae,最终都需要由程序根据规则进行国内外的流量分流,不管是用Geosite还是GeoIP,数据均需要由代理程序进行一次处理,在对国内直连网站的效率上,或多或少都会产生影响。而由于这多出来的一层处理,对于国内的直连流量来说,也增加的不确定性。所以我选择在主路由使用路由表功能对国内与国外的流量进行拆分分流,国内流量直接通过主路由的网关出去,国外的流量再交给旁路由(旁路网关)根据规则进行处理,最大化直连性能。
          至于为什么使用路由表而不是防火墙转发:路由表的查询发生在网络层(L3),是数据包转发的第一步,防火墙规则在路由决策之后处理,会增加额外的处理开销,更占用CPU,效率也没有路由表更高,当规则很多时,防火墙的性能会受到很明显的影响。路由器的主要工作就是根据目的地址,为数据包选择最优路由路径,这是路由器最为基础也是最为核心的功能。

          增加网络容错性

          代理这个东西,不是一直都很稳的。如果在主路由上使用,如果代理程序出现问题(尤其是喜欢劫持防火墙规则的一些程序),那么就意味着家里的网络直接出现问题,无法正常使用。如果自己一个人还好,但是如果家里有其他人使用,例如老人、孩子、夫人等等,那么就可能会因为网络出现问题而耽误使用,或者造成更多家庭问题。OSPF的动态路由可以很好的解决这一点,收敛速度与接收速度都很快,即便是旁路出现问题,那么也能在5秒之内完成路由表的收敛工作,将主路由的路由表恢复至默认状态,不耽误日常的使用。
          综上两点,这也是我为什么使用旁路由(旁路网关)这种拓扑结构,并在主路由进行分流的原因。

          📝 OpenWRT配置接收Bird的OSPF动态路由

          此教程配置需要在主路由和旁路由进行操作。操作前建议备份或镜像,避免出现不可逆的网络问题。

          OpenWRT旁路由(旁路网关)配置

          旁路网关的配置可以参考《🔀RouterOS使用OSPF智能分流国外流量》中的具体说明,这里只列出步骤与相关的代码。
          确认/etc/sysctl.d/10-default.conf开启以下选项:

          安装Bird2

          当使用OSPF协议时,通常需要一个路由守护进程来实现其功能。Bird是一种轻量且高性能的解决方案,能够同时支持IPv4和IPv6路由表。作为一款支持多种路由协议的软件,Bird同时也支持OpenWRT系统及其大部分衍生版本。
          • 通过opkg安装所需软件包
          • 编辑配置文件
          创建bird的route路由表文件目录,用于存放生成的route4.confroute6.conf路由表文件。
          bird的基础配置文件位于/etc/bird.conf ,使用你喜欢的编辑器进行编辑。其中router id 为旁路由的局域网IP地址,interface 为网络接口名称,例如我的是eth0 ,是与主路由连接的接口的名称。

          生成Bird动态路由规则

          使用dndx/nchnroutes: !chnroutes - chnroutes negated的框架进行动态路由规则生成,原理是根据获取到的国内IPv4地址范围和APNIC内的国内IPv6地址范围取反。
          • 编辑Produc.py
          在第10行附近,修改—next后的default参数wg0为自己的旁路由(旁路网关)接口名称, 例如我的是eth0,就改成eth0
          替换48IPv4Network('172.16.0.0/12')的保留地址,替换为IPv4Network('172.24.0.0/13'),避免影响Cloudflare访问。
          原因在于Cloudflare IP Range中包括:172.64.0.0/13 这个地址范围,如果将IPv4Network('172.16.0.0/12') 配置为保留地址,那么Cloudflare所使用的172.64.0.0/13 也会被标记为直接从主网关出去,不需要经过旁路网关,所以会出现部分使用Cloudlfare CDN的网站无法访问的情况,例如Linux.do
          • 编辑Makefile
          取消567行的注释。并修改china_ip_list上游地址为mayaxcn 提供的china-ip-list
          • 生成路由表
          需要确保你已经安装make,如果没有安装可以通过opkg install make 进行安装。执行:
          返回结果:
          • 确认Bird2路由表状态
          执行命令birdc show route protocol static1查看IPv4路由表
          notion image
          执行命令birdc show route protocol static2查看IPv6路由表:
          notion image
          • 添加定时任务

          OpenWRT主路由配置

          安装Bird2

          配置Bird2

          配置文件同样位于/etc/bird.conf ,文件内容如下,包括IPv4地址的路由表以及IPv6地址的路由表。
          其中router id为主路由的局域网IP地址,interface为网桥名称,例如br-lan ,是提供DHCP服务的接口名称。
          保存后执行以下命令重启bird并配置bird为开启自动启动:

          查看bird获取OSPF邻居信息

          返回结果:
          其中10.0.0.10 为我的旁路网关地址,State显示为Full即表示已经完成与OSFP邻居的连接建立完成。

          查看bird获取OSPF动态路由信息

          返回结果大概类似于以下这种,数量太多就截取一部分:

          主路由OpenWRT防路由环回处理

          处理OpenWRT的环回思路也是通过新建一个路由表bypass,将从旁路由来的流量,通过防火墙打标记的方式,使用这个新建的路由表bypass,从而避免产生环路。
          • 为旁路由添加默认路由规则
          添加路由表:
          假设旁路由的ip地址为10.0.0.2
          • 新建IPv4局域网路由规则
          通过luci管理界面,进入网络路由IPv4规则 ,添加一条IPv4路由规则:
          notion image
          优先级: 默认30000
          规则类型: unicast
          传入接口: lan
          源地址: 局域网IP地址范围,如果你是主路由是192.168.1.1 ,那么这里写192.168.1.0/24
          传出接口:不填写
          目标地址:不填写
          :添加一个bypass
          高级设置-防火墙标志0x1
          • 新建IPv4广域网路由规则
          notion image
          优先级: 默认30000
          规则类型: unicast
          传入接口: 不填写
          源地址: 不填写
          传出接口wan
          目标地址0.0.0.0/0
          bypass
          高级设置-防火墙标志0x1
          • 配置防火墙规则
          OpenWRT的根据所使用的不同OpenWRT版本,防火墙程序也不同:iptablesnftables。但是我们可以通过luci的网页管理进行操作。
          网络防火墙通信规则 ,新建一条通信规则:
          notion image
          名称: bypass
          协议: TCP + UDP,或者全选
          源区域: Lan
          源地址: 旁路由IP地址
          源端口
          目标区域任意区域
          目标地址
          目标端口任意
          操作应用防火墙标记
          设置标记 :0x1

          🤗 总结归纳

          需要注意的是,通过OSPF输出到OpenWRT内核的路由表并不会在Luci界面的的路由信息中进行展示。如果需要查看,可以通过ip route show命令。
          本篇文章基本是在之前文章的基础上,完善了一下OpenWRT路由系统下使用Bird建立OSPF动态路由分流的操作指南,大部分内容都是以前已经写过的。
          今天在进行环境测试的时候,也发现了一些有趣的问题,例如:
          Bird中的type pointopoint 其实只允许两台主机建立动态路由的邻居关系,当第三台机器想要加入的时候,通过syslog会发现提示:
          同时neighbor state会显示ExStart
          这时候需要修改typebroadcast才可以。

          📎 参考文章

           
          💡
          有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

          国内外DNS服务器推荐列表

          2024年9月5日 08:00
          😀
          之前介绍了不少关于MosDNS、AdGuard Home和OpenClash的内容,里面绕不开的一个部分就是:用来解析国外域名,获取无污染解析结果的DNS服务器应该选择哪家,或者说有哪些无污染的公共DNS服务器可以选择。今天这篇文章,就对我使用过的DNS服务器进行一个整理,并进行无污染DNS服务器的推荐。

          📝 个人对DNS服务器选择的看法

          DNS服务器的主要作用是将域名解析转换为IP地址,同时支持负载均衡、高可用性、反向解析、缓存加速等功能。DNS是互联网的基础设施之一,几乎所有的网络通信都依赖于DNS服务。所以选择一个稳定、高速且无污染的DNS的重要性不言而喻。在使用DNS分流的情况下,对国内域名与国外域名分别配置DNS可以有效提升解析速度与准确性,例如我在使用的MosDNS和AdGuard Home。

          📝 国内DNS服务器

          国内的公共DNS服务选择不多,我认为国内DNS只有三个选择,阿里云公共DNS(阿里巴巴)、DNSPod(腾讯)以及各省市运营商下发的DNS。阿里云公共DNS和DNSPod均支持ECS(edns-client-subnet)协议,在一定程度上可以缓解整体解析速度不如运营商DNS的情况。其他例如114、360、百度等等,均有前科,不太推荐选择。
          同时在国内DNS的选择及使用上,我个人更推荐使用DOH、DOT方式,避免DNS泄露给运营商,从而产生DNS劫持。在部分省份,运营商DNS劫持会将目标网站的解析结果返回为反诈页面,例如被运营商DNS劫持到www.js96110.com.cn
          名称
          标准DNS地址
          DOH地址
          DOT地址
          是否支持H3
          ECS
          DNSPod
          119.29.29.29 / 182.254.116.116
          https://doh.pub/dns-query
          dot.pub
          支持
          AliDNS
          223.5.5.5 / 223.6.6.6
          https://dns.alidns.com/dns-query
          dns.alidns.com
          支持

          📝 国外DNS服务器

          我个人一般会用Google DNSNextDNS、以及AdGuard DNS作为主要无污染DNS使用。NextDNS的免费额度足够家庭使用,当免费额度用完就切换到AdGuard DNS。在Google DNS存在国内访问问题的时候,会选择Quad9或者OpenDNS。Cloudflare DNS在我这里的稳定性和速度并不好,所以很少选择。大多数的国外公共DNS均可以返回无污染的DNS解析结果,这些公共DNS服务基本都支持DNSSEC。
          在衡量与选择国外公共DNS服务时,延迟与丢包一般是我首先考虑的因素,其次就是DOH(DNS over HTTPS)和DOT(DNS over TLS)的支持,如果能够支持H3(http3)或者tls pipeline的话,那么一般就会是首选的DNS服务。其他次级考虑的因素还包括是否支持ECS,如果可以支持ECS,我会选择代理出口位置附近的IP。通过MosDNS的ECS功能,可以自定义ECS地址,使解析的CDN结果更靠近所配置的IP地址,从而提高解析结果的访问速度,例如我喜欢配置国外的ECS地址为代理的出口地址,这样通过代理访问时,可以获得最佳速度及可用性。
          同时在使用DOT或DOH使,可使用dial_addr替代域名,可免去每次建立连接时需要Bootstrap DNS先解析DNS服务器域名。dial_addr一般为标准DNS的IPv4和IPv6地址。
          由于一些公共DNS使用DNSCRYPT,需要使用DNS服务器公钥,存在局限性,所以暂时未列入表单内,也不作为DNS选择与衡量的指标。
          同时大部分公共解析服务均为IPv4和IPv6双栈,即使用IPv4的DNS公共解析服务也可以解析IPv6地址,所以列表内不再进行IPv4和IPv6的区分。
          在设备支持的情况下,非常建议选用支持DoH与DoT的DNS服务器。

          推荐使用的DNS服务器

          DNS服务名称
          标准DNS地址
          DoH地址
          DoT地址
          是否支持H3
          ECS
          Google DNS
          8.8.8.8 / 8.8.4.4
          https://dns.google/dns-query
          dns.google
          支持
          Cloudflare
          1.1.1.1 / 1.0.0.1
          https://cloudflare-dns.com/dns-query
          1dot1dot1dot1.cloudflare-dns.com
          支持
          Quad9
          9.9.9.9 / 149.112.112.112
          https://dns.quad9.net/dns-query
          dns.quad9.net
          支持
          AdGuard Public DNS
          94.140.14.14 / 94.140.15.15
          https://dns.adguard.com/dns-query
          dns.adguard.com
          支持
          NextDNS
          45.90.28.0 / 45.90.30.0
          https://dns.nextdns.io
          45.90.28.0 / 45.90.30.0
          支持
          OpenDNS
          208.67.222.222 / 208.67.220.220
          https://doh.opendns.com/dns-query
          208.67.222.222 / 208.67.220.220
          支持
          Yandex DNS
          77.88.8.8 / 77.88.8.1
          https://doh.yandex.net/dns-query
          dns.yandex.net
          不支持
          CleanBrowsing
          185.228.168.9 / 185.228.169.9
          https://doh.cleanbrowsing.org/dns-query
          security-filter-dns.cleanbrowsing.org
          不支持
          jp.tiar.app
          172.104.93.80
          https://jp.tiarap.org/dns-query
          jp.tiar.app
          不支持
          Comodo Secure DNS
          8.26.56.26
          https://doh.comodo.com/dns-query
          dns.comodo.com
          不支持
          DNS.WATCH
          84.200.69.80
          https://dns.watch/dns-query
          不支持
          Blahdns(新加坡)
          46.250.226.242 2407:3640:2205:1668::1
          https://doh-sg.blahdns.com/dns-query
          dot-sg.blahdns.com
          不支持
          CleanBrowsing
          185.228.168.9 185.228.169.9
          https://doh.cleanbrowsing.org/doh/security-filter/
          security-filter-dns.cleanbrowsing.org
          不支持
          Block malware
          76.76.2.1
          https://freedns.controld.com/p1
          tls://p1.freedns.controld.com
          不支持
          DeCloudUs 
          78.47.212.211:9443
          https://dns.decloudus.com/dns-query
          tls://dns.decloudus.com
          不支持
          Mullvad(新加坡)
          -
          https://dns.mullvad.net/dns-query
          tls://dns.mullvad.net
          不支持

          仅作测试使用的DNS服务器

          以下DNS服务器是仅作测试使用的DNS服务器,不建议作为日常主力使用DNS解析服务,推荐仅在测试时进行使用,或作为落地区域的DNS使用。这些DNS服务大多不提供DOH或DOT选项,且在直连情况下存在延迟较高、丢包较多等不稳定因素。
          DNS服务名称
          标准DNS地址
          DoH地址
          DoT地址
          是否支持H3
          ECS
          HKBN DNS
          203.80.96.10 / 203.80.96.9
          不支持
          不支持
          不支持
          NTT Communications DNS
          61.213.169.170 / 61.213.169.171
          不支持
          不支持
          不支持
          NEC BIGLOBE DNS
          202.225.96.66 / 202.225.96.68
          不支持
          不支持
          不支持
          Yahoo Japan DNS
          182.22.70.1 / 182.22.70.2
          不支持
          不支持
          不支持
          DNS.SB
          45.11.45.11
          https://doh.dns.sb/dns-query
          dot.sb
          不支持
          腾讯国际
          162.14.21.178/ 162.14.21.56
          不支持,可通过腾讯云套娃DOH
          不支持,可通过腾讯云套娃DOT
          不支持
          Microsoft DNS / Level 3 Communications
          4.2.2.2 / 4.2.2.1
          不支持
          不支持
          不支持
          HiNet/中華電信
          168.95.1.1 / 168.95.192.1
          不支持
          不支持
          不支持
          TWNIC Quad101 Public DNS
          101.101.101.101 / 101.102.103.104
          不支持
          不支持
          不支持

          DNS延迟测试脚本

          这个Python脚本需要ping3依赖,复制以上代码并保存为*.py文件,通过命令行运行。可替换IP地址为自己想要进行测速的DNS的IP地址,每个DNS的IP地址Ping次数默认为4 。脚本的注释算是清晰,可根据自己需要在脚本中修改。

          非公共DNS服务(增强型DNS服务

          这里的非公共DNS是指提供具有用户唯一标识的DNS服务,允许用户自定义DNS过滤与隐私保护,提供访问控制,提供查询日志,提供部分路由优化等。相较于免费的公共DNS服务,这种DNS服务在部分情况下访问速度可能会更好一些。基础的DOH、DOT、DNSSEC、ECS基本都支持。
          • XNS.One提供非公共DNS使用,属于付费服务,需要邀请码,可以在他们的Telegram频道蹲一下。付费不支持支付宝与微信,只能信用卡付款。
          • NextDNS,我目前主要使用的DNS服务,免费版每个月提供30万次查询,基本够日常使用。可定制拦截列表。
          • AdGuard DNS,与NextDNS类似,免费版每个月提供30万次查询,允许配置5个接入点,2个服务器,支持配置100条自定义规则。

          📝 其他关于DNS的参考信息

          enable_pipeline: TCP/DoT使用RFC 7766新的query pipelining连接复用模式。
          • 启用后可大幅提高连接利用率,减少建立连接/握手的次数,进而降低响应延时。
          • 并非所有DNS服务器都支持。必须确定DNS服务器支持后再启用该选项。
          • Tips: 已知Google和Cloudflare的TCP/DoT是支持该模式的。知名的公共DNS服务商大多数都支持该模式。如果你使用MosDNS,可以使用 mosdns probe pipeline {tcp|tls}://server_ip[:port] 测试命令测试服务器是否支持。比如 mosdns probe pipeline tls://8.8.8.8

          什么是ECS(EDNS Client Subnet)?

          ECS(EDNS Client Subnet)是扩展DNS查询的一种机制,旨在提升内容分发网络(CDN)和地理位置相关的服务的效率。通常DNS服务器只看到客户端的IP地址,但通过ECS,DNS请求会包含客户端IP的一部分(子网信息)。这样,内容分发网络可以根据客户端的地理位置,返回更接近用户的服务器,减少延迟,提升性能。ECS主要用于优化网络和加速服务的访问,但也可能带来一定的隐私泄露风险。

          什么是DOH(DNS over HTTPS)?

          DoH(DNS over HTTPS)是一种技术,用来加密你的DNS查询。通常情况下(UDP及TCP协议情况下),DNS查询是明文的,容易被ISP运营商看到和监控。而DoH会通过HTTPS协议加密这些查询,确保你的请求内容是安全的,不会被ISP和运营商偷看。就像你在发送加密的信息一样,DoH保护了你上网时的隐私,并在一定程度上可以避免DNS劫持。

          什么是ECH(Encrypted Client Hello)?

          ECH(Encrypted Client Hello)是一种技术,用来加密你访问网站时的SNI(服务器名称指示)信息。通常情况下,当你想访问某个网站时,这个请求是明文的,运营商或其他第三方可以轻易看到你在访问什么网站,并可能进行拦截或阻断(例如SNI阻断)。这也是为什么有时你在国内访问GitHub和Linux.DO会遇到Time Out问题的原因之一。有了ECH,这些SNI信息就被加密了,外面的人就看不到你要访问哪个网站,从而提高了你的隐私和安全性。简单来说,ECH就像是在发送加密的信息,让你的浏览行为更加私密。

          什么是DNSSEC(Domain Name System Security Extensions)?

          DNSSEC(Domain Name System Security Extensions)是DNS系统的安全扩展协议,通过数字签名技术来确保DNS记录的真实性和完整性。它通过建立从根域名到下级域名的信任链,使用公私钥对对DNS记录进行签名和验证,能有效防止DNS欺骗和缓存污染。DNSSEC引入了几个关键记录类型:DNSKEY用于存储域名公钥,RRSIG包含数字签名信息,DS记录用于下级域委派签名,以及NSEC/NSEC3用于提供域名不存在的证明。虽然DNSSEC的配置较为复杂,可能增加DNS服务器负载并导致响应包变大,但它在防止DNS劫持和欺骗方面发挥着重要作用,目前已得到Google DNS (8.8.8.8)和Cloudflare (1.1.1.1)等主流公共DNS服务器的支持。

          其他关于DNS选择的文章?

          💡
          有关DNS上的问题,欢迎您在底部评论区留言,一起交流~

          Follow for Android

          2025年1月10日 08:00
          😀
          最近一直通过Follow浏览订阅的RSS、Twitter以及Youtube频道等等,真的很方便,有一种重新回到将近20年前,使用Google Reader那种时候通过订阅很多博客并获取知识的感觉。Follow一直没有推出Android的App,需要使用网页版。但是对于这种高频使用的服务,我天生希望使用App的方式,所以这次又整了个活,用Tauri通过Webview的方式将Follow的网页服务封装在了APP里。

          📝 Follow for Android 项目介绍

          整体项目很简单,就是通过Webview打开Follow.is的网站,然后用Tauri生成Android编译APK所需要的文件,最后进行打包。整体APP大小在28M左右,暂时还没有做任何太多优化,先占个坑,在后续自己使用过程中如果发现问题会进行更新。
          Follow.is的整体优化非常好,在浏览器中各种交互操作也已经非常成熟,所以我做的事情非常简单,就是将Follow.is的网页通过Webview打开,再做一点缓存加快载入速度。Follow for Android应用本身除缓存外不会存储任何用户数据,同时在权限申请方面,也只需要互联网权限:
          另外,在APP的请求记录里会出现读取剪贴板行为,这是由于在点击输入框时会自动进行获取,我没有禁止,避免无法粘贴Feed地址。当然只有在使用这个Follow APP时候才会发生这种读取。
          对于系统版本,目前需要SDK版本≥33,否则会提示版本不兼容。
          最后,感谢RSSNext/Follow的全部贡献成员,同时期待Follow官方正式推出Android和iOS的客户端版本。

          Follow for Android 项目地址

          followforandroid
          moreoronceUpdated Mar 1, 2025
          notion image
          notion image

          支持功能

          • Google和Github的登录可用
          • RSS正常可以阅读(Youtube订阅源暂时无法直接播放视频)
          • 添加订阅源正常
          • 大部分页面显示正常(目前还没有找到不正常的)
          • 使用Service Worker进行缓存
          • 理论上支持Android TV使用
          APP大小不到28M,整体安装后,算上缓存在100M左右。
          notion image

          安装文件

          没有区分架构,理论上支持全部

          🤗 总结归纳

          了解Tauri和配置用的时间较长,Tauri 2.0版本目前还没有完全的文档能够参考阅读,有些地方可能需要自己试试看。生成Android构建文件之后,主要花费的时间在编译上,第一次感觉自己的这颗AMD Ryzen 5600X的CPU性能有点不够用了。
          文章介绍内容现在也比较少,后续再一点一点完善吧。Enjoy it。
          Follow.is的iOS版本已经开始内测了,估计再等等,Android版本也就可以有了。

          📎 参考文章

          💡
          有关Follow for Android安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

          实验性:OpecClash不使用Dnsmasq绕过中国大陆IP

          2024年9月6日 08:00
          ⛏️
          Openclash作为Openwrt上用户最多的科学上网插件,其“实验性:绕过中国大陆IP“功能是通过Dnsmasq进行实现,旨在将国内IP通过防火墙转发规则,国内IPv4和IPv6的流量不经过Clash(Mihomo)内核处理,增强直连性能,降低OpenWRT软路由的资源占用。对于进阶使用用户来说,在使用上存在诸多不便,例如无法与MosDNS、Adguard Home完美配合。我作为一个只能看懂一部分代码,完全不会写的选手,在ChatGPT和Cursor的帮助下,尝试找到一个不依赖于Dnsmasq,也可以使中国大陆IP流量不经过Clash(Mihomo)内核的方法。
          本篇的配置项目前还未经过长时间生产环境使用,可能存在不稳定、规则冲突、未知问题等可能。在操作之前,请进行备份,避免无法恢复的网络宕机。

          实验环境

          • 旁路由(旁路网关):OpenWRTImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
            • 接口为br-lan,网关为主路由IP地址
            • 运行OpenClash作为科学服务
            • 内核版本为5.15.167(stable)
            • 架构X86_64

          📝 OpenClash实验性:绕过中国大陆IP的原理

          OpenClash的大部分核心外功能实现基本都是通过/etc/init.d/openclash这个启动文件实现。在文件中,涉及实验性q:绕过中国大陆IP的主要功能部分包括:
          • ip set/nft set 管理,也就是IP集合管理
          • China_ip_route规则匹配及重定向
          • 利用Dnsmasq进行国内域名列表(/etc/openclash/accelerated-domains.china.conf)内的域名解析

          IP集合

          OpenClash内置了两个IP集合,分别为China_ip_route集合和China_ip_route_pass集合,通过插件设置 - 大陆白名单订阅 进行维护,没有使用GeoIP:CN进行维护。

          China_ip_route规则匹配

          在Openclash选择绕过大陆IP时,通过fw4进行进行流量检测,当检测到目标IP地址属于中国大陆时,通过openclash链、openclash_mangle链、以及openclash_mangle_out链进行return操作,使流量按原链继续进行,不再经由clash内核进行处理。

          openclash_mangle链

          openclash_mangle链的作用是用于修改流量的特性,通常用于更改数据包的标记、TTL(生存时间)等,对流量进行细颗粒度控制,标记流量进行后续处理等。
          • 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
          • 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。
            • 如果不等于2,即不使用防火墙劫持:nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return’
            • 如果等于2:nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route counter return’

          openclash链

          openclash链主要用于处理进入的流量。这个链通常用于根据特定的规则对流量进行分类和处理。
          • 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
          • 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。
            • 如果不等于2,即不使用防火墙劫持:nft 'add rule inet fw4 openclash ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return'
            • 如果等于2:nft 'add rule inet fw4 openclash ip daddr @china_ip_route counter return'

          openclash_mangle_output链

          openclash_mangle_output链专门用于处理输出流量,即从本地系统发出的流量(路由器本机流量)。之前我只配置了mangle链和openclash链,没有对openclash_mangle_output链进行防火墙配置,导致mosdns的还是会经过clash(mihomo)核心,也造成在多并发进行DNS请求时,upstream errorexchange failed等错误,同时由于本来应该直连的DNS公众服务器,绕到Clash(Mihomo)核心走了一圈,所以解析速度也有所下降。
          • 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
          • 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。其中,skuid≠65534为非特权用户,即nobody用户
            • 如果不等于2,即不使用防火墙劫持:nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return'
            • 如果等于2:nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route counter return'

          China_ip_route_pass规则匹配

          China_ip_route_pass这个IP集是通过劫持Dnsmasq,使用设定的dns对国内常见域名(也就是/etc/openclash/accelerated-domains.china.conf 文件内域名)进行解析并生成的IP集。这部分非常依赖于Dnsmasq,但在我们这里由于已经有MosDNS进行分流,所以不用过于关注。

          📝 配置流程

          China_ip_route的nft规则配置

          通过对上面fw4表内openclash链、openclash_mangle链以及openclash_mangle_output链的分析,可以基本明确我们要进行带操作。
          • 首先我们需要处于fake-ip模式
          • 关闭实验性绕过中国大陆IP选项,因为我们要手动添加防火墙规则进行绕过
          • 关闭DNS劫持
          在关闭DNS劫持的同时,我们符合enable_redirect_dns 选项,即没有使用防火墙劫持DNS,所以我们采用if下的第一条判断结果。

          添加防火墙规则

          由于防火墙规则采用顺序匹配,如果我们采用add的方式,无论如何只会附加规则至每条防火墙规则链的底部,所以这里采用insert方式。

          openclash链

          openclash_mangle链

          openclash_mangle_output链

           
          添加完成之后,在Openclash的页面进行重置所有链接,同时观察是否有匹配国内IP的流量进入列表,如果没有即表示成功。同时在OpenWRT的防火墙页面,应该可以找到我们添加的规则以及对应规则匹配的计数,通过这个也可以观察是否绕过成功。
          notion image

          配置OpenClash自定义防火墙规则

          为了避免每次OpenClash重启或者路由器重启后需要手动重复执行nft命令,我们可以将上述三条规则写入到openclash的自定义规则里面。配置位置位于:插件设置 - 开发者选项
          notion image

          关于IPV6

          由于openclash的实验性:绕过中国大陆IPv6不完全依赖于dnsmasq,所以可以放心开启,不用做特别的配置。

          关于规则更新

          由于目前使用的是大陆白名单提供的IP地址集,所以可以通过OpenClash提供的Web端页面进行更新,也可以在页面配置定时更新,不必过多担心IP地址变化带来的白名单错乱。之后我也会尝试使用GEOIP:CN作为IP集进行研究。

          已知问题

          会使之前配置的DNS防泄漏无效,目前还在研究是哪个环节出现的问题。

          🤗 总结归纳

          这次主要折腾的原因在于很羡慕Dae的直连性能,但是还没有把Dae放在生产环境真正的使用过,所以想看看有没有什么办法在不使用dnsmasq,仅通过防火墙进行一些修改,让mosdns+openclash这套配置更为完善,同时也能让自己更为熟悉fw4、nftable以及OpenWRT的防火墙配置。
          通过上面对nft命令以及规则的了解,也可以通过nft进行局域网设备的黑名单配置,使特定设备流量不进入到Clash(Mihomo)内核,避免违反机场的TOS规则,例如BT、PCDN等等。

          📎 参考文章

           
          💡
          有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

          NieR Automata Ver 1.1a

          2023年5月6日 08:00
          ⚠️
          《尼尔:自动人形 Ver1.1a》是一部备受期待的动画作品,改编自广受好评的游戏《尼尔:机械纪元》。由A-1 Pictures制作,益山亮司执导。该动画于2023年1月7日开始播出,融合了科幻、哲学、动作元素与二次元,完美呈现了原作游戏的魅力和性癖。本文提供最新的第八集更新信息,包括高清下载链接和字幕资源。无论是游戏粉丝还是动画爱好者,这部2023年的热门作品都值得一看。
          notion image

          NieR Automata Ver 1.1a介绍

          《尼尔:自动人形 Ver1.1a》是根据史克威尔·艾尼克斯与白金工作室联合开发的同名游戏改编的电视动画,由A-1 Pictures负责制作。该动画分为两季,第一季于2023年1月7日至7月23日播出,全12集;第二季则于2024年7月5日首播,同样为12集。
          故事设定于西历5012年,地球遭受外星人及其制造的机械生命体入侵,导致濒临灭绝的人类逃亡至月球。为夺回地球,人类发起了"人造人反攻作战",但面对无限增殖的机械生命体陷入僵局。新型人造人部队"寄叶"作为最终兵器被派遣至地球,其中主角2B与先行调查员共同投入战场。动画聚焦于这场生存与机械的冲突中人造人部队的作战过程,延续了游戏关于战争本质、生命意义等哲学命题的探讨。
          该动画最初在BS11及TOKYO MX平台首播,英文标题为《NieR:Automata Ver1.1a》,日文标题为《ニーア オートマタ Ver1.1a》,中文标题为《尼尔:自动人形 Ver1.1a》。作品通过改编游戏《尼尔:机械纪元》剧情,结合动画表现手法延续了原作特有的末世氛围与科幻美学。

          友情提示!Netflix也可以看的!已经上Netflix了!合租可以看这里:

          三周没更新啦!!!!想念A2!!!!

          【NEW】第八集:[ANi] NieRAutomata Ver11a - 尼爾:自動人形 Ver1.1a - 08 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]

          INFO
          Info By: ANi API (Auto Generated)Subtitle: HardSub 中文繁体Mediainfo: Resolution: 1080P Video Format: AVC Audio Format: AAC

          第七集:[神楽坂 まひろ] 尼爾:自動人形 Ver1.1a / NieR:Automata Ver1.1a - 07 (CR 1920x1080 AVC AAC MKV)

          Information:
          Overall Bit Rate: 8 186 kb/s字幕: Deutsch (Germany), English (US), Español (Latin America), Español (España), Français (France), Italian (Italy), Português (Brasil), Русский (Russia), 中文(简体)| 繁化姬, 中文(繁體)时长: 00:23:41.660CRC32: BACE4467MediaInfo
          中文字幕需要手动调整,提前5秒钟左右。后续更新字幕组版本。
          默认屏蔽迅雷客户端。
          织梦字幕组版本为:[织梦字幕组][尼尔:机械纪元 NieR Automata Ver1.1a][07集][1080P][AVC][简日双语]
          织梦字幕组

          第六集:[NanakoRaws] NieR Automata Ver 1.1a - 06 (1080p).mp4

          阿里云盘中为4K版本
          织梦字幕组

          第五集:[NanakoRaws] NieR Automata Ver 1.1a - 05 (1080p).mp4

           
          #尼尔:机械纪元 动画版 尼尔:人工生命
          💡
          有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

          RouterOS如何直接访问光猫

          2025年1月19日 08:00
          😀
          最近在折腾IPTV的时候发现,每次都需要拔掉PVE上连接电脑端口的网线,插到光猫上才能访问光猫的管理页面,过程太麻烦,所以整理了一下RouterOS(ROS)如何在不插拔网线的情况下,直接访问光猫的管理页面方法,供大家参考。

          📝 RouterOS直接访问光猫教程

          前置条件

          这里的前置条件是我目前的网络情况,供参考
          • 光猫使用桥接模式,由RouterOS进行拨号
          • 光猫管理地址为192.168.1.1
          • RouterOS及家庭局域网的网段位于10.0.0.0/24
          • RouterOS连接光猫的端口为ether4

          配置方法

          简单的配置方法为使用RouterOS的终端(Terminal),通过输入以下命令执行:
          这段代码的意思是为ether4端口添加一个IP地址,为192.168.1.2,属于192.168.1.0网段,同时添加注释ONT,也就是光猫。
          这段代码的意思是将来自10.0.0.0/24网段的流量,通过ether4接口转发到目标地址192.168.1.1,并对源地址进行伪装(NAT)。NAT伪装(masquerade)会将源地址替换为ether4接口的IP地址,从而实现内部网络访问外部网络的功能。

          🤗 总结归纳

          这个RouterOS直接访问光猫的教程很简单,只需要两条命令,但需要注意的是,上面创建的RouterOS防火墙规则建议放在靠后的的位置,避免因为RouterOS防火墙规则优先级问题导致未知错误。
          另外RouterOS最新发布了7.17版本,改动还挺多的,Winbox 4.0也进行了更新,目前版本为beta 16

          📎 参考文章

          💡
          有关RouterOS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

          OpenWRT 软件源整理

          2024年10月15日 08:00
          😀
          这篇文章主要是用于个人记录,在每次重装OpenWRT后都均需要手动去替换软件源,加快软件列表更新速度和软件安装速度,正好整理出来,供网友自行取用。内容已经经过筛选,目前2024年10月15日均处于可访问使用状态。

          📝 OpenWRT软件源

          OpenWRT官方镜像站

          1. OpenWRT官方下载站点
            • URL: https://downloads.openwrt.org/
            • 这是 OpenWRT的主站点,提供所有官方版本的固件和软件包。该站点是获取最新稳定版、开发版(snapshot)和历史版本的主要来源。
            1. OpenWRT官方GitHub仓库
              • URL: https://github.com/openwrt/openwrt
              • 虽然主要用于代码存储和开发,但也提供了一些资源和文档链接。
              1. OpenWRT Cloudflare镜像仓库
                • URL: https://mirrors.cicku.me/openwrt/
                • 使用CDN (Cloudflare)的镜像,由cicku.me提供,并获得官方认可。

                OpenWRT国内镜像站

                1. 清华大学开源软件镜像站
                  • URL: https://mirrors.tuna.tsinghua.edu.cn/openwrt
                  • 提供了OpenWRT各个版本的镜像,非常稳定和快速。
                  1. 中科大开源镜像站
                    • URL: https://mirrors.ustc.edu.cn/openwrt
                    • 也是一个非常可靠的镜像源,提供OpenWRT的各个版本。
                    1. 阿里云开源镜像站
                      • URL: https://mirrors.aliyun.com/openwrt
                      • 提供稳定的OpenWRT镜像下载服务。
                      1. 重庆大学开源镜像站
                        • URL: https://mirrors.cqu.edu.cn/openwrt/
                        • 同样是一个可以选择的国内镜像源。
                        1. 南京大学开源镜像站
                          • URL: https://mirror.nju.edu.cn/openwrt/
                          • 提供了OpenWRT的多版本支持。
                          1. 上海交通大学开源镜像站
                            • URL: https://mirror.sjtu.edu.cn/openwrt/
                            • 提供稳定的开源软件镜像服务。
                            1. 兰州大学开源镜像站
                              • URL: https://mirror.lzu.edu.cn/openwrt/
                              • 提供多个开源项目的镜像下载。界面有点意思。
                              1. 浙江大学开源镜像站
                                • URL: https://mirrors.zju.edu.cn/openwrt/
                                • 提供多种开源软件项目的镜像。
                                1. 腾讯云开源镜像站:
                                  • URL: https://mirrors.cloud.tencent.com/openwrt/
                                  • 提供稳定的OpenWRT镜像下载服务。

                                  OpenWRT个人镜像站

                                  1. OpenWRT.AI软件仓库:
                                    • URL: https://dl.openwrt.ai/
                                    • Kiddin9的自建软件仓库,目前只支持OpenWRT 23.05版本。

                                    如何选择和使用OpenWRT软件源镜像站

                                    在OpenWRT路由器上配置官方软件源通常不需要额外操作,因为默认情况下,OpenWRT已经配置了官方软件源。只需运行opkg update命令以确保软件包列表是最新的。同时也不建议频繁对系统默认软件进行更新,除非有可感知的性能问题。
                                    要使用这些镜像源,您需要修改OpenWRT路由器上的OPKG软件源,可以查看 /etc/opkg/customfeeds.conf 文件,确保根据您所使用的OpenWRT版本和设备架构进行正确配置。

                                    OPKG配置示例

                                    将上述内容中的https://mirror.bjtu.edu.cn/openwrt/替换为你想要使用的OpenWRT软件源地址,同时注意后面的<Version>为版本号,需要修改为你OpenWRT的版本号,<architecture> 为系统架构,需要修改为你对应的系统架构,例如X86_64

                                    常见OpenWRT架构

                                    可以通过下面的代码进行系统架构查看,表格内为常用架构。
                                    指令集
                                    架构 / 子架构
                                    OpenWrt软件包结构
                                    arm64/genericlayerscape/64b
                                    aarch64_armv8-a
                                    arc770/generic
                                    arc_arc700
                                    archs38/generic
                                    arc_archs
                                    ARM
                                    brcm2708/bcm2708
                                    arm_arm1176jzf-s_vfp
                                    ARM
                                    at91/legacymcs814x/genericmxs/generic
                                    arm_arm926ej-s
                                    ARM
                                    ipq806x/generic
                                    arm_cortex-a15_neon-vfpv4
                                    ARM
                                    at91/sama5d3
                                    arm_cortex-a5
                                    ARM
                                    brcm2708/bcm2710
                                    arm_cortex-a53_neon-vfpv4
                                    ARM
                                    mediatek/generic
                                    arm_cortex-a7
                                    ARM
                                    brcm2708/bcm2709
                                    arm_cortex-a7_neon-vfpv4
                                    ARM
                                    sunxi/generic
                                    arm_cortex-a8_vfpv3
                                    ARM
                                    bcm53xx/genericlayerscape/32b
                                    arm_cortex-a9
                                    ARM
                                    imx6/genericzynq/generic
                                    arm_cortex-a9_neon
                                    ARM
                                    mvebu/genericomap/generic
                                    arm_cortex-a9_vfpv3
                                    ARM
                                    gemini/raidsonicgemini/wiligear
                                    arm_fa526
                                    ARM
                                    oxnas/generic
                                    arm_mpcore
                                    ARM
                                    cns3xxx/generic
                                    arm_mpcore_vfp
                                    ARM
                                    kirkwood/generic
                                    arm_xscale
                                    ARM
                                    ixp4xx/genericixp4xx/harddisk
                                    armeb_xscale
                                    MIPS64
                                    malta/be64
                                    mips64_mips64
                                    MIPS64
                                    octeon/generic
                                    mips64_octeon
                                    MIPS64
                                    malta/le64
                                    mips64el_mips64
                                    MIPS
                                    ar71xx/genericar71xx/nandar71xx/mikrotiklantiq/xrx200lantiq/xwaylantiq/xway_legacymalta/be
                                    mips_24kc
                                    MIPS
                                    adm5120/router_beath25/genericbrcm63xx/genericbrcm63xx/smp
                                    mips_mips32
                                    MIPS
                                    malta/leramips/rt305xramips/mt7620ramips/mt7621ramips/mt7628ramips/mt7688
                                    mipsel_24kc
                                    MIPS
                                    brcm47xx/mips74kramips/rt3883
                                    mipsel_74kc
                                    MIPS
                                    adm5120/router_leadm5120/rb1xxadm8668/genericar7/genericar7/ac49xau1000/au1500au1000/au1550brcm47xx/genericbrcm47xx/legacyrb532/genericxburst/qi_lb60
                                    mipsel_mips32
                                    MIPS
                                    ramips/rt288x
                                    mipsel_mips32r2
                                    PPC
                                    ppc44x/generic
                                    powerpc_440
                                    PPC
                                    apm821xx/nandapm821xx/sata
                                    powerpc_464fp
                                    PPC
                                    mpc85xx/generic, mpc85xx/p1020
                                    powerpc_8540
                                    x86
                                    x86/geode
                                    i386_geode
                                    x86
                                    x86/legacy
                                    i386_i486
                                    x86
                                    x86/generic
                                    i386_pentium4
                                    x86_64
                                    x86/64
                                    x86_64

                                    命令行替换OPKG软件源

                                    或者通过命令行方式进行修改,格式为s,[原来的软件源地址],[替换的软件源地址],g
                                    替换完成后通过opkg update进行更新。

                                    注意事项

                                    OpenWRT官方版软件源并不一定完全匹配第三方定植后的固件,例如esir、Leon大佬等定制的固件,可能存在库不全或兼容问题。同时官方版本软件源提供的k-mod-*.ipk 软件包也可能存在无法直接安装的情况。
                                    如果你是一个新手,或者只想将OpenWRT系统配置起来养老,那么推荐使用ImmortalWRT,在软件源支持方面可能会更好一些,同时也可以自定义配置国内软件源immoralwrt-opkg-replace-edu-mirror
                                    在最新的快照版本中,OpenWRT已经使用apk包管理器替换opkg,更换软件源时需要注意版本。不推荐新手或者小白使用快照版本(SNAPSHOT)或者RC版本,同时也不建议使用非开源第三方固件。

                                    📎 参考文章

                                     
                                    💡
                                    有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    RouterOS使用OSPF智能分流国外流量

                                    2024年10月3日 08:00
                                    😀
                                    前一篇文章尝试使用RouterOS Address List配合防火墙Mangle的Prerouting规则进行国内外流量的自动分流,效果还不错,秉承着不把家里网络搞塌就不算完的态度,我又尝试寻找更好(更复杂)的分流方法,原来在2020年就已经有人在使用Ospf进行路由表分流,那我也来尝试配置一下看看。在通过ospf分流后,我的旁路网关这时候才真的称得上是一个旁路由,因为真的在进行路由路径的分流。

                                    📝 OSPF介绍

                                    OSPF(开放最短路径优先)是一种常用的路由协议,一般用于大型企业和网络服务提供商的网络中,家庭网络使用有点杀鸡用牛刀。它的主要功能是通过路由器的路由功能,为网络内的客户端找到通往目标网络的最短路径,并自动更新这些路径信息。OSPF的工作原理是通过收集整个网络的路径信息,然后使用一种算法计算出到每个目的地的最优路径。当网络中的某条线路发生变化时,OSPF可以迅速做出调整,保证数据能够继续以最快的方式传输。

                                    📝 配置背景

                                    整体是All In One(All in Boom),采用Proxmox VE(PVE)虚拟机方式,以下所有设备均在Proxmox VE(PVE)内。
                                    • 主路由器:RouterOS(ROS)
                                      • 光猫桥接模式,通过PPPoE Client建立pppoe-out1建立拨号,并通过指定AC Bras的方式,获取公网IPv4地址和公网IPv6地地址。
                                      • 4个网口,分别为eth1 ~ eth4,其中eth4作为WAN口与光猫物理连接,pppoe-out1也是这个接口; 其他三个接口建立桥接,为bridge1,变成类似交换机的模式。
                                      • 版本为7.16(Stable),目前已经更新至7.18(Stable)
                                    • 旁路由(旁路网关):Debian 12(Linux debian 6.1.0-30-amd64)
                                      • 接口为ens18,网关为主路由bridge1地址
                                      • 运行DAED作为科学上网服务

                                    📝 配置指南

                                    Debian配置

                                    开启IPv4及IPv6转发

                                    打开/etc/sysctl.conf 确认包括以下内容,并没有被注释:
                                    如果进行了修改,需要通过sysctl -p 命令使其生效。

                                    安装Bird2及配置

                                    在网络中使用OSPF协议时,需要一个路由守护进程来实现其功能,Bird2作为轻量且高性能的解决方法,同时支持IPv4及IPv6路由表。Bird2是一款支持多种路由协议的软件,广泛使用于Unix类系统,例如Linux和FreeBSD,在大多数常见系统中均可找到安装及使用方法。
                                    • 通过apt进行安装:
                                    bird2安装完成后默认为运行状态,我们需要先将其关闭:
                                    • 编辑Bird2配置文件:
                                    Deiban系统在安装Bird2后,配置文件默认存放位置位于/etc/bird/bird.conf ,需要对其编辑。
                                    配置说明如下:
                                    1. log syslog all;
                                    • 作用:将BIRD的所有日志输出到系统日志(syslog),可以通过journalctl -xeu bird 进行bird日志查看
                                    2. router id 10.0.0.10;
                                    • 作用:定义了BIRD路由器的标识(Router ID),Router ID是一个唯一的IPv4地址形式,需要自行更改配置为自己旁路由(旁路网关)的IPv4地址
                                    3. protocol device { scan time 60; }
                                    • 作用device协议的配置,负责发现和监控网络接口的状态。scan time 60;表示BIRD每60秒扫描一次所有网络接口,以更新接口状态信息。
                                    4. protocol kernel { ipv4 { import none; export none; }; } 和 protocol kernel { ipv6 { import none; export none; }; }
                                    • 作用kernel协议用于在BIRD的路由表和操作系统的内核路由表之间同步路由信息。
                                      • import none:不从内核路由表导入路由信息。
                                      • export none:不将BIRD中的路由信息导出到内核路由表。
                                      • 禁止BIRD与操作系统的内核交换任何路由信息,完全独立管理IPv4和IPv6的路由表,避免将Bird的静态路由信息导入到内核路由表造成本地回环,同时减少内核路由表内路由规则数目,便于进行debug。
                                    5. protocol static { ipv4; include "/etc/bird/routes4.conf"; } 和 protocol static { ipv6; include "/etc/bird/routes6.conf"; }
                                    • 作用static协议用于定义静态路由。静态路由不会根据网络拓扑的变化自动更新,需要手动配置。
                                      • ipv4:该协议块是针对IPv4的静态路由。
                                      • ipv6:该协议块是针对IPv6的静态路由。
                                      • include "/etc/bird/routes4.conf";:从指定的文件/etc/bird/routes4.conf中导入IPv4静态路由配置。
                                      • include "/etc/bird/routes6.conf";:从指定的文件/etc/bird/routes6.conf中导入IPv6静态路由配置。
                                    6. protocol ospf v2 { ... }
                                    • 作用:这部分配置定义了OSPFv2(用于IPv4)的路由协议。
                                      • ipv4 { export all; }:将BIRD中的所有路由信息导出到OSPFv2,供其他OSPF路由器学习。
                                      • area 0.0.0.0:配置OSPF的区域,这里是骨干区域0.0.0.0。在OSPF中,所有非骨干区域必须通过骨干区域连接。
                                      • interface "ens18" { type pointopoint; }:指定OSPFv2在接口ens18上运行,并且接口类型为点对点(point-to-point)。点对点类型通常用于没有中间广播域的直接链路。
                                      • 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。
                                    7. protocol ospf v3 { ... }
                                    • 作用:这部分配置定义了OSPFv3(用于IPv6)的路由协议。
                                      • ipv6 { export all; }:将BIRD中的所有路由信息导出到OSPFv3,供其他OSPF路由器学习。
                                      • area 0.0.0.0:配置OSPF的区域,和OSPFv2一样,这里也是骨干区域0.0.0.0
                                      • interface "ens18" { type pointopoint; }:指定OSPFv3在接口ens18上运行,类型为点对点,和OSPFv2的配置类似。
                                      • 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。

                                    生成静态路由规则

                                    与上一篇文章RouterOS自动分流方案(支持IPv4 & IPv6)所使用的方式不同,这次我们需要生成所有非中国大陆地区的IPv4和IPv6地址信息,在Github上有dndx/nchnroutes: !chnroutes - chnroutes negated可以使用。
                                    • 克隆仓库
                                    • 编辑Produc.py
                                    在第10行附近,修改—next后的default参数wg0为自己的旁路由(旁路网关)接口名称, 例如我的是ens18,就改成ens18
                                    2024年12月28日更新:
                                    删除48行IPv4Network('172.16.0.0/12')的保留地址,或者替换为172.24.0.0/13,避免影响Cloudflare访问。原因在于Cloudflare IP Range中包括:172.64.0.0/13 这个地址范围,如果将IPv4Network('172.16.0.0/12') 配置为保留地址,那么Cloudflare所使用的172.64.0.0/13 也会被标记为直接从主网关出去,不需要经过旁路网关,所以会出现部分使用Cloudlfare CDN的网站无法访问的情况,例如Linux.do
                                    另外,更换china_ip_list上游地址,原来的17mon的国内ip地址表太久未更新,存在地址范围错误,无法应对墙中墙(各种ISP运营商反诈劫持)的情况。
                                    • 编辑Makefile
                                    取消5、6、7行的注释。因为使用的是Bird2,没有Birdc6命令,所以不做修改。
                                    • 生成静态路由表
                                    需要确保你已经安装make,如果没有安装可以通过apt install make进行安装,然后执行:
                                    返回结果:
                                    即表示Bird2生成OSPF动态路由表成功。
                                    • 确认Bird2状态
                                    执行systemctl status bird.service来查看bird2的运行状态:
                                    如果Active处于inactive状态,需要手动执行systemctl start bird.service
                                    • 确认Bird2路由表状态
                                    执行命令birdc show route protocol static1查看IPv4路由表,返回结果太多,大概是如图:
                                    notion image
                                    执行命令birdc show route protocol static2查看IPv6路由表:
                                    notion image
                                    到这里Debian(旁路网关)的Bird2配置完成,下面可以开始进行RouterOS配置

                                    RouterOS配置

                                    在WinBox中点击左侧菜单Routing进行配置

                                    Router ID配置

                                    点击RoutingRouter ID进行配置。 Name自己喜欢填什么就填什么,ID填写RouterOS的地址,Dynamic ID选择only vrfSelect From VRF选择main,点击OK提交。
                                    notion image

                                    OSPF配置

                                    点击RoutingOSFP进行配置
                                    Instances配置
                                    点击New新建,填入Name(自己根据喜好填),也可以默认根据我的来。Version版本选择2,VRF使用main表,Router ID选择刚刚创建的main,或者直接输入RouterOS的IP地址。其他不动。
                                    notion image
                                    如果你使用IPv6,那么需要再新建一个Instances,Version选择为3,其他的一样。
                                    notion image
                                     
                                    Areas配置
                                    点击Areas,点击New新增一个AreaName随便,Instance选择刚刚创建IPv4的Instance(Version版本为2),Area ID为0.0.0.0 ,Type为default ,其他不用填写。
                                    notion image
                                    同样,如果你需要使用IPv6,那么也需要新建一个Area,并在Instance中选择刚刚创建的Version版本为3的Instance。
                                    notion image
                                     
                                    Interface Templates配置
                                    点击Interface Templates,点击New新增一个模板。Area选择刚刚创建的IPv4的区域,Network Typeptp(点对点,因为我们只有两个点),Cost10Priority32,其他的不用管。
                                    notion image
                                    同样,如果使用IPv6再新建一个Templates,Area选择IPv6的区域
                                    notion image
                                     
                                    查看结果
                                    上述配置完成后,点击Neighbors进行节点匹配查看,如果正常的话,应该可以发现Debian(旁路网关)上配置Bird2的节点:
                                    notion image
                                    同时在IPRoutes中应该可以看到Debian(旁路网关)上Bird2发送过来的状态为DAo的路由表(D代表动态,A是活动状态,o为ospf)
                                    notion image
                                     

                                    避免路由环路配置

                                    在以上配置完成后,在我们访问国外流量时会发生环路,即客户端 → RouterOS → Debian旁路网关 → RouterOS → Debian旁路网关… 不断的循环,所以需要对来源为Debian(旁路网关) 的流量进行特殊处理,这里又要用到我们的老朋友Mangle。
                                    1. 首先在Routing - Tables新建一个路由表,名为bypass,并勾选FIB:
                                    notion image
                                    1. IP → Firewall → Managle新建规则,并将规则移动到最上方,处于高优先级:
                                    • General
                                      • Chain: prerouting
                                      • In.Interface: bridge1
                                    • Advanced
                                      • Src.MAC Address: Debian旁路由(旁路网关)的网卡MAC地址
                                    • Action
                                      • Action: Mark Routing
                                      • New Route Mark: 选择刚刚新建的Bypass
                                     
                                    notion image
                                    1. 如果你需要使用IPv6的话,在IPv6 → Firewall → Mangle也新建一条一样的规则,同时将规则移动到最上方,处于高优先级。目前已知规则如果位于MSS钳制规则后,会导致mark routing标记无效。
                                    1. 配置Bypass路由表内路由规则
                                    1. 如果发现配置后从旁路由(旁路网关)Ping不通主路由RouterOS或者无法访问,提示Destination Host Unreachable或者Redirect Host(New nexthop: 10.0.0.1),可以在Dst.Address添加一项局域网地址范围,例如我的10.0.0.0/24 ,并点击前面空白方块出现“”,即目标地址不为局域网地址的流量。这样旁路由在使用Tailscale时候也可以正确的访问局域网内其他设备。
                                    通过以上规则,在来源为Debian旁路由(旁路网关)的流量进入到RouterOS后,使用bypass路由表进行路由,默认这个表是空的,也就是无法对流量进行路由,所以会断网,我们需要添加一些默认的规则进去,基本照抄main表的默认规则就行:
                                     
                                    • 新建IPv4局域网路由规则
                                      • Dst.Address: 局域网IP地址范围,如果你是主路由是192.168.1.1 ,那么这里写192.168.1.0/24
                                      • Gateway: 填写网桥地址,例如我的是bridge1 ,也是RouterOS建立网桥时默认名字
                                      • Distance: 1
                                      • Routing Table: bypass
                                      • notion image
                                     
                                    • 新建IPv4广域网路由规则
                                      • Dst.Address: 0.0.0.0/0
                                      • Gateway: 填写PPPoE拨号接口名称,例如我的是pppoe-out1
                                      • Distance: 1
                                      • Routing Table: bypass
                                    notion image
                                     
                                    如果你没有公网IP,运营商分配给你的是一个大内网的IP地址(100.x.x.x),可能需要手动添加一条指向大内网网关的路由规则。 由于每次拨号后IP地址会变,运营商内网的网关也会变,所以需要使用RouterOS的脚本进行定时检查和修改:
                                    • 新建IPv6局域网路由规则
                                      • Dst.Address: fe80::/64%bridge1
                                      • Gateway: 填写网桥接口名称,例如我的是bridge1
                                      • Distance: 1
                                      • Routing Table: bypass
                                    notion image
                                    然后依葫芦画瓢,把其他相关的fe:: f*:: 的内网路由规则添加进去
                                    • 新建IPv6广域网路由规则
                                      • Dst.Address: ::/0
                                      • Gateway: 填写PPPoE接口名称,例如我的pppoe-out1
                                      • Distance: 1
                                      • Routing Table: bypass
                                    notion image
                                    但是这样配置完成后,我们的IPv6还是没有办法访问互联网,通过与main表比对发现,因为缺少一条上级网关的地址:
                                    notion image
                                    但是这个地址是动态的,所以我们需要通过一个RouterOS脚本来进行动态处理:
                                    • 新建Routing Rule规则
                                    由于RouterOS的IPv6路由表使用时,会同时对main表和bypass表进行查询,所以需要添加一条Routing规则,使已经标记routing mark的连接只使用bypass表进行查询,从而避免由于路由表多表查询所产生的环路问题:
                                    选择Routing → Rules → New, 如图填写:
                                    notion image
                                    需要注意的点就一个:一定在Action选择lookup only in table,即针对Routing Mark为bypss的连接只使用bypass表查询。
                                    如果你找不到这个界面,那么也可以使用命令方式添加:
                                    至此,RouterOS部分的全部配置完成,同时整体的基于OSPF动态路由的国内外分流也已经完成。但分流的基础还是基于IP地址,所以需要使用无污染的DNS公共服务器,同时尽量使用DOH、DOT等方式进行查询,避免运营商的DNS劫持。

                                    🤗 总结归纳

                                    相比上一篇使用的Address List方式,因为是直接查询路由表,不用对目标IP进行取反匹配,而且不用对所有流量进行mangle标记,仅需要对来源旁路由的流量进行标记处理,在系统性能占用上会少一些,同时也可以开启RouterOS的fast forward功能、fast track功能以及fast path,进一步降低CPU对流量处理所需资源,N4100在Fast.com300M跑满时CPU占用30%左右,内网2.5G跑满CPU占用不到10%。而且避免了旁路由(旁路网关)挂断之后国外网站完全无法访问的情况。
                                    我认为即便是在使用Dae这种直连效率非常高的透明代理解决方案的情况下,直连流量尽可能的不经过旁路由(旁路网关)才是最佳的效率选择,所以相比使用Mihomo或者其他的软件,在分流规则的第一层通过路由表方式将国内流量直接发出去才能避免产生更多的问题(例如NAT等等等)并获得最佳的访问速度。
                                    至于为什么要实用RouterOS来做,当然是因为RouterOS相对来说配置起来更为顺手,稳定性更好一些。当然,这些通过OpenWRT也可以实现。

                                    📎 参考文章

                                     
                                    💡
                                    有关旁路由(旁路网关)安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    RouterOS自动分流方案(支持IPv4 & IPv6)

                                    2024年9月30日 08:00
                                    😀
                                    随着更换了路由方案,我也用上了MikroTik RouterOS作为主路由,但依然没有更换主路由 + 旁路网关(旁路由)的整体网络拓扑。为了加强国内网站及服务的访问速度,同时减少网关跃点,也就通过RouterOS的防火墙和路由功能做了一些分流配置。目前Google到的大部分都是IPv4部分的分流配置,IPv6部分的内容很少,自己的配置过程中也遇到了一些坑,整理一下,作为参考。

                                    📝 背景

                                    为什么使用RouterOS(ROS)作为主路由

                                    1. 我所使用的主路由还是ASUS-ACRH17,已经是6年前的设备,刷了OpenWRT。尽管OpenWRT有SFE功能,但是CPU的处理性能已经落后太多。同时我又有2.5G网络的需求,千兆网络已经不太满足于我的内网使用需求,在添加一个2.5G交换机和更换主路由为支持2.5G的软路由之间,我选择了后者。现在的ASUS-ACRH17已经刷了集客AP固件,踏踏实实的去做一个安静的AP了。
                                    1. 一直听闻RouterOS作为商用路由系统在流控方面做的很好,也相对完善。OpenWRT已经玩的差不多了,尝试一下新的东西。
                                    1. 其他路由系统我也有调研和尝试,例如Opnfense,但是在IPv4的NAT方面做的不是很好,即便经过配置,NAT类型稳定在FullCone(全锥)也很难。
                                    1. 作为主路由,要稳定且可控。
                                    当然RouterOS与OpenWRT相比也有一些问题,上手难度较高,配置项复杂。另外最明显的就是在NAT方面,在电信大内网(CGNAT)的情况下,原来OpenWRT开启DMZ可以获得映射公网的NAT级别,现在用RouterOS最高到FullCone全锥,不过这个可以通过指定AC Name选择Bras解决。

                                    为什么要在RouterOS进行分流

                                    旁路由我认为是在国内环境下满足基本需求的同时,兼容多种服务,扩展性和稳定性综合考虑最好的方案。但是旁路由这种拓扑下本身也存在问题:国内网站及服务的访问速度和非对称路由。
                                    一般来说,我们正常访问国内网站的跃点应该是这样的:
                                    notion image
                                    就像这样:
                                    notion image
                                    第一跳为本地路由地址,第二跳为运营商的区域网关地址。但是在具有旁路由(旁路网关)的环境下变成:
                                    整体链路请求需要内网两个网关的跃点,第一跃点为旁路网关,第二跃点为主路由网关,尽管内网速度很高,延迟很低,但是还是因为数据多了一层的处理,即便是开启绕过中国大陆IP相关功能,也还是会产生影响。
                                    notion image
                                    而网站/服务的响应请求返回时,在主路由层面直接可以路由到客户端,不再经过旁路由(旁路网关),这就造成了非对称路由问题,在家庭层面可能日常使用感觉不出,但是偶尔一些小小的奇怪问题排查起来也会非常的难受,尤其是存在NAT(网络地址转换)的情况下。
                                    还有由于在IPv6网络环境下,局域网内客户端会把RA服务器作为默认网关,在原有双OpenWRT情况下会存在两个RA服务器,或者客户端实际上并没有正确通过旁路由的RA服务器进行配置,出现类似于网心云IPv6待连通的情况,通过RouterOS一个RA服务器并进行IPv6国内外地址分流,也可以一并解决掉。
                                    所以,这次方案的目标就是:
                                    1. 实现国内网站只需要经过主路由一层网关。
                                    1. 实现对称路由。避免因为非对称路由产生的防火墙失效以及合法连接误判为非法而丢弃问题。
                                    1. 完成基于IPv6的地址科学上网分流

                                    📝 配置指南

                                    网络基本配置

                                    这部分基本是RouterOS的基础配置,包括IP地址范围、IPv4 DHCP服务器、IPv6地址获取、IPv6 ND等部分。

                                    IP地址配置

                                    主要是配置RouterOS的本地地址,例如我的是10.0.0.1
                                    notion image

                                    IPv4 DHCP配置

                                    主要配置内容在Network下, 配置下发的默认网关和DNS。默认网关配置为RouterOS的本地地址即可,DNS服务器配置为旁路由(旁路网关)地址,由旁路由(旁路网关)上的代理软件或者MosDNS这种软件提供DNS请求的解析。
                                    notion image

                                    IPv4 DNS配置

                                    RouterOS的DNS服务器配置意义不大,只是用来进行一些类似*.arpa*.lan 这种本地服务的DNS请求解析。开启就勾选Allow Remote Requests,关闭就取消勾选。上游DNS选择一个可靠,尽量无污染的公共DNS服务。如果家里没有设备默认使用DHCP分类的网关作为DNS服务器的话,也可以不填写。

                                    IPv6 地址获取

                                    正常RouterOS通过PPPoE获取的配置就可以,网上一搜一大把。

                                    IPv6 ND

                                    需要注意的就是IPv6 ND中需要将DNS Server配置为旁路网关地址,勾选Advertise MAC AddressAdvertise DNS两个选项。
                                    notion image
                                    Managed Address Configuration不勾选,不需要通过DHCPv6进行IPv6地址的配置,全部都用SLACC就可以了,这样Android设备也没问题,也不用再配置DHCPv6服务,省事。
                                    Other Configuration不勾选,既然已经不需要DHCPv6服务器了,那么也就没有必要通知客户端从DHCPv6服务器获取其他配置信息,全部走SLACC无状态就可以了。

                                    添加路由表

                                    左侧Routing → Tables,新建一个路由表,名字自己随便写,我这里写的bypass,后面配置防火墙Mangle表Prerouting规则时会用到。
                                    • Enable: 勾选
                                    • FIB: 勾选
                                    在RouterOS(尤其是 MikroTik 设备)中,FIB的全称是Forwarding Information Base(转发信息库)。它是网络设备(如路由器、交换机)中关键的转发决策模块,与RIB(Routing Information Base,路由信息库)共同构成数据包转发的核心逻辑。

                                    其他设置

                                    采用Mangle进行路由标记并进行静态路由方式,需要关闭RouterOS的fast pathfast track以及fast forward,否则部分连接可能无法正确被进行路由标记,导致分流错误。关闭后会对转发性能有所影响,采用静态路由方式无法避免,如果需要内网的高转发性能,建议增加交换机。
                                    • Fast Forward关闭位置位于左侧菜单栏 → Bridge → 双击Bridge
                                    notion image
                                    • Fast Path关闭位置位于左侧菜单栏 → Bridge → Configuration → Settings
                                    notion image
                                    • Fast Track没有关闭入口, 需要确认IP和IPv6防火墙filter表中没有fasttrack-connection 相关规则即可。
                                    同时,如果是X86软路由方式使用RouterOS,建议将HW Offload 也关闭,因为X86软路由没有硬件转发芯片。

                                    OpenWRT旁路网关(旁路由)配置

                                    关闭所有的DHCP服务,关闭所有的IPv6 RA服务,也就是不管WAN口、LAN口、还是LAN6接口,DHCP服务器中的IPv6设置全部配置为禁用。

                                    IPv4自动分流

                                    RouterOS的分流是通过路由表和防火墙Mangle表Prerouting标记方式实现,其实理论上OpenWRT也可以实现,但是因为没有GUI,所以需要自己通过命令行方式进行路由表的导入以及防火墙路由标记等等,上手难度较高。

                                    导入IPv4路由表

                                    具体原理就是导入别人整理好的国内CN IP列表到Address List里,这里也就不搞手动敲命令导入那一套了,直接通过脚本走起:
                                    1. SystemScripts, 新建一个脚本,Name随便写,写个自己能记得住这个脚本是什么的名称。
                                    1. Source输入如下内容:
                                    具体意思就是从https://raw.githubusercontent.com/PaPerseller/chn-iplist/master/cn.rsc 下载RouterOS支持的RSC格式国内IP列表,然后导入,导入完成之后删除下载的文件并在log日志中输出update done
                                    1. Apply之后,点击一下右边的Run Script。如果没问题的话,IPFirewallAddress Lists里面应该添加了List名称为CN 的一堆地址。
                                    1. SystemScheduler,新建一个定时任务,Name一样写个自己记得这个定时任务是干什么的名称。
                                    1. One Event输入以下内容:
                                    其他内容按照图里填吧,我这里是3天执行一次。
                                    notion image
                                    1. ApplyOK,保存关闭。

                                    添加IPv4防火墙规则

                                    点击左侧IPFirewallMangle,新建一条规则,Comment随便写,只是一个备注,让你记得这条规则是用来做什么的。
                                    • General
                                      • Chain: prerouting
                                      • Dst.Address List: 下拉选择CN,然后点击前面的空白方块为 ,即目标地址不属于CN这个Address List。
                                      • Src.Address List: 非必选。源地址范围,如果不选择的话,就是默认全部。如果希望局域网内只有部分设备使用这个自动分流规则,那么可以自己去Address List添加一个列表
                                    • Extra
                                      • Dst.Address Type: 下拉选择local,然后点击前面空白方块为 ,即目标地址不属于局域网地址
                                    • Action
                                      • Action: 选择makr routing
                                      • New Routing Mark: 选择你添加的路由表,我这里是bypass
                                      • Passthrough: 勾选
                                    点击OK保存。为了避免产生路由环路,我们需要对旁路网关发送来的流量进行特殊处理,避免被路由标记。同样还是在Mangle下新建一条规则:
                                    • General
                                      • Chain: prerouting
                                      • Src.Address: 填写旁路网关的IP地址
                                      • In.Interface: 选择bridge1 ,如果桥接端口名字不是这个,那么就选你桥接端口的名称,例如Lan什么的。
                                    • Advanced
                                      • Src.MAC Address: 如果你填写了Src.Address,那么这里也可以不填写。 如果你没填写,那么这里写旁路网关的MAC地址,如果旁路网关有WAN口,那就写WAN口地址。
                                    • Action
                                      • Action:Accept
                                    到这里RouterOS的防火墙规则就配置完成,大致意思就是如果访问的目标地址不属于中国大陆的IP地址,就打上一个路由标记。如果访问的来源是旁路由(旁路网关)地址,就直接接受,不打路由标记。

                                    添加IPv4路由规则

                                    左侧菜单IPRoutes,新建一条路由规则:
                                    • Enable:勾选
                                    • Dst.Address:0.0.0.0/0
                                    • Gateway: 旁路网关IP地址
                                    • Distance:1
                                    • Scope:30
                                    • Target Scope:10
                                    • Routing Table: 最开始建立的那个路由表名称,选中即可,例如我的是bypass
                                    点击ApplyOK,保存提交。
                                     
                                    到这里,IPv4部分配置完成,可以通过tracert (Windows)或者tracerout (macOS或者Linux)分配对国内和国外网站进行路由追踪测试,测试结果应符合:
                                    • 国内:客户端 → 主路由 → …
                                    • 国外:客户端 → 主路由 → 旁路网关 → 主路由 → …

                                    IPv6自动分流

                                    IPv6自动分流的原理与IPv4的基本相同,也是通过防火墙Mangle表对连接进行Prerouting打路由标记,唯一不同的部分在于对旁路网关的特殊处理上。由于IPv6地址在下发过程中,会为每个设备都分配一个公网的IPv6地址,例如240e: 开头的这种,同时设备自身还具有一个本地链路地址,例如fe80: 这种,在进行数据传输的过程中,无法确切判定是使用的公网地址还是本地链路地址(RouterOS在这部分很模糊),我尝试通过脚本定时获取旁路网关的所有IPv6地址并加入Address List进行标记也无法正常解决,RouterOS的防火墙无法对来自旁路网关的流量直接进行Accept,最终造成路由环路,IPv6请求全部超时。但是,如果放弃三层交换方式,使用二层交换方式,设置Src.Mac Address即可正常解决环路问题。

                                    导入IPv6路由表

                                    具体原理就是导入别人整理好的国内CN IPv6列表到Address List里:
                                    1. SystemScripts, 新建一个脚本,Name随便写,写个自己能记得住这个脚本是什么的名称。
                                    1. Source输入如下内容:
                                    1. Apply之后,点击一下右边的Run Script。如果没问题的话,IPFirewallAddress Lists里面应该添加了List名称为CN 的一堆地址。
                                    1. SystemScheduler,新建一个定时任务,Name一样写个自己记得这个定时任务是干什么的名称。
                                    1. One Event输入以下内容:
                                    1. ApplyOK,保存关闭。

                                    添加IPv6防火墙规则

                                    点击左侧IPv6FirewallMangle,新建一条规则,Comment随便写,只是一个备注,让你记得这条规则是用来做什么的。
                                    • General
                                      • Chain: prerouting
                                      • Dst.Address List: 下拉选择chnroutes.ipv6,然后点击前面的空白方块为 ,即目标地址不属于chnroutes.ipv6这个Address List。
                                    • Action
                                      • Action: 选择makr routing
                                      • New Routing Mark: 选择你添加的路由表,我这里是bypass
                                      • Passthrough: 勾选
                                    点击OK保存。为了避免产生路由环路,我们需要对旁路网关发送来的IPv6流量进行特殊处理,避免被路由标记。还是在Mangle下新建一条规则:
                                    • General
                                      • Chain: prerouting
                                      • In.Interface: 选择bridge1 ,如果桥接端口名字不是这个,那么就选你桥接端口的名称,例如Lan什么的。
                                    • Advanced
                                      • Src.MAC Address: 写旁路网关的MAC地址,如果旁路网关有WAN口,那就写WAN口地址。
                                    • Action
                                      • Action:Accept
                                    到这里防火墙规则就配置完成,大致意思就是如果访问的目标地址不属于中国大陆的IP地址,就打上一个路由标记。如果访问的来源是旁路网关地址,就直接接受,不打路由标记。
                                    需要确认后面添加的旁路由规则要在路由标记规则上面。防火墙规则匹配是由上至下顺序进行。

                                    添加IPv6路由规则

                                    左侧菜单IPv6Routes,新建一条路由规则:
                                    • Enable:勾选
                                    • Dst.Address:::/0
                                    • Gateway: 旁路网关的本地链路IPv6地址 ,例如fe80::d359:6e90:0:be24:11ff:feff:ff6b
                                    • Distance:1
                                    • Scope:30
                                    • Target Scope:10
                                    • Routing Table: 最开始建立的那个路由表名称,选中即可,例如我的是bypass
                                    点击ApplyOK,保存提交。
                                     
                                    到这里,IPv6部分配置完成,可以通过tracert -6 (Windows)或者tracerout -6 (macOS或者Linux)分配对国内和国外网站进行路由追踪测试,测试结果应符合:
                                    • 国内:客户端 → 主路由 → …
                                    • 国外:客户端 → 主路由 → 旁路网关 → 主路由 → …

                                    🤗 其他脚本

                                    一个RouterOS获取所有局域网下IPv6客户端,并写入到Address List的脚本,包括客户端的公网IPv6地址,本地链路IPv6地址以及局域网IPv6地址:
                                    另外,通过使用OSPF动态路由方式实现国内及国外IP分流可以参考:《🔀RouterOS使用OSPF智能分流国外流量》;

                                    📎 参考文章

                                     
                                    💡
                                    有关RouterOS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    一键免费部署你的私人ChatGPT网页应用

                                    2023年4月9日 08:00
                                    😀
                                    一键免费部署:你只需要有一个 OpenAI API Key,就可以使用 Vercel 免费一键部署你的私人 ChatGPT 网页应用。精美的 UI:这个网页界面有响应式设计,支持深色模式,还可以识别和高亮代码块。海量的 prompt 列表:这个仓库内置了大量的中文和英文 prompt,可以帮助你启动不同主题的对话。超长对话支持:这个仓库可以自动压缩上下文聊天记录,在节省 Token 的同时支持超长对话。一键导出聊天记录:这个仓库可以让你一键导出聊天记录,完整的 Markdown 支持,方便你与他人分享。
                                    ChatGPT Next Web 是一个基于 OpenAI API 的 ChatGPT 网页界面,可以让你轻松地与 ChatGPT 交流。这个也是目前我在使用最为稳定的一个ChatGPT的网页客户端,一方面可以避免官方ChatGPT的一段时间不操作断线问题,让问答流程更顺畅,另外一方面也可以避免因为IP问题被OpenAI禁止访问,同时回答的反应速度也很快。一键多少是有点夸大的,但是在完成准备之后,真的只需要点一下Deloy。Siri什么的弱爆啦!
                                    这个仓库的主要功能有:
                                    • 一键免费部署:你只需要有一个 OpenAI API Key,就可以使用 Vercel免费一键部署你的私人 ChatGPT 网页应用。完全免费,也不用负担任何的服务器费用。
                                    • 精美的 UI:这个网页界面有响应式设计,支持深色模式,还可以识别和高亮代码块。
                                    • 海量的 prompt(提示词) 列表:这个仓库内置了大量的中文和英文 prompt,可以帮助你启动不同主题的对话。
                                    • 超长对话支持:这个仓库可以自动压缩上下文聊天记录,在节省 Token 的同时支持超长对话。
                                    • 一键导出聊天记录:这个仓库可以让你一键导出聊天记录,完整的 Markdown 支持,方便你与他人分享。

                                    部署教程

                                    1 准备好OpenAI的api key,访问:OpenAI API
                                    2 将Yidadaa/ChatGPT-Next-Web这个Repositories(仓库)Fork一份到自己GitHub的Repositories中;
                                    3 打开:Vercel,登录直接使用github账号进行登录即可,然后进入控制面板,也就是默认登录后跳转回来的页面。
                                    导入(import)自己刚刚fork的仓库;
                                    notion image
                                    Project Name随便填写,默认是Github仓库的名字,Framework Preset不要动。
                                    notion image
                                    修改Environment Variables中的参数,填写环境变量和访问密码;
                                    填写完成之后,点击Deploy即可开始部署,整个部署时间,大概在3-5分钟;
                                    notion image
                                    在部署完成之后,点击右侧的Continue to Dashboard进入控制面板;
                                    notion image
                                    Domains就是自己所部署的私人ChatGPT访问地址;
                                    notion image

                                    访问配置

                                    notion image
                                    点击左下角的设置按钮
                                    notion image
                                    找到Access Code(就是上面的Code)和API Key,将我们在部署时候配置的环境变量填入对应的输入框中,然后点击右上角的X关闭,自动保存且配置生效。
                                    Model(模型)建议不要更改,维持gpt-3.5-turbo,如果不是gpt4的api,贸然修改会出现访问被拒绝的情况:“Something went wrong, please try again later.”
                                    Temperature(随机值)调整的更高,ChatGPT会有更多的即兴发挥,也就是更具创意,但是内容的真实性会降低。
                                    Presence Penalty(话题新鲜度)调整的更高,使话题更能延伸到新的话题,但是值过高会出现文字乱码。

                                    其他问题

                                    官方版本提示:
                                    换节点,清除浏览器Cookie,使用浏览器隐私模式访问。
                                    最近不知道是因为Vercel被薅羊毛薅的太多,还是OpenAI的API资源太过紧张,ChatGPT-3-turbo的反应速度有点不太行。
                                     

                                    《怪物猎人:荒野》帧数优化指南:通过Config.ini参数调整提升帧数

                                    2025年3月3日 08:00
                                    😀
                                    《怪物猎人:荒野》(Monster Hunter Wilds)已经发售4天,Steam版本的优化一言难尽,AMD Ryzen 5600 + Nvidia RTX 3070居然高特效2K分辨率情况下,跑不到100帧,对于一款动作游戏来说很难受,而且还会伴随各种多边形渲染错误。本文将通过修改《怪物猎人:荒野》配置文件config.ini的方式,提高CPU的利用率,以及对渲染参数优化,提高游戏帧数(FPS)和狩猎体验,让铳枪真男人在龙击炮时再也不掉帧。真男人玩什么大剑,肯定要玩铳枪,能插能射还能甩。

                                    📝 《怪物猎人:荒野》config.ini修改方法

                                    Steam版本的《怪物猎人:荒野》安装后,config.ini 配置文件位于安装磁盘\SteamLibrary\steamapps\common\MonsterHunterWilds 内。
                                    使用记事本或者VS Code打开,通过Ctrl-F查找以下参数并作对应修改。
                                    我个人的电脑配置如下,目前能够满足在默认高特效情况下,开启DLSS,FPS90帧左右。前两天给整机清了灰,感觉还能再战2年。在这里也随口提一下,利民TF8硅脂在使用2年后,衰减的很厉害,建议重新涂抹。
                                    CPU
                                    AMD Ryzen 5600 @ 4.65GHz
                                    显卡
                                    MSI 万图师 3070 三风扇版本 未超频
                                    内存
                                    32GB @ 3200MHz 16-18-18-38
                                    主板
                                    MSI MAG B550 Tomahawk
                                    Windows版本
                                    Windows 11 24H2 10.0.26100.3194
                                    OpenGL版本
                                    4.6.0 NVIDIA 572.60

                                    ParallelBuildProcessorCount

                                    ParallelBuildProcessorCount是并行编译构建相关参数,默认值为8,需要修改为你的逻辑处理器数量。逻辑处理器数量可在任务管理器中-性能-CPU-逻辑处理器 中查看。以我的AMD Ryzen 5600为例,逻辑处理器数量为12
                                    notion image
                                    所以修改后为:

                                    RenderWorkerThreadPriorityAboveNormal

                                    RenderWorkerThreadPriorityAboveNormal是图形渲染优先级参数,用于配置渲染工作线程的优先级,确保渲染任务能够获得更多的CPU资源,这在CPU资源紧张的情况下会起到一定作用,提升渲染性能并保证渲染的实时性,减少卡顿并提升游戏帧率。默认情况下是Disable状态,我们需要将其开启。
                                    修改后为:

                                    MinimumStreamingTextureResolution

                                    MinimumStreamingTextureResolution是纹理流式加载的最小分辨率,通过限制加载的纹理的大小来减少内存占用和GPU负载。这里在原来的配置文件中可能存在一处拼写错误MinimumStreamingTextureResoltuion_256,修改后的为:
                                    目前也有反馈此项修改后并不会对游戏有任何的帧数提升。死马当活马医还是等待更新,看个人选择。

                                    Fog_Enable

                                    体积雾开关,建议保持enable状态,即默认状态。如果帧数实在达不到要求,可以考虑关闭。关闭后会缓解一些画面灰蒙蒙的感觉。

                                    VolumetricFogControl_Enable

                                    同样是体积雾相关开关,用于模拟更真实的雾气效果,让雾气具有光线散射和动态体积感。默认情况下为开启enable 状态。如果需要大幅提高帧数,可以考虑关闭。

                                    配置config.ini只读权限

                                    为了避免《怪物猎人:荒野》程序自身修改config.ini文件至默认配置,我们需要对config.ini设置只读权限。右键config.ini ,打开属性 → 勾选只读(Read-only),点击应用并保存。
                                    notion image

                                    🤗 《怪物猎人:荒野》其他优化办法

                                    通过上述的config.ini的优化办法能够提升的帧数有限,如果使用RTX20系或者RTX30系显卡的用户,还可以通过帧生成模组(Mod)进一步提升帧数。参考链接:《【心得】魔物獵人荒野_20/30系顯卡DLSS幀生成模組教學 @電腦應用綜合討論 哈啦板 - 巴哈姆特
                                    另外,不清楚Steam上的拼好帧对《怪物猎人:荒野》有没有用,有没有用过的大手子说一下,天天在抖音上刷到,但是还没见真实的反馈。

                                    📎 参考文章

                                     
                                    💡
                                    有关Steam游戏安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                    OpenClash替换使用Mihomo内核

                                    2024年8月29日 08:00
                                    🚧
                                    OpenClash是我在OpenWRT旁路网关(旁路由)上使用时间最长的科学上网插件,其依赖于Clash的内核文件使用,在功能的完整性和使用顺手程度上,目前还没有可完全替代的选项。目前Clash-meta内核分支已经改名为Mihomo,OpenClash也已经大概2个月没有更新了,插件自带的内核更新功能暂时还不能自动更新使用Mihomo内核,为了使OpenClash支持Mihomo内核所带来的一些新的功能,所以有了这篇文章。
                                    notion image

                                    📝 Mihomo内核介绍及替换方法

                                    Mihomo内核介绍

                                    Mihomo内核并不是一个新的Clash内核,其前身是Clash-Meta内核,但是由于Clash For Windows删库风波问题,所以改名为Mihomo(原神!启动!)Mihomo继承了Clash的核心功能,综合原始Clash及Clash Premium核心功能,并在此基础上根据需要持续更新迭代,是目前Clash最为主流的核心。同时,由于Mihomo内核是在原Clash-Meta内核基础上进行的后续开发,所以其使用方法与基础命令均没有改变,这也使得我们可以直接在OpenClash中对内核进行替换。

                                    Mihomo功能介绍

                                    代理模块
                                    • 实现了基于TCP握手机制的主动健康检测(如urltest/fallback)。
                                    • 支持Relay代理链和TCP连接并发。
                                    规则模块:
                                    • 全面的规则支持,包括GEOSITE、GEOIP、入站类型规则IN-TYPE和规则集RULE-SET。
                                    • 支持SRC-PORT和DST-PORT的多条件、TCP/UDP的分别控制、网络类型匹配(TCP/UDP)、PROCESS-NAME匹配等。
                                    • 逻辑判断规则(NOT/OR/AND)、子规则集、所有规则的源IPCIDR条件。
                                    • GEODATA MODE切换(mmdb/dat)和GEODATA LOADER模式切换(普通/小内存模式),适用于各种设备。
                                    DNS模块:
                                    • 包括域名嗅探器Sniffer、使用Geosite的Fallback-Filter和Redir-Host远程解析。
                                    • 支持使用代理解析IP和DNS over QUIC。
                                    TUN模块:
                                    • 支持macOS、Linux和Windows平台。
                                    • 内置iptables和Wintun驱动程序,无需手动配置。
                                    • 支持gVisor/System堆栈以及Mix堆栈(混合堆栈)。

                                    Mihomo新增功能

                                    除上述功能外,在Clash-Meta更名为Mihomo之后,又增加了如下功能支持:
                                    DNS模块:
                                    • 增加HTTP/3 DNS支持(H3的速度真的很快),包括是否优先使用DOH的HTTP/3以及指定DOH服务器强制使用HTTP/3
                                    • nameserver-policy规则:优先于nameserverfallback的dns进行解析,可以在规则中通过GEOSITE分组进行DNS指定,增加DNS解析规则灵活性。但由于nameserverfallback dns server同时请求的原因,并不能解决DNS泄露问题。
                                    • fallback-filter规则:支持GEOIPGEOSITE匹配
                                    • proxy-server-nameserver:指定解析节点所使用的DNS服务器
                                    策略组模块 - 路由规则:
                                    • 增加PROCESS-NAME进程匹配,软路由上可匹配本机进程
                                    • 增加PROCESS-NAME-REGEX,使用进程名称正则表达式匹配
                                    • 增加PROCESS-PATH-REGEX,使用进程路径正则表达式匹配
                                    • 增加SUB-RULE子规则
                                     
                                    Tun模块:
                                    • 支持gVisorSystem的混合堆栈,tcp使用system栈,udp使用gvisor栈,使用体验可能相对更好,同时稳定性也有保证。
                                    • 支持流量转发隧道(Tunnel)
                                    主要我们所使用到的,还是在DNS模块的部分,可以更为精准的控制DNS的解析,包括IPv6 DNS的解析。

                                    OpenClash替换Mihomo内核方法

                                    1. 首先确认你使用的是OpenWRT及OpenClash,并对自己将进行的操作目标有所知悉。下述操作的系统为X86-64架构,OpenWRT版本为ImmortalWrt 23.05.4。如果担心出现不可恢复的问题,可以先备份虚拟机或OpenClash整体配置。本篇内容也适用于OpenClash内核更新失败的手动解决方案。
                                    1. 通过SSH登入OpenWRT,并进入OpenClash的核心所在文件夹:
                                    1. 备份原来的meta核心:
                                    1. 下载Mihomo核心,从https://github.com/MetaCubeX/mihomo/releases 选择版本和自己路由器架构的核心包,并复制链接地址,替换下面命令中的地址,X86-64用户选择mihomo-linux-amd64-compatible-go120后缀即可。
                                    1. OpenWRT网页端进入OpenClash,点击插件设置 - 版本更新,查看[Meta]当前内核版本是否为v1.18.7,如图所示
                                    notion image
                                    1. 如果显示为当前下载的内核版本号,即表示替换成功。重启OpenClash即可生效。不要再点击检查并更新了。

                                    🤗 总结归纳

                                    因为Notion AI到期,所以没有课代表总结。反正就是一个简单的Mihomo内核替换,也没什么难度。
                                    Mihomov1.18.8版本更新了,可以更新起来了。但是WireGuard的问题还是没有修复。
                                    OpenClash目前已完全支持Mihomo内核,可以直接使用自带的更新功能进行更新。

                                    📎 参考文章

                                     
                                    💡
                                    有关OpenWRT和Mihomo安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    在OpenWRT上使用Neovim

                                    2024年8月26日 08:00
                                    🖥️
                                    因为自己经常需要通过SSH对家里的网络进行调试,包括主路由的配置、旁路由(旁路网关)的配置、OpenClash、Adguard home、MosDNS等等,频繁的需要用到一个舒服的编辑器对jsonyaml以及xml等配置文件或结构化数据文件进行修改。我在本地环境中使用较多的是NeoVim,之前也分享过LazyVim的文章。而在OpenWRT的系统软件仓库中,目前还没有这个软件的ipk,所以今天就将我自己在OpenWRT上进行编译安装NeoVim的过程以及遇到的坑整理出来。

                                    📝 Neovim安装配置

                                    开始之前

                                    为避免编译安装过程中产生不可控的问题,我在这篇教程中用一个全新虚拟机环境。固件来源于ImmortalWrt Firmware,Generic x86/64架构,版本号为23.05.3,内核版本为5.15.162,没有额外添加任何预安装软件包,与默认提供的软件包一致,可用空间尽量大,这次操作我的实际使用空间大概在1.2G左右,但是在安装完成之后可以进行移除。
                                    同时,建议在开始下面的操作之前,如果你是已经在使用的OpenWRT系统,建议做好备份,如果是虚拟机系统,建议添加检查点或备份点。

                                    Neovim编译安装流程开始

                                    以下内容是在OpenWRT内编译安装Neovim的全部流程。如果不想看流程,可以直接看总结
                                    首先通过opkg进行软件仓库源更新。
                                    返回结果为Signature check passed. 且没有报错继续下一步
                                    由于我们需要通过git方式克隆neovim在github上的仓库,所以需要这两个软件包,其中git-http用于在SSL情况下使用git,非SSL模式Github不支持克隆拉取仓库。
                                    期间,包括依赖在内,总共安装的软件包括:git, git-http, zlib, libcurl4, libnghttp2-14
                                    通过git clone进行neovim的仓库拉取,并尝试执行make
                                    返回错误结果
                                    原因是我们没有make的软件包,通过opkg进行安装,并再次尝试make
                                    返回错误结果:
                                    提示不存在cmake。Openwrt并不提供cmake的安装文件,但是我们可以通过python-pip的方式进行曲线安装,目前主流的Python版本为Python3。
                                    之后再进行make时提示:
                                    意思时没有找到c编译器,我们可以安装gcc解决
                                    这次编译了很长时间,直到在安装luajit时进行报错:
                                    我们直接用opkg安装
                                    然后继续尝试执行make,这次报错变了:
                                    提示我们没有ld命令没有ldl这个参数的选项。 通过查看openwrt的文档可以发现,这些库中的函数实际上已经直接包含在musl libc中。然而,由于某些工具尝试显式链接这些库,你可能会遇到“No Such file or directory”的错误。为了解决这个问题,只需为它们创建存根库即可。
                                    使用Vi建立一个sh文件vi run.sh,并在文件中输入以下内容:
                                    然后继续尝试make CMAKE_BUILD_TYPE=RelWithDebInfo ,这次报错内容变更为:
                                    提示为没有install命令,这个的解决方法为:
                                    报错内容变更为:
                                    提示找不到GettextGettext目前没有安装包的一类的快捷安装方法,我们需要通过编译进行安装
                                    然后继续尝试执行neovim的编译,返回错误
                                    我们通过创建存根库绕过:
                                    到这里,基本上编译已经完成,我们可以进行安装
                                    二进制的执行文件在/usr/local/bin下,我们可以直接移动到/usr/bin或者软连接过去。之后如果想安装astronvim或者lazyvim可以直接进行执行相关安装命令。

                                    🤗 OpenWRT编译安装Neovim精简版

                                    OPKG安装依赖

                                    PIP安装依赖CMAKE

                                    编译安装Gettext

                                    创建存根库

                                    拉取Neovim库并编译安装

                                    完成后nvim二进制文件位于/usr/local/bin

                                    直接下载Neovim二进制文件

                                    如果你不想自己进行编译,恰巧你也是X86_64架构的OpenWRT,那么也可以直接下载我编译好的二进制文件进行使用。

                                    📎 参考文章

                                     
                                    💡
                                    有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    提升家庭网络稳定性:OpenWRT限制网心云连接数教程

                                    2024年8月23日 08:00
                                    🚧
                                    最近把家里的网络重新梳理了一下,但是经常发现网络抖动非常大,偶尔抖动会增加到200ms左右或者以上,同时在fast上进行测速,每次的结果也相差巨大。因为家里有Hyper-v的虚拟机在挂着网心云赚网费,所以开始怀疑是上传把带宽跑满了,所以导致的网络抖动。之前我也是通过Hyper-v的管理面板进行虚拟机的限速,但没有注意过连接数这个问题。在我之前的理解里,理论上限制了上传速度,就不应该会对网络本身产生任何的影响。在查阅了很多资料之后,发现主路由的活动连接数突破了12000(immortalwrt在我acrh17这个型号上,默认给的最大连接数量才30000出头),而且考虑到运营商也会对连接数量做出限制,所以才注意到这个问题。

                                    📝 付费内容

                                    连接数量对网速的影响

                                    之前我并没有意识到连接数量对网络稳定性和网络速度存在影响,但是查阅部分资料后,发现活动连接数量过多会影响网速的原因主要包括以下几个方面:
                                    1. 带宽消耗:每个连接都占用了网络带宽,活动连接数量增加时,带宽会被多个连接分摊,导致每个连接可用的带宽减少,最终导致整体网速下降。
                                    1. 路由器/网络设备的处理能力:路由器和其他网络设备在处理大量连接时会增加工作负荷。如果设备的处理能力有限,过多的连接会导致设备反应变慢,增加数据包的处理延迟,进而影响网速。
                                    1. 网络拥塞:过多的连接可能会导致网络拥塞,尤其是在家庭局域网中。网络拥塞会导致数据包丢失、重传等问题,进一步降低实际的传输速度。
                                    1. NAT表的限制:对于使用NAT(网络地址转换)的网络,每个连接需要在NAT表中建立一条记录。NAT表的容量有限,当连接数过多时,NAT表可能会溢出或处理速度变慢,导致网络性能下降。
                                    1. CPU和内存负载:如果你的设备(如计算机或服务器)处理大量的并发连接,CPU和内存负载会增加,可能导致设备性能下降,进而影响网速。例如我的Asus Acrh17,在12000活动连接数时,内存占用超过70%,此时局域网内其他设备明显可感觉到延迟。
                                    1. 运营商活动连接数量限制:大部分运营商会对每户入网的宽带进行活动连接数量限制,不同地区、不同运营商甚至所属不同片区均不相同,当达到一定量的活动连接数量时,更多的连接会进行丢包处理,所以会直接影响到使用者的体验。目前检索到的消息可以查看这里:
                                    宽带连接数限制测试结果(来源): 上海电信:公网不限制,私网 8000,云宽带 2800 上海移动:私网 2500 上海联通:公网 6000,私网 1500 江苏移动:公网不限制,私网 2500 浙江移动:公网 6000,私网 2000 江苏联通:公网 6000,私网 3000 江苏电信:公网不限制,私网 6000
                                     

                                    本地网络环境介绍

                                    简单介绍一下我本地的网络环境:
                                    notion image
                                    在这个家庭网络的拓扑结构中:
                                    1. 光猫:桥接模式(中兴老款F450,已尝试修改了硬桥接,未使用软桥接方式,同时,未做光猫本身最大连接数修改)
                                    1. 主路由:ASUS-ACRH17,系统为OpenWRT,开启Fullcone NAT。
                                    1. 旁路由(旁路网关):X86虚拟机(Hyper-V虚拟化),系统为OpenWRT的衍生版本ImmortalWRT(本篇中并不重要)。
                                    1. 网心云:X86版本(Hyper-V虚拟化)并配置静态地址,网关直接指向主路由,避免流量经过旁路。

                                    命令行限制方法

                                    主路由目前使用的OpenWRT版本为23.05,在这个OpenWRT版本中已经使用nftable取代了iptables,所以在网上找到的很多iptables无法使用或者会提示过老版本,配置后查看规则计数器数据为0,没有生效。同时nftable在OpenWRT上并没有提供luci app插件以及对应的UI操作界面,所以就需要我们自行编写nftable规则进行连接数的控制。
                                    notion image
                                    在另一方面,由于主路由器开启了Fullcone NAT模式,所以使得所有来自外部的连接请求都可以通过主路由访问内网的网心云,且不再使用UPNP。这意味着,如果在 nftables 中通过ip fileter添加了针对网心云的INPUT和OUTPUT限制规则,那这些规则就不能正确匹配外部流量,所以通过INPUT和OUTPUT规则进行过滤没有任何的效果,这也是我在尝试之后,发现匹配规则数量为什么一直都是0的原因。
                                    同时,使用 conntrack (conntrack需要安装,一般都没有预装)查看连接时,我发现连接信息已经包含NAT处理后的外部IP地址和端口,而nftables规则要考虑对NAT后的地址和端口进行限制,那么目标就来到了 forward 链上。而且我惊奇的发现,网心云这种PCDN居然使用的是TCP协议而不是UDP协议。
                                    首先确保OpenWRT已经安装了以下内核,如果缺少的话,在使用nftable时候会提示报错:“Error: Could not process rule: No such file or directory”。
                                    可以通过如下命令进行安装:
                                    安装后,首先我们需要创建ip filter表用于进行过滤使用:
                                    然后添加forward链,并配置优先级为0,优先进行匹配:
                                    最后添加过滤规则(本文重点内容):
                                    添加完成后,等待一段时间,通过以下命令进行活动连接数查看:
                                    如果没有安装conntrack包,也可以通过OpenWRT管理网页进行查看,位置在:
                                     

                                    配置文件限制方法(不确认在fw4表内是否成功)

                                    编辑/etc/nftables.d/10-custom-filter-chains.nft 文件,并修改为以下内容:
                                    然后重启firewall
                                    通过nft list进行查看规则是否已经添加成功
                                    如果看到
                                    则表示添加规则成功。
                                     

                                    OpenWRT查看端口占用

                                    1. 查看单独端口占用情况及对应程序,例如8080为要进行查看的端口
                                    1. 查看客户端IP地址端口占用情况
                                     
                                    最终,通过Grafana查看效果(需要单独配置):
                                    notion image

                                    🤗 总结归纳

                                    整体所需的软件包为:
                                    • kmod-nft-core(核心)
                                    • kmod-nft-nat(nat相关规则配置参数支持)
                                    • kmod-nft-ct(计数相关规则配置参数支持)
                                    • conntrack(查看连接,可选)
                                    以上软件包均可通过OPKG进行直接安装。
                                    目前配置完成之后(我配置的来源和目的地活动连接数量均为4000),主路由显示的活动连接数量大概在5000左右浮动,至于为什么没有完全和规则匹配上,我的猜想可能是因为有一些长连接还没有释放的原因,后续会进行持续观察。
                                    限制活动连接数量之后,对网心云的跑量影响需要等待几天才能看到,之后我也会更新到这里。目前来看,在上传带宽方面没有任何的变化,依旧可以跑满限制带宽,理论上延迟应该也可以降下来,但存在一个副作用,就是丢包也会上涨,这部分会影响多少的收益暂时还不清楚,同时具体连接数限制的数值的设定,也需要持续的观察才能确认最优配置。
                                    同时上述规则中没有配置IPV6的相关nftable规则,因为目前我的环境和观察下,IPV6的量只占很少的一部分,如果之后量起来了,对本地的网络环境已经有了体感的影响,我也会进行研究相关配置。
                                    这篇文章也不仅仅能应用于网心云,当你需要对局域网内的任何客户端,或者说是局域网内任何IP进行活动连接数量的限制时,都可以根据上面的内容进行操作,尤其是对于抖音、快手、爱奇艺这种活动连接请求大户。
                                     

                                    网心云其他问题

                                    目前发现网心云X86 2.0版本在使用Hyper-V虚拟机情况下,如果路由断网后恢复,在一段时间内即便正常获取IP或配置静态IP,也不会进行上传,需要在网心云的命令行界面(终端)中手动配置网卡禁用再启用后才可以,这点需要注意。

                                    📎 参考文章

                                    • 以及恩山论坛各种高手的帖子
                                     
                                    ⛏️
                                    有关OpenWRT IPv6安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    使用Pipedream同步RSS至BlueSky

                                    2024年12月2日 08:00
                                    😀
                                    BlueSky是一个新的社会化媒体平台,由Jack Dorsey于2019年提出并创立。随着X.com的商业化内容越来越多,以及马斯克的各种骚操作,BlueSky最近也算出尽了风头,不少用户从X.com(Twitter)转移到了BlueSky,并将BlueSky作为新的Social Media传播平台进行使用。在使用这种Social Media平台时,我最关心的部分就是如何进行不同平台之间的信息同步,例如之前我将豆瓣上的书、影、音等记录同步到Twitter和Mastodon,或者将最新的博客内容同步发送至Twitter和Mastodon等等。目前已经有较为成熟的方案在RSS与X.com之间进行自动化同步(可惜ifttt和dlvr.it都已经收费了),但还没有较为成熟的BlueSky同步方案,今天就将一个国外博主Raymond Camden的方案翻译一下给需要的朋友。

                                    为什么BlueSky用户增长这么多?

                                    X.com(Twitter)的最新使用条款提到:
                                    在最新用户使用条款中第三条服务内容中的您对内容的权利和授予的权利中明确规定,用户通过 X平台发布的任何内容 (包括文字、图片、音频和视频等) 都将授予X免费使用,包括用于训练人工智能模型。同时X平台还有权利将用户内容提供给其他公司、组织或个人使用,以上两种情况X都不会向用户支付任何报酬。
                                    这个新条款已经在2024年11月15日生效。这让用户与内容生产者们感到恐惧。在X.com(Twitter)的最新使用条款助攻下,BlueSky在昨天活跃用户数量已经超越了Threads,也许在未来的某个时间点,BlueSky可以和X.com做到分庭抗礼吧。

                                    📝 方案来源

                                    📝 方案内容

                                    目前Raymond Camden所使用的方案是通过自动化平台Pipedream实现,需要一些代码基础,相对于类IFTTT或者Dlvr.it等成熟的平台,对用户有一些技术上的门槛,不过Pipedream提供了丰富的开发工具,例如Python、NodeJS、Golang等等,借助这些开发语言与BlueSky的开发文档,也能够实现同步的功能。

                                    注册Pipedream

                                    打开Pipedream的官网:https://pipedream.com/auth/signup 进行注册,只需要邮箱和密码即可完成注册。目前不确定国内访问Pipedream是否需要科学上网。图省事也可以直接使用Google或者Github账号。

                                    创建项目及工作流

                                    Pipedream中,首先需要创建项目,一个项目可以包括多个自动化的流程,但是其实我们只需要用到一个自动化工作流就好。点击右上角的“New Project”进行创建。
                                    notion image
                                     
                                    填写一下项目的名称即可,建议自己填写一个较短的、易于辨识的名字,不要使用默认的名字,不然删除项目的时候有点麻烦。
                                    notion image
                                    然后点击New - Wrokflow,保持所有内容默认,直接点击Create Workflow创建工作流即可进入工作流的编辑配置页面。
                                    notion image

                                    添加RSS Trigger

                                    notion image
                                    点击Add Trigger,添加触发器,选择My Sources - New Item in RSS Feed ,也就是RSS源中的新内容。
                                    notion image
                                    • Timer:循环时间,建议不要选择过于频繁,查询次数太多,占用免费额度,同时RSS源的内容更新也没那么频繁,同步也不一定需要太高的时效性,我选择的是6小时。
                                    • Feed URL:RSS源地址,填写你博客的地址,或者你希望同步的RSS源地址,例如豆瓣的RSS
                                    • Published After:即在此时间之后的内容才会被同步,建议选择当前时间靠前一点,如果使用默认时间,可能会第一次同步过多内容。
                                    完成以上内容的填写之后,点击Configure to save ,Pipedream会自动尝试获取RSS源的内容。如果你同步的RSS所使用的域名使用了Cloudflare的“自动程序攻击模式”,可能Pipedream无法抓取内容,会被Cloudflare识别为自动程序而阻拦,可以在“安全性 - 自动程序 - 自动程序攻击模式”中进行关闭。目前我测试下来,豆瓣提供的RSS是可以正常抓取的。
                                    Slelect a different event中随便选择一条由RSS中读取的条目,即可在Result中查看到对应trigger获取到的信息,点击Continue 进入到添加Action动作环节。
                                    notion image

                                    添加Action(动作)及部署

                                    我们已经从触发器能够正常的获取信息,并配置好了如何触发,那么下一步就是在触发之后,需要Pipedream进行什么操作。在本篇文章中,我们所需要进行的操作就是将获取到RSS内容,以卡片的形式发布到BlueSky中。
                                    选择Node - Run Node Code
                                    notion image
                                    然后复制以下代码到CODE的输入框里,原作者的代码由于会提示steps.trigger.event.link being undefined,所以根据评论中的内容进行了修改。
                                    需要注意的是,这里有两点需要根据自己的账号进行修改:
                                    • identifier:修改为你的bluesky的用户名,例如xxxxx.bsky.social 。如果使用第三方的域名,可能无法正常使用,我还没有做测试。
                                    • password:修改为你自己配置的App Password,配置位置位于BlueSky的Settings - Privacy and security - App passwords,添加一个新的App Password即可,需要注意的是,当添加完成后显示的密码需要及时保存,因为关闭弹窗之后就不会再显示了。
                                    代码使用了cheerio@atproto/api库,用于在Bluesky社交平台上自动发布内容。逐行解释如下:
                                    1. import * as cheerio from 'cheerio';
                                      1. 导入cheerio库,用于在Node.js环境中解析和操作HTML文档。
                                    1. import Atproto from '@atproto/api';
                                      1. 导入@atproto/api库,这个库包含与Bluesky API交互的工具。
                                    1. const { RichText, BskyAgent } = Atproto;
                                      1. Atproto中解构出RichTextBskyAgent类,用于处理文本和与Bluesky API通信。
                                    1. export default defineComponent({
                                      1. 导出一个默认的组件定义,通常用于在框架中定义一个可执行组件。
                                    1. async run({ steps, $ }) {
                                      1. 定义一个异步的run方法,该方法接收一个包含steps$的对象作为参数。steps包含工作流的步骤数据,例如我们通过RSS Trigger所获取到的数据。
                                    1. const agent = new BskyAgent({ service: 'https://bsky.social' });
                                      1. 创建一个新的BskyAgent实例,用于与Bluesky API交互,并指定服务地址。
                                    1. await agent.login({ identifier: 'bluesky用户名', password: 'App PassWord' });
                                      1. 使用指定的用户名和应用密码登录到Bluesky平台。
                                    1. let card = { uri:steps.trigger.event.link, title:steps.trigger.event.title, }
                                      1. 初始化一个card对象,包含从触发事件中提取的链接和标题。
                                    1. let req = await fetch(steps.trigger.event.link);
                                      1. 使用fetch函数请求事件中链接的HTML内容。
                                    1. let html = await req.text();
                                      1. 将请求的响应转换为文本格式(HTML)。
                                    1. let $$ = cheerio.load(html);
                                      1. 使用cheerio加载 HTML 内容,以便后续解析。
                                    1. card.description = $$('meta[property="og:description"]').attr('content');
                                      1. 使用cheerio提取HTML中的Open Graph描述元标签的内容,并赋值给card.description
                                    1. let image = $$('meta[property="og:image"]').attr('content');
                                      1. 提取Open Graph图像元标签的内容,用于后续上传。
                                    1. let blob = await fetch(image).then(r => r.blob());
                                      1. 下载图像并将其转换为Blob对象。
                                    1. let { data } = await agent.uploadBlob(blob, { encoding:'image/jpeg'} );
                                      1. 使用agent.uploadBlob方法上传图像Blob,并指定编码格式为JPEG,存储返回的数据。
                                    1. card.thumb = data.blob;
                                      1. 将上传的 Blob 数据存储在card对象的thumb属性中。
                                    1. let rt = new RichText({ text: 发现了新的内容: "${steps["trigger"]["event"]["title"]}" });
                                      1. 创建一个新的RichText实例,并设置文本内容,包含触发事件的标题。
                                    1. await rt.detectFacets(agent);
                                      1. 使用detectFacets方法检测文本中的特性(如链接、标签等),可能用于格式化或增强文本。
                                    1. await agent.post({
                                      1. 使用agent.post方法在Bluesky平台上发布一个新帖子。
                                    1. text: rt.text, facets: rt.facets, langs: ['en-US'], createdAt: new Date().toISOString(), embed: { $type: "app.bsky.embed.external", external: card }
                                      1. 设置发布帖子的内容,包括文本、特性、语言、创建时间,以及嵌入的外部卡片信息。
                                    1. return;
                                      1. 结束run方法的执行。
                                         
                                    完成上述步骤之后,点击Test按钮进行代码测试,不出意外的话,应该会提示Success成功,在Bluesky中也可以看到一条新的同步的消息,这时候点击Deploy就可以正式部署了。
                                    代码中所绘制的卡片样式大概是,JS能力强的朋友,也可以根据自己的需要进行代码上的修改。
                                    notion image

                                    🤗 总结归纳

                                    整体流程其实还是很简单的,无非就是配置触发器、配置动作以及部署。Pipedream提供的免费额度也足够个人使用,支持10个工作流,我个人的话,豆瓣加上个人的博客同步,也就使用2个工作流。
                                    另外顺便研究了一下,Pipedream的Action中包括发布Mastodon动态,所以理论上也可以同步至Mastodon。
                                    notion image
                                    对于X.com(Twitter)来说,目前没有找到成熟的Action,可能需要自行申请Developer Access然后使用代码方式同步。

                                    同步RSS至Twitter(X.com)

                                    目前已经找到了使用pipedream同步RSS或者豆瓣数据到Twitter(X.com)的方法:《使用Pipedream同步RSS至Twitter(X.com) | Deep Router

                                    📎 参考文章

                                    💡
                                    有关家庭网络配置或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    OpenWRT中为局域网设备配置IPv6 DDNS

                                    2024年8月29日 08:00
                                    🍌
                                    之前介绍过如何在OpenWRT上实现OpenClash科学上网的同时与IPv6的共存,不但主路由有公网IPv6地址,所有的客户端也都有了唯一的IPv6公网地址。有了IPv6之后我们可以做很多事情,例如远程回家进行网络管理、公网的远程串流、Emby媒体服务器的公网使用、自建DNS服务器等等。目前大部分的DDNS教程都只是如何获得插件所在设备的IPv4及IPv6地址及DDNS域名绑定,今天来分享一下如何在旁路由(旁路网关)上安装配置DDNS-GO,通过IPv6地址为局域网内需要的设备绑定域名。
                                    notion image
                                    DDNS(动态域名系统,Dynamic DNS)是一种允许用户在IP地址变化时自动更新DNS记录的服务。通常,互联网服务提供商会给家庭或小型办公室的网络分配动态IP地址,这意味着IP地址会周期性变化。如果你运行一个需要被外界访问的服务(比如家庭服务器或游戏主机),IP地址的变化会导致外界无法访问你的服务。
                                    DDNS的工作原理如下:
                                    1. 动态IP监测:DDNS客户端软件在你的设备上运行,定期检查你的公共IP地址是否变化。
                                    1. 更新DNS记录:当检测到IP地址变化时,客户端会自动将新的IP地址更新到DDNS服务提供商的DNS服务器上。
                                    1. 域名解析:外界的请求通过DDNS服务提供的域名解析到你当前的IP地址,确保即使IP地址改变,服务仍可正常访问。
                                    常见的DDNS服务提供商包括No-IP、DynDNS和Cloudflare等。我使用DDNS主要用于Wake On Lan以及通过Moonlight+Sunshine进行远程串流打游戏。
                                    DDNS-GO是一个开源的动态DNS解决方案,帮助用户通过DDNS访问家庭内网服务,实现内网穿透等。DDNS-GO支持在多种操作系统上使用,包括Linux(各种发行版,包括飞牛fnOS)、Windows、macOS以及使用OpenWRT的路由器,包括主路由和旁路由。DDNS-GO兼容多个DNS服务提供商,比如Cloudflare、阿里云DNS(AliDNS)、GoDaddy、DNSPod等,非常灵活,且同时支持IPv4和IPv6动态地址获取及设置,并提供简洁的Web管理界面,便于配置和监控动态DNS服务。
                                    本文内容不仅适用于OpenWRT系统,其他类似飞牛fnOS等系统,在使用DDNS-GO插件的情况下,也可适用。

                                    📝 为局域网设备配置IPv6 DDNS

                                    配置前提

                                    本次配置教程所使用的ddns服务提供商为Cloudflare,需要自备域名并将域名绑定到cloudflare。
                                    另外,需要你的局域网下设备可以正常获取公网IPv6地址,教程参考🌐IPv6与旁路由共存:实现策略代理与原生地址的完美平衡
                                    在ddns-go服务的安装设备上,我个人推荐安装在旁路由(旁路网关)上,因为我们的IPv6 RA(Router Advertisement)服务器也是这台设备,如果安装在主路由上,那么可能无法获取到完整的IPv6邻居列表。如果主路由开启了RA服务器模式,也可以在主路由上进行安装。

                                    安装luci-app-ddns-go

                                    大部分仓库均提供luci-app-ddns-go这个插件,可以通过系统 - 软件包进行安装,或者像我一样通过SSH输入命令安装。
                                    安装成功之后,刷新路由器管理页面,在服务选项卡下应该就有DDNS-GO了。如果没有的话,可以注销路由器管理页面,重新登录即可。
                                    notion image
                                     

                                    配置luci-app-ddns-go插件

                                    luci-app-ddns-go插件的作用是为ddns-go在OpenWRT中提供一个可视化的luci网页操作界面,用于对ddns-go核心的配置和管理,并不直接负责ddns的检测、更新和域名解析服务,只有在配置完成luci-app-ddns-go插件并启动服务之后,才可以进行ddns的配置。
                                    notion image
                                    1. 勾选启动的复选框。
                                    1. 如果需要自定义ddns-go的访问端口,可以修改设置访问端口,我这里维持不变。
                                    1. 指定DNS解析服务器,选择阿里云DNS或者腾讯DNS都可以。如果你路由器本机也经过代理,可以选择国外dns,或者设置为你自己自定义的DNS
                                    1. 其他项无特殊偏好,维持不动。
                                    1. 保存并应用。
                                    1. 看到DDNS-GO服务器已启动,即表示成功,可以通过http://路由器ip地址:9876进行访问。
                                    1. 首次登录需要设置管理员账号和密码,直接根据提示配置即可。

                                    配置ddns服务

                                    访问Cloudflare的User API Tokens页面:User API Tokens - Cloudflare
                                    或者通过右上角账户 - 外观 - API令牌 进入User API Tokens页面。
                                    我们需要创建一个API令牌给DDNS-GO使用,用于修改对应域名的解析地址。
                                    点击创建令牌,选择编辑区域dns,点击后面的使用模板。
                                    notion image
                                    区域资源 - 特定区域 - Select的下拉中选择你绑定的域名
                                    notion image
                                    然后点击继续以显示摘要 - 创建令牌 即可看到API令牌(API Token)的字符串,复制保存到安全的地方。

                                    配置路由本机DDNS域名

                                    如果你的路由器本机不需要配置ddns域名也可以跳过这部分。
                                    通过http://路由器ip地址:9876 访问DDNS-GO的web界面。
                                    notion image
                                    DNS Provider:
                                    1. 选择Cloudflare
                                    1. Token填写刚刚我们获得的API令牌(API Token)
                                    1. TTL不用动,只有产生IP变动之后TTL才会生效。
                                    IPv4部分:
                                    1. 域名(domain)填写你希望使用的域名,例如我写的是home.xxxx.xom
                                    1. 其他不用动
                                    IPv6部分:
                                    1. 启动的复选框勾上
                                    1. Get IP Method不用动
                                    1. 域名(domain)填写和ipv4相同的域名即可。
                                    然后拉到最下方,点击保存,然后点击右上角的日志(logs)查看运行情况:
                                    看到added domain xxxxxx successfully即表示添加成功。稍等片刻,等待DNS解析广播结束之后即可用这个域名:端口的方式在公网进行访问。

                                    配置局域网其他客户端DDNS域名

                                    再次说明,如果你是通过旁路由(旁路网关)提供局域网的IPv6 RA服务,那么需要将DDNS-GO安装在旁路由(旁路网关)上,否则无法获取到完整的IPv6路由列表,也无法为客户端进行DDNS域名绑定。
                                    配置局域网客户端的DDNS域名其实与配置路由器本机的DDNS流程大致相同,使用的Cloudflare API Token还是上面我们申请的Token。
                                    在DDNS-GO的管理页面点击右上角的新增(Add)
                                    notion image
                                    DNS Provider:
                                    1. 选择Cloudflare
                                    1. 令牌(Token)填写我们上面获取到的API Token
                                    1. TTL选择Auto
                                    IPv4部分:
                                    1. 取消勾选启动按钮。我们IPv4只有一个公网地址,已经分配给路由器本机使用了,所以这里就不再对IPv4进行配置。
                                    IPv6部分:
                                    1. 勾选启动
                                    1. 获取IP地址方法(Get IP Method)选择最后一个By Command ,也就是命令模式
                                    1. 输入以下命令来提取特定局域网设备的IPv6地址,mac地址注意要小写,同时如果从Windows复制过来,需要把-替换为:
                                    然后拉到最下方,点击保存,然后点击右上角的日志(logs)查看运行情况:
                                    看到added domain xxxxxx successfully即表示添加成功。稍等片刻,等待DNS解析广播结束之后即可用这个域名:端口的方式在公网进行访问。

                                    🤗 总结归纳

                                    通过对局域网客户端DDNS域名的配置,就可以避免记又臭又长的IPv6地址,同时也可以避免因为IPv6地址变动而访问不了家里所部署服务的情况。当前在绑定DDNS之后,记得在防火墙中为对应服务的端口配置规则,否则还是访问不了的。
                                    尽管本文使用的DDNS服务商为赛博大善人Cloudflare,但其他家服务器商的配置也大同小异,可以举一反三。

                                    📎 参考文章

                                     
                                    💡
                                    有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    IPv6与OpenWRT旁路由共存:OpenClash分流与原生地址的完美平衡

                                    2024年8月19日 08:00
                                    🚧
                                    搬家之后,原来的网络拓扑结构放在新家里总会出现奇奇怪怪的问题,尤其是在IPv6这方面。一方面我非常希望家里可以用上体验良好的IPv6(远程串流、BT、内网穿透等等都不用受制于没有公网IP),同时又不想因为IPv6而在IPv4的外网方面有所妥协,比如无法使用Netflix一类,或者无法使用到IPv6这种无NAT的,可以端到端的特性。目前整体的网络算是调整完毕,也将整体的调整过程写一篇博客进行记录,希望可以帮到面临相同问题的朋友。
                                    为什么要使用IPv6? 我只能说,这是一个趋势:《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》。目前国内IPv6基本已经处于可用状态,线路优化相比之前也有了很大提升。不过需要注意的是,目前国内的IPv6是禁止国外IPv6请求入站,至少是禁Ping,部分运营商因为PCDN的缘故,也会直接禁止IPv6入站。

                                    📝 OpenWRT旁路由配置IPv6科学上网

                                    配置前提

                                    1. 运营商下发的IPv6 PD前缀应小于64,一般来说都是60-62左右。如果你的运营商没有下发类似的前缀,或者下发的前缀为/64,那么这篇文章的内容可能并不适用于你的网络环境。具体可以在这里查看:调查下各地运营商光纤宽带分配的 IPv6 PD 前缀的长度 - V2EX
                                    1. 机场代理支持IPv6(例如我的TAG Internet)。
                                    1. 主路由和旁路由均为OpenWRT系统(基于ImmortalWRT),其他系统需要根据需要自行摸索。
                                    1. 尽量从纯净系统方案下进行配置,避免软件或规则冲突。同时做好备份。
                                    1. Windows下可以通过getmac /v 命令查看本机网卡的mac地址。

                                    家庭局域网网络拓扑

                                    notion image

                                    配置网络目标

                                    整体的网络设计是需要有一个清晰的目标所谓导向,所有的解决方案都是为了实现这个目标。那么我在新家的网络目标如下:
                                    1. 旁路网关(旁路由)架构,可以实现对不同客户端的IPv4网关及DNS配置。同时旁路网关不负责任何NAT转换操作。
                                    1. 国内IPv4流量可通过旁路网关 - 主路由网关 的路径,特定设备可直接通过主路由网关 ,避免因为BT、PCDN等对旁路网关上的代理机场产生影响。
                                    1. 国外IPv4流量通过旁路网关 - OpenClash的Mihomo内核进行分流及代理。
                                    1. 所有IPv6流量默认通过旁路网关 - OpenClash的Mihomo内核进行分流及代理,国外IPv6流量可通过机场的IPv6节点进行代理使用相关服务。
                                    1. 国内IPv6流量使用运营商分发前缀分配的IPv6地址,且可通过客户端配置绕过旁路IPv6网关,实现使用原生IPv6地址使用BT功能。
                                    1. 通过旁路静态路由配置实现特定设备直接使用主路由IPv6网关(未实现)
                                    针对网络目标的1、2、3点,已经有很多的教程指导如何实现。包括但不限于通过主路由的dnsmasq实现自定义给客户端下发的网关地址、DNS等等。我在之前也写过一篇文章,可以参考:Dnsmasq进阶技巧:为不同设备定制DNS服务器
                                    针对文中的4、5点,可以进行拆分,将主路由和旁路网关(旁路由)在网络中的职责进行细化:

                                    主路由

                                    1. 从运营商获取可分配的IPv6前缀,也就是需要小于64位的前缀。
                                    1. 不作为局域网内的RA服务器,原因在于在IPv6的网络环境下,客户端会自动将RA服务器作为其默认的网关,而在我们的网络目标中,整体网络中距离客户端最近的网关应该是旁路网关。
                                    1. 以中继方式将DHCPv6-PD过渡给旁路网关(旁路由),将局域网内的IPv6地址分配任务交给旁路网关实现。

                                    OpenWRT旁路网关(旁路由)

                                    1. 从主路由(上级网关)获得DHCPv6-PD的分配权限
                                    1. 作为RA(IPv6 Router Advertisement)服务器,但不作为DHCPv6的服务器,通过RA向局域网内的客户端提供IPv6地址分配功能,从而使客户端的默认网关及DNS为旁路网关。这样仅需要对特定设备进行特殊化配置,同时在一个局域网中只存在一个DHCPv6服务器,避免多服务器优先级造成分配紊乱,例如存在两个DHCPv6服务器时,客户端IPv6 DNS无法获取这种问题。同时因为主路由通过RA服务器启用SLACC,所以也支持Android设备的地址分配。如果主路由未启用RA服务器和SLACC,只有旁路由开启,我测试下来是Android设备还是获取不到公网的IPv6地址。
                                    1. 其实还有一种方法是通过radvd方式强制提高旁路由的RA服务优先级,从而使局域网内设备使用旁路由所提供的RA信息,但由于一方面radvd较老,OpenWRT并没有提供编译好的安装包,自行编译的依赖关系又很乱;另一方面局域网内存在两个RA Server终究是一个潜在的隐患,所以不采用此方案。

                                    解决方案

                                    主路由:

                                    1. 首先在全局网络选项中清空IPv6 ULA 前缀
                                    1. 配置WAN_6口:获取运营商IPv6前缀及PD权限。这里有两种方法,都可以:
                                      1. 修改原WAN口设置:高级设置中,获取IPv6地址为自动。这种方法可在WAN口PPPoE拨号成功之后,自动生成一个WAN_6的虚拟动态接口,同时获得IPv6地址及PD前缀。
                                      2. 新增一个WAN_6接口:协议选择DHCPv6,设备选择接口别名:"@wan" 。防火墙配置选择wan,DHCP选项中的IPv6设置全部选择中继。高级设置中委托IPv6前缀开启,IPv6分配长度64,IPv6后缀填写EUI64 ,便于生成的IPv6地址记忆,在配置防火墙规则时更好用。
                                    1. 配置原WAN口:修改DHCP服务器中的IPv6设置全部为中继模式;高级设置中的IPv6源路由勾选,委托IPv6前缀不勾选,分配长度禁用。
                                    1. 配置LAN口:不需要新增LAN_6口,使用原LAN口即可完成中继;
                                      1. 高级设置:委托IPv6前缀勾选,委托长度60(具体看运营商可以给多少长度的PD),其他默认。
                                      2. DHCP服务器 - IPv6设置:指定主接口不勾选;RA服务启用服务器模式,默认路由自动,RA标记其他配置(Stateless无配置);DHCPv6服务选择服务器模式(中继模式无法将PD下发到旁路),通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,本地IPv6 DNS服务器不勾选,通告域名空,NDP代理中继,前缀有效期和遵守IPv4有效期默认。
                                    1. 修改/etc/config/dhcp ,在config dhcp lan 下增加配置:option ra_preference ‘medium’ ,配置主路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。

                                    OpenWRT旁路网关(旁路由):

                                    我的旁路网关只有一个LAN口,没有配置WAN口。
                                    1. 首先在全局网络选项中清空IPv6 ULA 前缀
                                    1. 配置LAN_6口:
                                      1. 新增一个LAN_6口,协议选择DHCPv6,设备选择接口别名:"@lan" 。目的是通过@lan口与主路由的lan口对接,从而获得IPv6地址。
                                      2. 请求IPv6地址:选择force,选择try也可以
                                      3. 请求指定长度的IPv6前缀:填写你在主路由获取的PD的地址后面的数字+1或2,例如我在主路由的PD地址是240e:3a4:****:****::/60 ,那么我在这里填写的就是62,理论上61也可以获取,但只影响可分配地址的范围,家用环境下区别不大,没有那么多的设备。
                                      4. 高级设置:使用默认网关勾选;自动获取dns服务器勾选;IPv6源路由勾选;委托IPv6前缀勾选;IPv6分配长度64;前缀过滤器不选择;IPv6后缀填写EUI64;IPv6优先级默认0
                                      5. 防火墙设置:防火墙选与不选区别不大,或者我还没发现有什么区别。
                                      6. DHCP服务器:常规设置,忽略此接口;IPv6设置,指定主接口勾选,其他全部禁用(包括RA服务、DHCPv6服务、NDP代理,这些都是需要在LAN口实现,LAN_6口不进行提供)
                                    1. 配置LAN口:
                                      1. 高级设置:委托IPv6前缀不选;IPv6分配长度禁用;剩下默认
                                      2. DHCP服务器:IPv6设置下,指定主接口不勾选,RA服务器为服务器模式,DHCPv6服务为设置为中继模式,因为我们主路由已经配置了DHCPv6服务器,通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,例如我的为fe80::****:****:****:f02d ,这个地址可以通过ssh到旁路由,ifconfig查看到;通告的DNS域名为空;NDP代理中继。
                                      3. IPv6RA设置:默认路由器,选择在可用的前缀上;启用SLACC勾选;RA标记,其他配置;其他默认。
                                        1. 受管配置:开启后,客户端会请求 DHCPv6 服务器提供完整的网络信息(如 IP 地址、DNS 信息等)。这种模式下,客户端不再自行生成 IPv6 地址(即不通过 SLAAC 自动配置 IP 地址),即IPv6的有模式(Stateful),完全依赖DHCPv6进行地址分配,但在Android下无法使用。
                                        2. 移动home配置:移动 Home 标志(H Flag)用于标识一个节点是否可以在移动环境下与 Home Agent 通信。这对家庭用户或一般路由配置通常没有实际意义,除非涉及到特殊的移动 IPv6 配置。
                                        3. 其他配置:在启用了 SLAAC(无状态自动配置)时,客户端可以自动生成 IPv6 地址,但需要通过 DHCPv6 获取额外的配置信息(如 DNS)。这个标志位通常用于混合环境,即 IP 地址通过 SLAAC 自动生成,而其他信息通过 DHCPv6 获取。在关闭受管配置,并开启其他配置时,即IPv6的无模式(Stateless),不通过DHCPv6进行地址分配。
                                      4. 如果LAN_6和LAN口都开启委托IPv6前缀,那么一个设备大概会生成4个IPv6地址,但我们并不需要那么多,所以可以将LAN口的委托关闭。
                                      5. 修改/etc/config/dhcp ,在config dhcp lan 下增加配置:option ra_preference ‘high’ ,提高旁路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
                                    通过以上配置之后,主路由大概是这样:
                                    notion image
                                    旁路由大概是这样:
                                    notion image
                                    同时,现在旁路由作为整个局域网中唯一的RA服务器,也就成为了唯一的通告网关。

                                    Dnsmasq设置:

                                    如果你还在使用Dnsmasq作为DNS转发器,那么需要关闭过滤器 - 过滤IPv6 AAAA记录,从而使Dnsmasq可以解析IPv6域名。
                                    notion image

                                    OpenClash设置:

                                    OpenClash这里没什么好说的,科学上网,我选择的是mihomo内核(clash_meta内核)。废话不多说,直接上图,就是把IPv6配置项这页配置一下。代理模式可以根据需要进行选择,由于我是Fake-IP的混合模式很久了,且需要代理一些UDP流量,所以这里选择的TUN模式,同时在ipv6我也使用的是tun模式。tproxy可能性能会更好一些,但不清楚是否会有其他NAT问题出现。
                                    值得一提的是,这里的实验性:绕过中国大陆IPv6并不依赖于Dnsmasq,所以如果使用其他DNS转发服务的话(例如MosDNS或者AdGuard Home),也可以放心勾选。同时,如果已经使用mosdns进行分流,并且dnsmasq监听端口为53之外的端口,也可以开启实验性:绕过中国大陆IP ,开启后会通过nft set或者ipset将大陆IP端添加到防火墙中,不经过clash核心,提高性能,丧失的只是将dnsmasq通过特定dns解析返回的大陆IP地址添加到ipset这一项。 具体可以参考《实验性:不使用Dnsmasq绕过中国大陆IP》这篇文章。
                                    notion image

                                    OpenWRT路由设置:

                                    在以上配置完成之后,可能存在客户端ping外网出现Destination host unreachable的情况,通过查看路由表发现是旁路网关没有将主路由网关配置到路由表中,需要自己自行添加,lan口和lan6口都需要添加。
                                    路由类型:unicast
                                    目标:::/0
                                    网关:主路由的本地IPv6网关地址,fe80::开头,可以通过SSH登录主路由之后ifconfig查看,LAN口的就是。
                                    高级设置:表main(254)
                                    notion image

                                    🤗 总结归纳

                                    通过以上设置的话, 现在局域网内设备应该是可以获取到/64位的IPv6地址,且所获得的IPv6地址的默认网关及DNS服务器为旁路网关,达到了整个局域网内的IPv6使用代理。在Test your IPv6. (test-ipv6.com)上也可以检测出IPv6地址为代理的IPv6地址,同时针对不需要代理的服务,我们的IPv6地址还是运营商分发的前缀。
                                    notion image
                                    notion image
                                    其他针对BT客户端这种,我是通过单独虚拟一张网卡给qBitorrent使用,并单独配置这张网卡的网关为主路由网关,避免BT流量经过旁路由,可以正常使用。
                                    notion image

                                    其他待解决问题:

                                    目前网心云可以获取到运营商分发的前缀的IPv6地址,但状态显示IPv6待联通,通过Hyper-V虚拟机内部可以ping通外部IPv6地址,需要再进行观察一下,看看是否需要单独进行配置。目前在尝试通过静态路由或者防火墙的方式进行解决。
                                    如果你从主路由无法ping通局域网下设备的link-local ipv6 address ,也就是本地fe80开头的IPv6地址,出现address unreachable 错误,可以尝试为地址增加接口参数,例如:
                                    其中%br-lan即指定接口为br-lan,也就是本地网络接口。
                                    2024/09/30更新:
                                    网心云X86虚拟机默认只会接收一个RA服务器发送的SLACC,所以如果网络中存在多个RA服务器,那么网心云X86即便可以获取到正确的公网IPv6地址,也无法配置正确的网关和DNS,所以在网心云App中会显示IPv6待连通的情况。解决办法只能修改局域网的网络拓扑,变更为局域网只有一个RA服务器,且停用DHCPv6服务器。在OpenWRT下的具体方法我还在研究,目前仅能提供RouterOS作为主路由情况下的解决办法:RouterOS自动分流方案(支持IPv4 & IPv6)

                                    📎 参考文章

                                    💡
                                    有关OpenWRT IPv6安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    找不到NVIDIA NetworkService Container服务怎么办?

                                    2023年3月11日 08:00
                                    🎮
                                    前阵子家里换了电视,但是电视墙没有预留HDMI的接口,我又想在电视上玩Steam游戏,所以尝试使用Moonlight。Moonlight的延迟、带宽、画质和兼容性都控制的很好,本地局域网内的延迟控制在10ms(毫秒)以内,大部分是在5ms到6ms之间抖动,除了特别要求延迟的游戏(例如街霸这种),其他的都体验非常好。但是在配置的过程中,也遇到了一些问题,比如今天所说的NVIDIA NetworkService Container服务问题。

                                    📝 NVIDIA NetworkService Container服务消失怎么办

                                    什么是Moonlight
                                    "Moonlight" 是一个开源的游戏流媒体软件,它允许用户通过本地网络或互联网将他们的电脑游戏流式传输到其他设备上,例如智能手机、平板电脑、智能电视等。它最初是为Android设计的,但现在已经可以在多种平台上运行,包括Windows、macOS、Linux、iOS、tvOS等。用户可以使用Moonlight将他们的游戏流式传输到支持NVIDIA GameStream的计算机或设备上。使用Moonlight,您可以在其他设备上玩您的电脑游戏,而无需在该设备上安装游戏本身。这对于那些希望在移动设备上玩游戏,但不想为移动游戏购买而又想享受更好的游戏体验的用户非常有用。Moonlight使用高效的视频编码和解码技术,确保您在流式传输游戏时获得更流畅和高质量的体验。同时,它也支持多种游戏控制器,包括Xbox控制器、PlayStation控制器等,让您能够更舒适地进行游戏,通过Github上的修改版本,甚至可以兼容Nintendo Switch手柄。
                                    在某个版本的Nvidia Geforce Experience更新之后,存在NVIDIA NetworkService Container这个服务没有注册的问题,所以在客户端的Moonlight里面,尝试连接局域网的游戏主机一直是失败,提示无法连接到服务器,主机端也没有弹出认证的输入框。如果你也存在相同的问题,那么可以按照如下方式进行验证:
                                    1. 打开Windows服务管理,搜索
                                    notion image
                                    2. 在列表中查找是否有NVIDIA NetworkService Container这个服务。如果有,则右键启动。NVIDIA NetworkService Container在远程串流(Remote Play)中负责优化网络性能和管理数据流,以确保流畅的游戏体验,属于必须启动的服务项,如果没有,那么肯定也就没有办法使用远程串流服务。
                                    3. 如果没有这个服务,那么我们需要创建一下这个服务,并让其启动,管理员模式打开CMD,其中binpath内的相关路径,依照自己的Nvidia Geforce Experience安装路径进行修改。
                                    保存,并确认启动。
                                    4. 在客户端尝试通过Moonlight连接游戏主机。

                                    📝 更新

                                    Moonlight For Android(TV、手机及平板)的最新版本:Moonlight Android v11.0 更新
                                    目前不再推荐通过使用NVIDIA GameStream作为服务端进行远程串流,原因是该项服务已经被Nvidia关闭,Sunshine在各个方面都已经做的足够优秀,可以替代NVIDIA GameStream。
                                     

                                    Android跳广告神器:李跳跳2.4使用指南

                                    2024年12月5日 08:00
                                    😀
                                    发现的有点完了,之前一直有看到李跳跳2.4版本的更新,还有什么蓝色版李跳跳,但是没有找到更新源,担心是第三方修改版本,存在后门,所以就没有更新。最近用Follow,并且订阅了李跳跳的博客,翻阅RSS时候突然发现11月时候李跳跳已经更新了2.4版本,直接下载开整。

                                    📝 李跳跳是什么

                                    李跳跳APP 是一款强大的弹窗广告跳过手机软件,是Android平台,可以通过模拟的点击自动跳过一些APP软件的启动广告,弹窗广告,开屏广告。李跳跳无需ROOT,也无需联网,体积小巧。同类软件还有GKD。
                                    原来已经安装李跳跳·派大星 v2.2.0版本的话,需要先卸载,再安装新的安装包,否则会提示证书冲突。

                                    2.4版本更新内容

                                    1.内置更多规则。
                                    2.新增规则失效提醒。
                                    3.新增导入导出规则。
                                    4.新增规则生成器。
                                    5.新增微信自动勾选原图。
                                    6.新增QQ自动查看原图。
                                    7.为每个功能都添加注解。
                                    8.支持页面白名单。
                                    9.支持模糊匹配、首尾匹配、全匹配。
                                    10.支持联合规则。
                                    11.支持坐标点击。
                                    12.优化用户体验。
                                    13.优化内存占用。
                                    14.优化省电逻辑。
                                    15.优化暗色模式。
                                    16.优化安卓12系统下的一糟糕体验。
                                    17.修复少量BUG。
                                    18.适配锁屏然后亮屏出现的广告。

                                    下载地址

                                    地址是李跳跳提供的网盘地址。
                                    提取码:bsvt
                                    MD5:5fb44da0e972f92207b479383beb19e7
                                     
                                    夸克网盘「李跳跳·派大星 v2.4.0.apk」 链接:https://pan.quark.cn/s/ff5b6657871d 提取码:g6j5
                                    MD5:5fb44da0e972f92207b479383beb19e7

                                    广告屏蔽规则

                                    可直接复制代码, 在李跳跳中进行导入规则。目前测试抖音、小红书、哔哩哔哩、淘宝、京东等常用App均已经可跳过开屏广告、升级提示、评分广告等等,已经足够日常使用,无需再自行添加规则。
                                    下载这个txt文件,复制并导入到李跳跳中即可:

                                    导入规则方法

                                    打开李跳跳 → 点击更多 → 点击右上角三个点导入规则 → 粘贴上面的代码到输入框内,保存即可。

                                    李跳跳设置

                                    1. 打开李跳跳,点击更多
                                    notion image
                                    1. 点击哆啦百宝袋,进行程序运行设置
                                    notion image
                                    1. 开启跳过提示前台服务隐藏后台三个功能。
                                      1. 跳过提示:在跳过广告时有小字提示
                                      2. 前台服务:避免程序因为进程优先级被关闭,保持李跳跳常驻
                                      3. 隐藏后台:避免因为在任务列表手贱点击全部关闭而杀进程。
                                      4. 如果还存在李跳跳被杀进程的情况,需要在对于Android系统中将李跳跳的电池优化改成无限制。

                                    📎 参考文章

                                     
                                    💡
                                    有关Android安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                    LazyVim,Neovim下的另一种懒人配置

                                    2023年4月5日 08:00
                                    😀
                                    LazyVim从名字就可以看出,是一个面向懒人的解决方案。LazyVim是一种Neovim配置合集,它由lazy.nvim开发,可以让你轻松自定义和扩展相关配置。使用LazyVim,你可以跳过从头开始配置的步骤,因为它为Neovim配置了大量插件,使其可立即具备像目录、自动补全和跳转等功能,即插即用。
                                    需要注意的是,LazyVim不是Neovim的替代品,而是基于「约定大于习惯」准则,将一些常用、好用的插件和配置预置到配置文件中。
                                    为了使用LazyVim,你需要先安装Neovim,再安装LazyVim。当你打开Neovim后,它会自动加载配置和插件,从而快速完成Neovim的配置。接下来,让我们详细介绍一下LazyVim的使用方法。

                                    1. 安装Neovim

                                    可以通过各系统的包管理器进行安装,例如:
                                    如何希望自己编译安装,可以参考:如何在Debian上编译安装Neovim

                                    2. 安装LazyVim

                                    在终端中使用git克隆仓库

                                    3. 启动NeoVim

                                    在终端中输入:
                                    启动Neovim后,LazyVim会自动安装预置的插件并加载LazyVim配置。使用LazyVim的Neovim启动速度非常快。
                                    notion image
                                    LazyVim 的出现可以说是将主流IDE和Vim的优点有机地结合在一起,使得它既具备强大的编辑和编程功能,同时也具备交互体验和开发效率。因此,使用 LazyVim 可以让你更加高效地完成编程工作,并且能够享受使用Vim带来的编辑效率和快乐。

                                    4. 其他

                                    LazyVim的快捷键:⌨️ Keymaps | LazyVim,或者也可以查看我还是翻译中的版本LazyVim快捷键
                                     

                                    Android免拔SIM卡使用官方TikTok

                                    2025年1月4日 08:00
                                    😀
                                    TikTok(抖音国际版或者洋抖)在中国(大陆及香港地区)无法正常使用,原因在于TikTok会检测用户手机设备中SIM卡的国家代码,若为中国大陆或香港用户则会直接提示“TikTok 网络错误”或无法使用完整功能,即便已经使用纯净IP的家宽节点,也无济于事。目前在解决Tiktok在中国大陆使用常见的解决方法包括:拔除SIM卡或修改TikTok应用。修改Tiktok应用即所谓的解锁版,出于账号安全原因和手机安全风险,并不建议使用这种Tiktok破解版。今天,在这篇文章中将介绍一种无需拔除SIM卡即可使用官方TikTok的方法。

                                    📝 Tiktok检测原理

                                    TikTok检测中国大陆、中国香港地区及其他受限地区用户的原理主要基于以下三个方面:
                                    1. SIM卡检测
                                      • 国家代码检测:TikTok通过读取手机设备上的SIM卡国家码信息来确定用户所在的国家或地区。中国大陆的SIM卡通常会有特定的国家代码(如CN),当TikTok检测到此代码时,会限制用户的功能或直接显示网络错误。
                                      • 运营商识别:TikTok还可能通过识别SIM卡所属的运营商来进一步确认用户的地理位置。
                                      1. IP地址检测
                                        • 地理定位:TikTok会通过用户的IP地址来判断其所在的地理位置。如果IP地址显示用户位于中国大陆、中国香港或者其他禁止使用地区,TikTok会采取相应的限制措施。
                                        • 动态IP检测:为了防止用户通过VPN等方式绕过检测,TikTok可能会监控IP地址的动态变化,识别异常的IP行为,例如频繁切换节点,出口IP满世界乱飞。
                                        • IP地址干净度:TikTok会尝试对BGP机房的IP地址进行阻止访问,原因在于大部分通过机房线路IP所来的请求为代理请求。
                                        1. 设备信息检测
                                          • 设备标识符:TikTok可能通过读取设备的唯一标识符(如IMEI、MAC地址等)来识别用户的设备,并根据设备的注册地或其他信息进行判断。
                                          • 系统语言和时区:TikTok还会检查设备的系统语言和时区设置,如果这些设置与中国的标准一致,也可能触发检测机制。
                                          以上检测部分,第二点IP地址检测我们可以通过代理方式进行解决,使用纯净的家宽节点完全可以规避IP地址检测。第三点可以通过修改手机语言方式进行解决,时区部分我实测目前没有影响。
                                          所以剩下的就是第一点,SIM卡检测。这也是为什么现在大多数的Tiktok使用教程均需要将SIM卡从手机移除,当Tiktok检测不到SIM卡国家码的时候,就无法确认你是否在被禁止使用的地区。而现在通过Nrfr这个开源软件,即可实现SIM卡国家码的修改,从而完全避开TikTok检测,正常使用TikTok。这个方法无需ROOT,而且也不用担心各种Tiktok解锁版、Tiktok破解版的程序后门而带来的安全风险。并且,通过Nrfr修改SIM卡国家代码的这种方式,在Google Play应用商店也可以同步进行更新Tiktok版本,无需担心某次更新后Tiktok就无法使用了。

                                          📝 Nrfr介绍

                                          🌍 免Root的SIM卡国家码修改工具,让你的网络更自由。
                                          Nrfr是一款强大的SIM卡国家码修改工具,无需Root权限即可修改SIM卡国家码。本项目完全基于Android系统原生API实现,不依赖Xposed、Magisk等任何第三方框架,仅通过调用系统级接口实现功能。通过修改国家码,你可以:
                                          • 🌏 解锁运营商限制,使用更多本地功能
                                          • 📱 优化信号显示和网络选择
                                          • 🔓 突破某些区域限制的应用和服务
                                          • 🛠️ 解决国际漫游时的兼容性问题
                                          • 🌐 帮助使用海外SIM卡获得更好的本地化体验
                                          • ⚙️ 解决部分应用识别SIM卡地区错误的问题

                                          SIM卡国家码实现原理

                                          Nrfr通过调用Android系统级API(CarrierConfigLoader)修改系统内的运营商配置参数,而不是直接修改SIM卡。这种实现方式:
                                          • 完全在Android系统层面工作,不会对SIM卡本身进行任何修改或造成损坏
                                          • 仅改变系统对SIM卡信息的读取方式
                                          • 基于Android原生API实现,不依赖任何第三方框架(如Xposed、Magisk等)
                                          • 通过Shizuku仅提供必要的权限支持
                                          • 所有修改都是可逆的,随时可以还原

                                          ✨ 特性

                                          • 🔒 安全可靠
                                            • 无需Android系统Root权限
                                            • 不修改系统文件
                                            • 不影响系统稳定性
                                            • 不会对SIM卡造成任何影响
                                          • 🔄 功能完善
                                            • 支持随时还原修改
                                            • 支持双卡设备,可分别配置
                                            • 一次修改永久生效,重启后保持
                                          • 🚀 简单易用
                                            • 一键启动工具
                                            • 智能检测设备和SIM卡状态
                                            • 自动安装所需应用
                                            • 简洁优雅的用户界面
                                            • 轻量且高效,安装包体积小(不到8MB)

                                          📝 Nrfr使用教程

                                          开启Android开发者模式

                                          这里以我的小米15(澎湃OS2)为例,不同手机品牌与系统可能存在差异。
                                          打开设置 ,点击我的设备 ,快速且疯狂的点击OS Version(OS版本?系统版本?),直到提示"You are already a developer" ,即表示开启开发者模式成功。
                                          开发者模式选项位于更多设置 - 开发者选项

                                          开启Android系统USB调试功能

                                          进入开发者选项 ,下滑找到USB调试 ,点击开启。如果是澎湃OS2系统,会进行一些风险提示,选择允许。然后找到USB安装 ,同样点击进行开启。如果你是小米手机,或使用MIUI系统或澎湃OS系统,还需要开启USB调试(安全设置)

                                          安装Shizuku

                                          Nrfr的使用需要通过Shizuku获得Android系统的调试权限。所以第一步需要安装Shizuku。
                                          Shizuku是一款基于开源框架的ADB(Android Debug Bridge)权限管理工具,专为现代安卓生态设计。在多数安卓设备已限制ROOT解锁权限的现状下,用户仍存在大量涉及系统层级的操作需求(如冻结预装应用、管理后台服务等),而此类功能往往可通过标准ADB指令权限实现。与传统ROOT方案不同,Shizuku通过动态注入系统API的机制,将复杂的ADB命令行操作转化为应用程序可直接调用的标准接口。Shizuku支持Android 6.0及以上系统,覆盖主流国产定制UI(MIUI、ColorOS等)。
                                          你可以通过Google Play进行下载安装,或者通过Shizuku的Github下载最新的Released版本。
                                          Google Play:Shizuku
                                          Github Released: GitHub Release

                                          Shizuku配对

                                          首先将手机连入一个无线网络(WIFI),有无互联网连接都无所谓,其他手机的热点也可以,主要原因在于,在未连接WIFI的情况下,无法启用Android开发者模式的无线调试。
                                          同时,小米手机用户(澎湃OS2)需要修改通知样式为Android默认样式,否则无法在通知栏输入配对码。位置在通知管理 - 通知显示设置 - 原生样式
                                          打开已经安装的Shizuku,找到通过无线调试启动,点击下面的配对,在第一次使用时,Shizuku会提示开启通知权限。
                                          点击Shizuku内的开发者选项 ,找到无线调试 ,点击进入,开启无线调试 ,点击使用配对码配对设备 ,然后在Shiziku的通知内,输入配对码完成配对操作。
                                          配对完成后,可以将通知样式改回原来的样式,避免影响日常使用。

                                          Nrfr安装

                                          从Github下载Nrfr。
                                          下载完成后,解压并打开Nrfr 快速启动工具
                                          将手机通过USB线连接到电脑,保持开启USB调试权限。此时选择设备中会出现你的手机。
                                          notion image
                                          点击确认选择 ,在检查应用中会提示Nrfr的手机App没有安装,点击确认并继续 ,进行安装。
                                          notion image
                                          notion image
                                          点击安装必须应用,手机上会弹出通过USB安装的提示,点击继续安装
                                          notion image
                                          点击继续下一步 ,进行Shizuku的启动与授权。
                                          notion image
                                          此时会弹出Shizuku未授权的提示,需要我们打开Shizuku,在已授权应用中开启Nrfr的授权选项。
                                          notion image
                                          然后在Nrfr 快速启动工具中,点击启动Nrfr
                                          notion image

                                          Nrfr设置SIM卡国家码

                                          在手机上打开Nrfr,显示如下界面
                                          notion image
                                          如果是单卡用户,则直接选择SIM卡,然后选择国家码为美国(US)日本(JP) ,不要选择香港(HK)这种非运营区。Tiktok封禁的地区可以从维基百科查看:对TikTok的审查 - 维基百科,自由的百科全书
                                          双卡用户,修改SIM1即可,不需要全部进行修改,Tiktok判定其中有一张手机卡的国家码为允许地区的就可以使用。
                                          另外需要提示,修改的SIM卡国家码尽量与你的代理节点出口地址相同,防止因IP与国家码不同,被ByteDance判定为使用代理所出现的账号问题。同时,建议在登录账号时使用纯净度较高的落地IP,例如部分家宽节点,避免Tiktok使用三方登录出现问题。
                                          最后需要注意的是,因为Android开发者权限的原因,每次手机重启之后,需要重新通过打开Android开发者模式中的无线调试功能,启动Shizuku及Nrfr,并修改SIM卡国家码,否则Tiktok还是会提示网络错误。
                                          打开你的FlClash、Clash-Meta、Sing-box等等科学上网App,然后开始使用Tiktok吧!

                                          🤗 总结归纳

                                          至此已完成Android免拔除SIM卡使用Tiktok的全部配置工作,此时通过Google Play下载安装Tiktok并打开,其所有功能已经可以全部正常使用,包括登录自己的Tiktok账号。最近我也是高强度的刷了几天Tiktok,把原本睡前刷抖音的时间全部用来刷了Tiktok,发现Short Video短视频这个东西真的是毒,几乎没有什么语言障碍,画面表达的内容有时候无需语言,难怪全世界的人们都上瘾。
                                          不过随着1月19日Tiktok禁令的即将生效,以及大量国外用户涌入小红书(Red Note),估计这篇文章的内容也没有太多的意义了。
                                          notion image

                                          TikTok代理规则

                                          如果你也使用Dae,那么可以增加以下规则用于TikTok分流。Geosite所提供的tiktok部分域名可能存在不完全的情况,需要单独添加一条roovza-launches.appsflyersdk.com 的规则,并使用和Geosite:tiktok 相同的代理节点,例如分流指向日本(JP)、新加坡(SG)等代理出口用于正常使用TikTok,香港(HK)出口无法使用TikTok。其他软件根据文件格式可自行修改添加。建议使用国外无污染DNS,避免因为解析结果或DNS泄露被判定为国内用户。

                                          📎 参考文章

                                           
                                          💡
                                          有关TikTok安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                          版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                          使用Caddy反向代理加速NotionNext博客图片访问

                                          2025年1月2日 08:00
                                          📌
                                          NotionNext默认使用的是Notion图床。Notion在国内没有服务器,所以通过Notion.so域名请求的图片资源文件在国内的访问速度不是很好,我们可以通过使用Caddy反向代理的方式加快Notion.so的图片访问,降低加载图片所需时间,从而提高使用NotionNext的博客在国内(大陆地区)的访问速度与用户体验。
                                          我这个使用NotionNext,部署在Vercel上的博客页面加载时间太长的问题,也是由于昨天突然博客的国内用户的访问量增加,我在Cloudlfare Web Analytics里面进行日常数据查看时发现的,涉及到的文章页面主要是《小米15手机(澎湃OS2):如何关闭推荐广告 | Deep Router》这篇文章,原因在于这篇文章我放了很多的手机截屏图片,这些图片需要进行加载,即使我已经使用了图片的延迟加载功能,但是依旧会因为首屏需要加载3-4张图片,而造成整体页面的加载时间过长,影响用户体验。因为Notion在国内没有服务器,访问速度不算很好,所以大部分图片的LCP(Largest Contentful Paint)延迟都在5秒左右,FCP也因为我未使用webp格式的图片造成访问延迟上升。在一篇包含很多张图片的文章里,整体的加载速度更堪称灾难级,可能需要30秒以上才能完成首屏加载,这一点在移动端设备上,因为性能差异进一步被放大。为了优化博客国内的访问体验,所以我尝试寻找解决方案,让NotionNext的图片加载不再那么灾难。在《Nginx设置Notion反代加速NotionNext图片资源访问》这篇文章中(原文章似乎被作者删除,目前处于404状态),文章作者提到可以通过使用Nginx反向代理(反代)方式进行解决,通过Nginx将用户对图片素材的访问请求反向代理至notion.so,这样只要部署Nginx的机器在国内的访问速度够快,那么托管的Notion上的图片资源也能够很快的进行加载,降低LCP延迟。但是我没有使用Nginx作为Web服务器,而是使用的Caddy这个更轻量化的解决方案,所以就在这篇文章的基础上,提供一份基于Caddy的反向代理解决方案。
                                          在开始之前,我们先查看一下目前Notion.so在国内的访问情况,大部分浅绿,平均加载时间在3s左右,且在部分地区无法直接进行访问:
                                          notion image

                                          📝 Caddy反向代理配置前提

                                          你需要一台云服务器,境内境外均可,我所使用的小鸡(云服务器)是在香港,购自CoalCloud(碳云),国内访问速度在ITDOG上查询还不错。平常只作为RSS推送服务和Docker加速镜像使用。如果不使用Cloudflare的话,需要自行在云服务器为用于反向代理的域名申请证书,例如使用letsencrypt或者acme,但是如果你也和我一样使用Caddy的话,那么Caddy会自动帮你通过acme申请好所配置的域名的证书。
                                          也有一些解决方案是通过Cloudflare Worker实现,我没有使用Cloudflare Worker进行反向代理的原因是担心会被认为在滥用,从而导致Cloudflare账号被封禁(Ban)或限制服务。

                                          📝 什么是Caddy

                                          Caddy是一个开源的Web服务器和反向代理工具,专注于简化HTTP服务器的配置流程和提升安全性。它以自动化HTTPS部署为核心特性,无需手动操作即可为站点申请并更新SSL/TLS证书。支持HTTP/3、静态文件托管、负载均衡、反向代理等功能,通过简洁的配置文件(或直接通过 API)即可快速部署HTTP服务。Caddy凭借原生Go语言编写的高效性和跨平台兼容性,常被用于轻量化场景,适合Web开发者和运维人员快速构建安全的网络服务,作为Nginx的替代服务。
                                          Caddy的最新版本是Caddy2,目前主流版本也是Caddy2。需要注意的是,Caddy和Caddy2的配置文件语法并不完全一样,当你无法确认自己编写的配置文件是否符合Caddy2语法时,可通过以下命令进行测试:

                                          📝 安装Caddy

                                          Caddy的安装很简单,由于不使用其他第三方插件,所以可以直接通过系统的包管理器进行安装,例如我使用的是Debian系统:
                                          如果你需要使用缓存,或者使用其他Caddy的插件,你也可以通过Download Caddy增加所需插件,例如缓存插件darkweak/souin/plugins/caddy,并进行二进制可执行文件的下载。Caddy的插件是通过Go的编译时插件系统实现,即需要在Caddy编译时绑定并集成插件,与Nginx和Apache有所区别。增加插件后的Caddy可支持特定语法。目前虽然Caddy也支持通过caddy install 命令增加插件,但还处于实验性阶段,可能存在潜在的稳定性风险。
                                          在Bash中,可通过以下命令查看Caddy已安装的插件:

                                          📝 修改Caddy配置文件

                                          这里我所使用的域名是notion.dolingou.com ,即通过notion.dolingou.com域名替代notion.so域名从而实现反向代理加载位于Notion上的图片。安装完Caddy之后,默认的Caddy配置文件位于/etc/caddy/Caddyfile ,你可以使用你喜欢的编辑器进行编辑,例如我使用的是Neovim ,在配置文件中添加如下内容,通过{}进行片段的包裹:

                                          Caddy2配置要点

                                          配置要点部分对上述配置文件进行分片段讲解。

                                          压缩模式

                                          涉及代码段:
                                          采用gzip压缩,降低带宽利用。

                                          拒绝所有非来自博客域名请求

                                          涉及代码段:
                                          这部分代码主要是定义非来自博客的域名请求host,避免这个反向代理被恶意使用,造成反向代理服务器的负载过高出现问题,或者盗刷大量流量。所有非博客域名的请求均会返回403错误。你可以将*.dolingou.com 替换为你的域名。

                                          处理Caddy反向代理域名根目录请求

                                          根目录请求处理涉及代码段:
                                          这部分代码主要用于定义域名所绑定的根目录位置,以及当用户直接访问根目录及根目录下/image时,返回200 请求,并设置响应头的Content-Typetext/plain ;一方面为特定路径提供简单的占位符响应,另一方面可以快速测试服务器的响应,便于Debug。

                                          Caddy反向代理转发配置

                                          反向代理转发配置部分涉及代码段:
                                          这段代码用于定义NotionNext图片的请求路径,将匹配特定路径的请求代理转发到目标服务器https://www.notion.so,并在转发过程中设置一些请求头、Host、Referer、User-Agent和SSL/TLS配置。
                                          具体如下:
                                          1. 定义匹配器 @imagePath
                                            • @imagePath 是一个匹配器(matcher),用于匹配特定的请求路径。
                                            • path_regexp image ^/image.*$:使用正则表达式匹配路径。
                                              • ^/image.*$:匹配以 /image 开头的所有路径,例如 /image/image/123/image/test.jpg 等。
                                            • 这个匹配器会捕获所有路径符合正则表达式 ^/image.*$ 的请求。
                                            1. 反向代理配置:
                                              • reverse_proxy 是一个指令,用于将请求代理转发到指定的后端服务器。在Caddy 1版本中,反向代理是proxy
                                              • @imagePath:指定匹配器,表示仅对匹配 @imagePath 的请求生效。
                                              • https://www.notion.so:目标服务器的地址,所有匹配的请求都会被转发到这里。根据NotionNext的默认配置文件NEXT_PUBLIC_NOTION_HOST 的默认值提示,填写notion.so域名。
                                              1. 设置请求头:
                                                • header_up 是一个指令,用于设置转发到后端服务器的请求头。
                                                • Host www.notion.so:将 Host 头设置为 www.notion.so,确保后端服务器知道请求的目标主机。
                                                • Referer https://www.notion.so:将 Referer 头设置为 https://www.notion.so,模拟请求来源。
                                                • User-Agent {http.request.header.User-Agent}:将 User-Agent 头设置为客户端原始请求的 User-Agent,确保后端服务器能够识别客户端类型。
                                                • X-Real-IP {http.request.remote.host}:将 X-Real-IP 头设置为客户端的真实IP地址,用于后端服务器记录或处理。
                                                • Accept-Encoding "":清空 Accept-Encoding 头,防止后端服务器返回压缩内容(如果需要)。
                                                • Accept-Language {http.request.header.Accept-Language}:将 Accept-Language 头设置为客户端原始请求的 Accept-Language,确保后端服务器返回正确的语言内容。
                                                • X-Cache {http.reverse_proxy.header.X-Cache-Status}:将 X-Cache 头设置为反向代理的缓存状态(如果有)。
                                                1. SSL/TLS配置:
                                                  • transport http:定义HTTP传输配置。
                                                  • tls:启用TLS(HTTPS)加密,确保与后端服务器的通信是安全的。
                                                  • tls_server_name www.notion.so:设置TLS的服务器名称为www.notion.so,用于SNI(Server Name Indication)验证。
                                                  完成以上配置后,直接访问反代域名,这时候浏览器应该会显示一个200 OK! ,即表示配置成功。
                                                  1. Caddy缓存配置:
                                                  我没有像上面Nginx样例中一样为反向代理添加缓存。原因在于目前Caddy2自身没有提供缓存功能,需要通过插件实现。而插件在命中率和缓存污染等方面的实现情况并不是很好。我的博客本身流量也不是很大,而且又有Cloudflare的CDN作为缓存,所以也就没有继续研究Caddy的这部分缓存功能。
                                                  1. 重启Caddy
                                                  在完成上述Caddyfile配置文件修改后,需要对Caddy进行重启:

                                                  📝 配置Vercel环境变量

                                                  完成以上在云服务器的Caddy配置后,在Vercel中的NotionNext项目下添加环境变量NEXT_PUBLIC_NOTION_HOST,用于替换默认的Notion Host变量(https://notion.so)。
                                                  Vercel环境变量配置的位置位于SettingsEnvironment Variables 中,在Key中输入变量名称,Value中输入变量值,点击Save即可新增环境变量:
                                                  注意需要携带https,否则该Notion Host无法正常使用,Vercel无法识别是否为https链接。添加上述环境变量完成后,需要在Vercel中对NotionNext进行重新部署(Redeploy)即可生效。
                                                  这时候打开博客的图片,查看图片地址,应该类似于https://notion.dolingou.pro/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F6d3fda40-6b03-4bf3-842b-4c9bb68a90f1%2F5a7f71fc-218f-4ac0-b76f-e471232cd7647%2Fandroid-chrome-512x512-min.webp?table=collection&id=f87dcb58-ba2a-40bb-a156-53d7877975e9&t=f87dcb58-ba2a-40bb-a156-53d7877975e9&width=800&cache=v2" 这种。如果直接访问这个地址,会通过302重定向的方式,经由s3.us-west-2.amazonaws.com ,最终到https://img.notionusercontent.com/s3/prod-files-secure%2F6d3fda40-6b03-4bf3-842b-4c9bb68a90f1%2F5a7f71fc-218f-4ac0-b76f-e47602cd7647%2Fandroid-chrome-512x512-min.webp/size/w=800?exp=1741086188&sig=klZmCOx0XSjO_rQwnGGeMEyR_Kuz1dct7Y5cyf3Fdv4

                                                  🤗 Caddy反向代理配置总结归纳

                                                  因为我最终还是将反向代理域名使用Cloudflare CDN服务,也就是开启小黄云,所以为反向代理域名配置了SaaS回源使用Cloudflare域名优选(没错,CNAME到了Linux.do),优化国内的访问速度。同时由Cloudflare提供缓存,故未在反向代理服务器的Caddy配置中添加缓存配置。目前的国内访问情况如下,相比使用默认的Notion.so ,在全国范围内速度提升了不少,响应延迟基本都控制在1.5s ~ 2s左右,同时在访问可达性上来说,全国范围应该都可以正常访问。
                                                  notion image
                                                  由于最近更换了博客域名,所以图床的反向代理链接也进行了更新,现在是notion.deeprouter.org,在上面教程中的域名,也都已经替换为这个新的域名。

                                                  📎 参考文章

                                                  💡
                                                  有关Caddy安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                  自用无泄露MosDNS规则分享

                                                  2024年9月2日 08:00
                                                  😀
                                                  之前一篇文章介绍了OpenClash + MosDNS + Adguard Home的DNS泄露排查及修复记录。这里面最为核心的部分就是MosDNS,OpenClash和Adguard Home只负责最简单的解析工作,而MosDNS作为整个链条的中枢负责分流,类似于一个指挥中枢。所以今天将我的MosDNS配置分享出来。我的MosDNS是根据 Jasper-1024/mosdns_docker 的MosDNS V5配置进行二次修改的版本,所以这篇文章也可以说是一个二创文章,对原作者的配置进行了部分修改,并对整体的DNS处理流程进行讲解。

                                                  📝 付费内容

                                                  MosDNS介绍

                                                  一个 DNS 转发器 via IrineSistiana / mosdns
                                                  MosDNS可以算作是SmartDNS的一个替代品,两者作用在大部分场合相同。SmartDNS更侧重于缓存,而MosDNS的可玩性更高。

                                                  配置环境

                                                  我的MosDNS是运行在旁路由(旁路网关)的OpenWRT上,具体环境如下:
                                                  • OpenWRTImmortalWrt 23.05.3 r27917-81a1f98d5b / LuCI openwrt-23.05 branch git-24.092.44091-d24c2e3
                                                  • 内核版本5.15.162
                                                  • 架构X86/64
                                                  • MosDNS版本v5.3.3
                                                  以上的环境只是我个人的配置环境,理论上如果你使用MosDNS,在其支持的环境下都可以正常使用我所分享的配置文件,包括Windows、Linux的发行版本、MacOS以及Docker。

                                                  Github仓库地址

                                                  使用方法

                                                  配置文件共计3个,分别为config_custom.yaml, dns.yaml, dat_exec.yaml
                                                  各部分作用如下:
                                                  • config_custom.yaml: 主配置文件,负责DNS序列定义以及DNS序列执行。需要依赖dns.yamldat_exec.yaml运行。
                                                  • dns.yaml: dns定义配置文件,负责配置公共DNS服务器及远端解析DNS地址及端口。
                                                  • dat_exec.yaml: 规则配置文件,负责定义各规则tag及规则来源文件。
                                                  下载或克隆三个yaml文件,OpenWRT放到/etc/mosdns文件夹内。如果是luci-app-mosdns,需要选择使用自定义配置文件。其他系统可以通过-c 参数指定配置文件为config_custom.yaml
                                                  默认GeoSite和GeoIP的存放位置为/var/mosdns/ ,请确保文件夹下含有geoip_cn.txtgeosite_category-ads-all.txtgeosite_geolocation-!cn.txtgeosite_gfw.txtgeosite_cn.txt以及geoip_private.txt ,OpenWRT用户可以通过luci-app-mosdnsGeoData Export功能自动下载解码生成:
                                                  notion image
                                                   
                                                  同时,在/etc/mosdns/下需要建立rule文件夹,并新建whitelist.txtgreylist.txt文件,用于自定义白名单和污染域名名单。DDNS类域名可放到白名单whitelist.txt中。
                                                  默认监听端口为5333 ,TCP和UDP均开启,如无下游DNS服务,可修改为53端口使用。如果系统为OpenWRT,也可以直接修改dnsmasq的dns重定向到5333来使用。具体使用方法根据自己需要进行修改。修改的具体位置位于config_custom.yaml文件最底部。

                                                  MosDNS处理队列

                                                  notion image
                                                  前序列代码:
                                                  主序列代码:
                                                  合并序列:
                                                  前序列处理流程主要用于对本地域名、PTR请求、无效请求以及DNS声明等请求进行处理,不涉及到正式的域名DNS解析,不与公共DNS服务器产生数据上的交互,避免本地内部请求外泄,对解析洁癖产生安全问题的恐慌。
                                                  主序列处理流程主要用于公网的正式域名解析进行处理,根据分流规则进行直接通过公共DNS服务器进行域名解析或通过DNS转发方式将污染域名交由代理处理。
                                                  整体MosDNS的配置文件由以下部分的DNS查询片段组成:
                                                  • query_lan
                                                  • query_cn
                                                  • query_gfw
                                                  • query_nocn
                                                  • query_fallback
                                                  在处理上通过对cngfw!cn域名的特定处理,从而避免产生DNS泄露问题。

                                                  query_lan

                                                  query_lan用于处理本地DNS请求,例如局域网内*.lan的域名解析以及PTR请求。PTR请求包括反查路由器域名、反查局域网组播域名、UPNP使用的SSDP服务对应域名以及DNS Service Discovery等。MosDNS作为DNS转发器,其本质是进行DNS的转发,并不能直接对DNS请求进行处理。在OpenWRT上,dnsmasq可以对PTR请求做出正确的回应,所以我将query_lan所使用的dns_lan配置为主路由(也是OpenWRT)的地址,由主路由的dnsmasq进行上述请求处理。在这里并不一定严格要求使用主路由使用OpenWRT系统,正常的路由器基本都可以对此进行回应。
                                                  代码片段:
                                                  主配置文件:
                                                  query_lan中,增加了cache_lan的执行选项,因为本地的DNS请求也是有DNS缓存的,通过缓存可以节省一点点时间和主路由的处理压力。
                                                   
                                                  dns.yaml配置文件:

                                                  query_cn

                                                  query_cn是用于对已经通过Geosite和Geoip识别到为国内网站的域名,以及配置白名单的域名进行直接解析。
                                                  代码片段:
                                                  主配置文件:
                                                  首先通过ecs_cn为DNS请求附加上ecs信息,ecs相关配置在下面的dat_exec.yaml 文件中。请求所携带的IP地址可以填写你所在地运营商dns的地址,使DNS解析结果的IP地址在物理上更接近你所在的IP地址,降低访问延迟。个人不建议填写自己的公网IP地址,尽管使用的是阿里巴巴和腾讯的公共DNS服务,但依旧存在根据IP地址追踪的可能。
                                                  同时,在通过阿里和腾讯的公共DNS服务进行请求时,如果发现响应返回的是非大陆地区的IP地址,会将该请求丢弃,视为解析错误,并将该DNS请求加入到query_nocn队列进行处理。这样处理的意义在于,解析结果返回非大陆地区IP地址的一种可能为ecs没有生效,公共DNS服务器认为我们在其他的国家,另一种可能为该网站进行了服务器迁移,迁移到了国外的云服务提供商。不管是哪种结果,对于我们来说,返回的结果都不是最优的结果,无法提供足够快的访问速度,所以不如交由query_nocn去请求一个更精确的地址。
                                                  在国内(cn)的公共DNS服务器选择上,我选择了阿里巴巴的公共DNS服务和DNSPOD(腾讯)的DNS服务,我没有选择运营商的DNS服务,因为运营商的DNS服务无法提供DOH或DOT。同时在使用H3、Quic以及Pipeline的基础上,同时使用ECS,解析的结果已经足够精确,速度也足够的快,没必要为了更快一点点而选择不安全的公共DNS服务。阿里DNS作为主DNS,同时DNSPOD作为备用DNS,开启副可执行插件始终待命。
                                                  dns.yaml配置文件:
                                                  在国内(cn)的公共DNS配置上,只使用DOH和DOT,同时阿里DNS的DOH开启H3,DNSPOD目前还不支持H3;两家DNS的DOT均开启pipeline;不使用Quic DNS,晚高峰时运营商对Quic的Qos太严重。并发请求数量上维持原版的最大数量为3,从并发请求结果中选择返回最快的结果,加快DNS解析速度。
                                                  dat_exec.yaml:
                                                   

                                                  query_gfw

                                                  query_gfw用于直接对已经确认污染域名进行DNS转发,将DNS解析请求通过上级代理进行远端解析。端口7874 为OpenClash所使用的dns监听端口,可根据自己所使用的程序进行修改。
                                                  代码片段:
                                                  主配置文件:
                                                  dns.yaml配置文件:

                                                  query_nocn

                                                  query_nocn是用于对不处于GFW List中的国外域名进行解析请求的部分。由于geosite:gfwgeosite_geolocation-!cn 的子集,所以query_nocn在主序列中位于query_gfw的下一层级,这样配置的原因在于对于已经确认被污染的域名,没有必要通过公共DNS再继续进行解析,直接交由forward_remote的代理直接进行解析速度更快,稳定性也更好一些,同时避免产生国内运营商的反诈劫持行为。
                                                  代码片段:
                                                  主配置文件:
                                                  对国外域名所附加的ECS IP地址,我通常会选择我所使用代理服务器出口附近的IP地址,这和我家里整体的网络设计有关,对于非大陆的IP地址,在没有特殊的设置情况下,均会通过代理访问,所以配置出口附近的IP地址是最好的选择,这样所解析的地址更靠近出口位置,从而获得更好的访问速度。你可以通过ipify或者其他IP地址查询网站查看自己的出口IP地址。
                                                  同时如果通过使用国外公共DNS服务器进行解析请求的结果返回的如果是大陆的IP地址,进行drop(丢弃)处理。这种情况一般表示这个域名已经被污染,即便使用请求返回的IP地址,也无法正常访问。对于部分省市的劫持反诈,也可以将反诈网站所解析的IP地址进行drop,重新使用fallback进行查询。
                                                  由于Cloudflare和Google提供的公共DNS服务在国内的延迟较高,或者无法正常使用,所以我选择了AdGuard DNS和NextDNS的dns服务,相比其他的国外无污染公共dns服务,在我这里ping下来延迟较低,且稳定性较好。你也可以根据你自己的网络情况选择自己适用的国外DNS服务。关于国外DNS服务器的选择,可以参考《国内外DNS推荐列表》这篇文章。
                                                  dns.yaml配置文件:
                                                  NextDNS在注册时候可以使用h3,同时会分配一个属于自己的dns地址,每个月的配额在300,000请求,家庭使用的话,基本上用不完。Quad9目前不支持h3,两者都支持pipeline。
                                                  在这里我配置的并发请求数(concurrent)为2,牺牲一些速度的同时,避免产生过多的upstream error错误。
                                                  dat_exec.yaml:

                                                  query_fallback

                                                  query_fallback用于对不满足上述已经执行规则的解析请求进行再次请求,默认使用dns_cn进行解析。
                                                  如果担心产生DNS泄露,fallback也可以使用国外DNS。
                                                  代码片段:
                                                  主配置文件:

                                                  DNS缓存

                                                  DNS缓存分为lan缓存(局域网域名)和wan缓存(公网域名),未开启乐观缓存,因为在下游我配置了AdGuard Home会开启乐观缓存。
                                                  代码片段:
                                                  dat_exec.yaml:

                                                  DNS泄露测试网站

                                                  一般来说,以ipleak为例,如果全部300次请求都没有产生泄露,那么就大概率没有DNS泄露。

                                                  其他

                                                  关于pipelines

                                                  enable_pipeline: TCP/DoT 使用RFC 7766新的query pipelining连接复用模式。
                                                  • 启用后可大幅提高连接利用率,减少建立连接/握手的次数,进而降低响应延时。
                                                  • 并非所有服务器都支持。必须确定服务器支持后再启用该选项。
                                                  • Tips: 已知Google和Cloudflare的TCP/DoT是支持该模式的。知名的公共DNS服务商大多数都支持该模式。可以使用mosdns probe pipeline {tcp|tls}://server_ip[:port] 测试命令测试服务器是否支持。比如mosdns probe pipeline tls://8.8.8.8

                                                  关于dial_addr

                                                  dial_addr: IP协议层面建立连接时使用的地址。如果host是域名,此处填入IP可免去每次建立连接时解析服务器域名。支持指定端口号。
                                                  目前MosDNS的bootstrap指定功能还处于实验性阶段,dial_addr相当于直接为DOH/DOT的dns服务器指定IP地址,省去解析的步骤。对于使用Cloudflare的DNS,也可以通过优选IP的方式进行筛选,从而选择最快的DNS接入点。

                                                  关于IPv6

                                                  国内DNS分流和远端解析默认使用IPv4/IPv6双栈模式,no_cnfallback会使用优先IPv4规则,可根据自己需要将exec: prefer_ipv4 选项删除。同时IPv4的公共DNS服务基本都支持IPv6解析,可不用单独再进行配置。
                                                  ECS暂时不支持填充IPv6地址,同时为了避免隐私泄露,以及目前大部分用户都不太习惯为IPv6配置防火墙,所以尽量不要泄露,保护好自己的IPv6地址。
                                                  如果你的网络没有IPv6,可将dns.yaml中含有IPv6地址的行删掉,避免使用IPv6地址的公共DNS服务器进行解析,也从根本上杜绝这种请求。当前维持不动也不会发生什么,只是在日志中会产生Warning

                                                  关于队列执行

                                                  如果经过上述队列执行过后依旧没有可用的DNS解析结果会发生什么?
                                                  会报错。

                                                  关于http3(H3)

                                                  为什么http3的DOH更快?
                                                  因为http3在大多数情况下,客户端和服务器之间的通信可以在第一次数据包传输时开始,不需要像TCP那样经过多次握手过程。
                                                  具体可以参见《什么是HTTP/3》这篇文章。
                                                   

                                                  📎 参考文章

                                                   
                                                  💡
                                                  有关DNS的问题,欢迎您在底部评论区留言,一起交流~

                                                  Windows下使用Docker自建Vaultwarden密码管理器

                                                  2025年2月27日 08:00
                                                  😀
                                                  密码管理器我很久之前使用过LastPass,后来因为LastPass被渗透存在安全问题,就不再继续使用,转而使用Microsoft Edge浏览器自带的密码管理器,在功能上基本满足需求,但是存在一个很致命的问题,就是我浏览器完全被绑定在了Microsoft Edge,包括PC和Android,为了密码管理而必须使用Microsoft Edge,这也是我萌生了使用Bitwarden的最核心原因。这篇文章主要介绍在Windows环境下,通过使用Docker搭建本地Bitwarden服务器Vaultwarden的方法,以及通过Cloudflare Tunnel实现内网穿透,提供给移动端设备在外使用。

                                                  📝 Windows环境下Docker安装

                                                  我选择Windows系统原因不是因为Windows系统在实现这些服务管理上有多好,完全是因为我的PVE小主机内存捉襟见肘,暂时没有资源用于Docker服务和容器的维护,所以暂时先将Docker放在这台Windows主机上,在之后对PVE的小主机进行内存扩容后,再进行迁移。

                                                  安装方法

                                                  前往Windows | Docker Docs 下载Docker的安装程序,下载完成后打开进行安装。需要注意的是,Windows系统需要打开WSL或者Hyper-V功能后才可正常进行安装,原因在于Docker需要使用WSL(Windows Subsystem Linux)或者Hyper-V的虚拟化技术。在这里,建议使用WSL作为虚拟化后端。

                                                  Windows开启WSL或Hyper-V的方法

                                                  以Windows 11为例,打开控制面板,选择程序启用或关闭Windows功能
                                                  notion image
                                                  如果准备使用Hyper-V作为虚拟化后端,则勾选Hyper-V
                                                  如果准备使用WSL作为虚拟化后端,则勾选适用于Linux的Windows子系统

                                                  📝 Vaultwarden安装及配置

                                                  为什么选择Vaultwarden

                                                  Vaultwarden(原名 Bitwarden_RS)是一个开源的密码管理服务器,它是官方密码管理工具Bitwarden的轻量级替代品,专为自托管(Self-hosted)环境设计,兼容Bitwarden的官方客户端(Windows/macOS/Linux/iOS/Android)及浏览器插件。在大部分情况下,512MB RAM足够Vaultwarden使用,同时磁盘空间算上Docker本身,也只需要不到2GB。
                                                  作为对比,Bitwarden官方的服务器推荐配置如下:
                                                  System specifications
                                                  Minimum
                                                  Recommended
                                                  Processor
                                                  x64, 1.4GHz
                                                  x64, 2GHz dual core
                                                  Memory
                                                  2GB RAM
                                                  4GB RAM
                                                  Storage
                                                  12GB
                                                  25GB
                                                  Docker Version
                                                  Engine 19+ and Compose 1.24+
                                                  Engine 19+ and Compose 1.24+

                                                  拉取Vaultwarden镜像

                                                  使用Docker Pull命令进行镜像的拉取。如果由于国内网络原因无法拉取,可以参考《Docker国内加速镜像》使用加速镜像。

                                                  启动Vaultwarden容器

                                                  终端命令行模式

                                                  Windows系统下,由于转义符以及路径格式问题,无法使用Vaultwarden官方在文档中所提供的docker run命令,以下是我根据Windows系统的格式所修改的命令,通过PowerShell执行:
                                                  其中:
                                                  • --env=DOMAIN= 后面填写你准备使用的域名,域名之后会通过Cloudflare Tunnel使用内网穿透,从而在外也可以正常使用Bitwarden。
                                                  • --volume= 后面填写你挂载磁盘目录的路径,例如我的是F:\Docker\vaultwarden ,替换这部分即可,不要删除:/data/
                                                  • -p 即端口映射,如果你需要修改为高位端口或其他自定义端口,则格式为端口:80 ,例如你想要使用10086端口,那么就是10086:80

                                                  Docker Desktop图形界面模式

                                                  除了使用上述命令行模式启动Vaultwarden容器,也可以通过Docker Desktop所提供的GUI模式进行容器的启动。
                                                  打开Docker Desktop,点击左侧Images,找到Vaultwarden的镜像(vaultwarden/server),点击后面的开始按钮:
                                                  notion image
                                                  点击Optional Settings:
                                                  notion image
                                                  • Container name:填写容器名称,如果不填写,那么会随机生成一个。
                                                  • Host port:填写你想要使用的端口
                                                  • Host path:点击后面的···,选择你想要使用的挂载地址
                                                  • Container path:填写/data/
                                                  • Variable:填写DOMAIN,注意大小写
                                                  • Value:填写你准备使用的域名
                                                  点击Run启动容器。
                                                   
                                                  这时候,使用浏览器访问局域网IP:映射端口 即可打开Vaultwarden的页面,首次进入需要新建一个账户。

                                                  📝 Cloudflare Tunnel安装及实现内网穿透

                                                  我们已经完成了Vaultwarden本地的部署工作,那么在非局域网环境下,如何才能使用Vaultwarden进行密码填充和管理?这时候就可以请出赛博大善人Cloudflare,利用Zero Trust提供的Tunnel服务,进行内网穿透。
                                                  首先需要你有一个域名,且域名托管于Cloudflare,同时已经绑定付款卡。
                                                  登录Cloudflare账号之后,点击左侧菜单的Zero Trust,然后选择Networks → Tunnels,点击Create a tunnel。
                                                  notion image
                                                  Tunnel Type选择Cloudflared。
                                                  notion image
                                                  并为你的Tunnel填写一个响亮的名字,例如vaultwarden或者bitwarden等等,然后点击Save Tunnel进入下一步。在Install and run a connector中,我们使用Docker模式,原因在于既然开启一个Docker容器也是开,那多开一个Docker容器也是开,还不用额外安装软件。
                                                  Choose your environment中选择Docker,然后下面会出现容器运行的代码,在Docker的Terminal中,或者直接在Powershell中,或者Terminal终端中,或者其他你喜欢使用的终端里面输入复制的代码:
                                                  即可启动Cloudflare Tunnel的容器。
                                                  notion image
                                                  然后在Route Traffic中,进行路由信息的完善以及域名的绑定。
                                                  • Subdomain:填写你要使用的二级域名前缀
                                                  • Domain:选择你托管在Cloudflare的域名
                                                  • Path:空
                                                  • Type:选择HTTP
                                                  • URL:填写局域网IP:映射的端口 ,例如我的机器是10.0.0.10,端口为80,那么就填写10.0.0.10:80 。切记不要使用localhost或者127.0.0.1
                                                  点击Save Tunnel即可完成创建工作,现在访问你配置的域名,即可打开Vaultwarden的页面。

                                                  📝 使用Onedrive进行Vaultwarden备份

                                                  前面我们在启动Vaultwarden容器的时候配置了挂载的目录,为了避免密码库丢失以及后续的迁移需要,我们可以使用Onedrive进行备份同步。我没有选择对data目录再次压缩并设置压缩密码的方式,目前仅通过mklink进行软链接,直接同步备份挂载的目录,命令如下:
                                                  这个命令需要在CMD模式下使用,Powershell无法使用。%CD%\Onedrive\bak\Warden 为同步到Onedrive下的bak下的warden目录,可根据自己需求进行修改,F:\Docker\vaultwarden 为vaultwarden挂载的目录。

                                                  📝 关于资源使用

                                                  目前在启动Vaultwarden容器和Tunnel容器的情况下,算上Docker本身的内存占用为1.2G左右,容器占用在80M左右,磁盘占用1.83G,CPU占用忽略不计,整体小于Bitwarden服务端所要求的2G内存,更为轻量和节省资源。

                                                  📝 一些高级用法

                                                  禁止新用户注册

                                                   

                                                  📎 参考文章

                                                   
                                                  💡
                                                  有关Vaultwarden安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                  OpenWRT从Hper-V迁移至PVE指引

                                                  2024年9月28日 08:00
                                                  😀
                                                  本篇文章主要介绍如何将Hyper-V的VHDX虚拟磁盘导入到PVE(Proxmox Virtual Environment)下,从而实现将OpenWRT直接从Hyper-V平台迁移到PVE平台,避免重新配置的繁琐过程,最大程序保留原OpenWRT系统的可用性。
                                                  迁移的原因是原来我的旁路网关所使用的OpenWRT部署在日常使用PC的Hyper-V里。而因为自己买了新的N4100工控机,4个2.5G网口,这样就可以实现全屋2.5G,提升内网的传输速度,同时将软路由(以及附带的旁路网关、旁路由、DNS服务器、Docker等等七七八八)从日常使用的PC中分离出去,减少家里网络因为我电脑问题产生的波动,同时日常使用的PC专注用于工作和使用Moonlihgt + Sunshine串流Steam打游戏。而且换了之后,日常使用的PC也可以休眠或者关机,省点电费(并没有)。另外还有就是软路由数据与系统的分离,可以将PVE的备份数据存放在smb挂载的磁盘上并定时备份,减少All in Boom之后的工作量和损失。

                                                  📝 Hper-V至Proxmox VE迁移过程

                                                  导出Hyper-V虚拟机

                                                  在Hyper-V Manager(Hyper-v管理中心)选择想要导出的虚拟机,我们以OpenWRT为例:右键导出,选择存放位置。
                                                  notion image
                                                  导出后的文件夹里包括:SnapshotsVirtual Hard DisksVirtual Machines ,OpenWRT的虚拟机VHDX磁盘位于Virtual Hard Disks 内。
                                                  例如我的immortalwrt的VHDX为:immortalwrt-23.05.3-x86-64-generic-squashfs-combined-efi.vhdx ,为了便于之后转换和导入操作,可以修改为短一点的名字,例如openwrt.vhdx ,这样在后续输入命令的时候,能够少打点字,同时也减少因为输入VHDX磁盘名称错误带来的无法导入问题。

                                                  上传VHDK虚拟磁盘到PVE

                                                  由于VHDX不属于ISO镜像或者CT模板,所以无法通过PVE Gui(网页管理器)进行上传,需要自己通过sftp或者共享文件夹的方式上传,例如Winscp或者Termius,可以通过SSH账号密码登录并进行文件传输,文件存放位置选择自己能找到的位置,例如用户目录下。
                                                  notion image

                                                  在PVE上新建虚拟机

                                                  这里按照正常的Proxmox VE虚拟机创建流程即可,需要注意有三点:
                                                  1. 如果是EFI镜像,需要在BIOS中选择OVMF (UEFI) ,其他镜像选择默认的SeaBIOS 即可。
                                                  1. 添加网络设备时,需要修改MAC地址为原来在Hyper-V下OpenWRT所使用的虚拟网卡MAC地址,这样可以避免大多数问题,但是例如Zerotier这种需要完全匹配设备信息的,需要单独进行调整:OpenWRT迁移后Zerotier无法连接的解决方案
                                                  1. 不需要添加硬盘和磁盘。
                                                  notion image
                                                  完成后不需要启动虚拟机。

                                                  将VHDX磁盘转化为qcow2格式

                                                  这里需要通过SSH或者Proxmox VE Shell进入节点机终端(SSH),并执行磁盘格式转换命令:
                                                  -O qcow2 :导出格式为qcow2
                                                  openwrt.vhdx :源磁盘镜像文件名称
                                                  openwrt.qcow2:导出的磁盘镜像文件名称
                                                  转换可能需要一点时间,请耐心等待。

                                                  挂载Hyper-V虚拟磁盘镜像

                                                  这里需要通过SSH或者Proxmox VE进入节点机终端(SSH),并执行导入命令:
                                                  101 :刚刚新建的PVE虚拟机的VM ID,也就是那个序号。
                                                  openwrt.qcow2 :刚刚我们转换完的磁盘镜像。
                                                  nvme:存储卷名称,例如local,或者你所添加的其他存储名称。
                                                  --format=qcow2 :将磁盘以 qcow2 格式导入 导入完成后,在Proxmox VE GUI面板,选择创建的新的OpenWRT虚拟机,选择【硬件】,双击未使用的硬盘,然后点击添加,就实现了磁盘由Hyper-V到Proxmox VE的完整迁移。

                                                  🤗 总结归纳

                                                  开启OpenWRT虚拟机进行后续测试,目前我的测试结果是:
                                                  软件
                                                  情况
                                                  OpenClash
                                                  正常
                                                  MosDns
                                                  正常
                                                  AdGuard Home
                                                  正常
                                                  DDNS-GO
                                                  正常
                                                  Zerotier
                                                  正常
                                                  Prometheus Exporters
                                                  正常
                                                  Qos Mate
                                                  正常
                                                  Docker
                                                  正常
                                                  Tailscale
                                                  正常
                                                  Zerotier的修复办法也已经同步进行了更新:《OpenWRT迁移后Zerotier无法连接的解决方案

                                                  📎 参考文章

                                                   
                                                  💡
                                                  有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                  DAE搭配MosDNS使用配置

                                                  2024年10月12日 08:00
                                                  😀
                                                  本篇文章并非DAE及DAED的安装配置入门文章。关于DAE与DAED的安装方法之后会单独编写。本篇文章主要内容为在使用DAE或DAED的情况下,如何搭配MosDNS使用,提供一个高兼容性、高可用性的配置方案。以下内容基于Debian系统。

                                                  📝 DAE(大鹅)的DNS原理

                                                  DAE的分流原理

                                                  域名通过劫持 DNS 请求,将 DNS 请求的域名与所查 IP 进行关联来得到。尽管这种方式有一些问题:
                                                  1. 可能会出现误判。例如需要分流到国内和国外的两个网站拥有同一个 IP,且在短时间内同时被访问,或浏览器有 DNS 缓存。
                                                  1. 用户的 DNS 请求必须通过 dae。例如将 dae 设为 DNS,或在 dae 作为网关的情况下使用公共 DNS。
                                                  ———
                                                  DAE对程序所在网关进行全部流量的处理,且与其他代理程序不同,并不提供DNS的转发端口,而是采用对只有经过该网关的全部DNS请求才会分流,所以无法直接使用原有代理程序那些套娃的DNS行为。
                                                   
                                                  更新:
                                                  需要注意的是,如果上游MosDNS采用并发策略,一段时间后,可能会存在造成Dae内存泄露的情况,内存占用由原来的500M左右,增加至1G左右。目前原因还在排查。
                                                  MosDNS关系不大,如果手机使用相同订阅代理并连接同网WIFI,在内网会产生环回请求造成内存泄露。

                                                  常规代理程序DNS请求及解析

                                                  notion image
                                                  在未通过公共DNS或者代理远端DNS请求解析的情况下,常规代理软件是可以进行DNS的无限套娃的,并不会返回给客户端解析的结果。在套娃的过程中可以不断针对不同的DNS请求进行过滤和分流,在日常使用中能够极大的提供便利,例如AdGuard Home的广告过滤与可视化控制面板、MosDNS的并发DNS请求、ECS请求等等。

                                                  DAE的DNS请求与解析

                                                  notion image
                                                  DAE的不同点在于,在流量进入网关开始即进行分流,且基于Domain的分流模式必须将DAE作为唯一的DNS入口,在顺序上相当于将将代理程序前置作为入口,且由于DAE并不提供DNS转发的监听端口,所以无法后置于其他DNS程序。

                                                  📝 DAE与MosDNS的配合

                                                  DAE提供了一份使用外置DNS程序的指南:
                                                  external-dns.md
                                                  daeuniverse
                                                  根据这份指南我们可以对整体家庭局域网内的DNS请求链路进行梳理如下:
                                                  notion image
                                                  例如我在使用MosDNS的情况下,将GeoSite:CN的域名通过MosDNS并发请求阿里的公共DNS服务器,取得结果。同时对GeoSite:GFW以及Graylist(自定义灰名单)的域名使用Google的公共DNS进行请求,使其回到DAE的分流规则之内,这样既满足使用MosDNS并发请求加快DNS解析速度、ECS提供就近CDN节点的同时,也不会扰乱DAE基于domain的分流配置。

                                                  DAE DNS配置

                                                  主要配置为红色字体部分,DAE的DNS部分仅作为流量的监听,所有DNS的解析均发往MosDNS进行解析,无论是否被污染,由MosDNS中的规则进行DNS分流。

                                                  DAE Routing配置

                                                  主要部分为红色部分,将MosDNS进程放在must_direct策略内,不将DNS流量重定向到dae并继续匹配,避免产生回环。同时因为可继续匹配,所以MosDNS中使用Google Public DNS规则流量还可以继续进入DAE执行远端请求。

                                                  MosDNS配置

                                                  定义Tag

                                                  主序列配置

                                                  query_nocn配置

                                                  主DNS服务由Google Public DNS提供,副DNS服务由NextDNS服务提供,在使用Google Public DNS时流量会重新进入DAE,完成解析,获得无污染结果。

                                                  🤗 总结归纳

                                                  目前这套方法是我用下来最为舒服的,在解析速度和识别被污染域名方面均可以满足我的需要,同时对劫持到反诈页面也有很好的规避效果,例如Linux.do等网站打开也不会被劫持了。唯一不太方便的地方在于对于污染域名的配置上,在添加DNS的自定义规则时,需要在MosDNS的自定义文件内添加,例如我的是graylist
                                                  理论上,在此基础上还可以进行套娃,例如使用AdGuard Home等,但由于DAE作为入口劫持所有的流量,所以AdGuard Home的客户端会仅显示为DAE客户端。所以建议如果使用AdGuard Home,可将AdGuard Home放置于另外的容器或主机上作为DNS入口,同时上游配置DAE所在主机IP。

                                                  📎 参考文章

                                                   
                                                  💡
                                                  有关DAE安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                                   

                                                  AdGuard Home配置仅局域网访问

                                                  2024年9月11日 08:00
                                                  😀
                                                  家里部署在旁路网关上的AdGuard Home已经稳定运行一段时间了,最近检查配置文件的时候发现默认的配置文件是监听在全部地址的,也就是如果有人知道了我旁路由的公网IPv6地址,而且我的防火墙规则不完善情况下,那么是存在可能直接使用我的AdGuard Home DNS服务的,尤其是我的ADG还是监听在默认的53端口,有点不太安全,即便是不被攻击和滥用,也容易被运营商警告。

                                                  📝 AdGuard Home配置记录

                                                  我的AdGuard Home是安装在旁路网关(旁路由)的OpenWRT系统内,所以以下防火墙规则部分,介绍和使用的是OpenWRT下的防火墙(nftables)规则。

                                                  修改AdGrard Home监听地址

                                                  配置文件位于/etc/AdGuardHome.yaml ,关于监听地址的的配置项为dns主配置项下的bind_host ,默认的配置为:
                                                  即监听当前机器的所有地址,包括本地地址、局域网地址,IPv6公网地址等等,存在很大的安全隐患,同时我们也不需要AdGuard Home在如此多的地址上进行监听。
                                                  由于我会使用WireGuard回家,配置的网段为10.1.X.X网段,所以在配置文件中也加入对这个网段地址的监听。另外增加127.0.0.1的本机地址原因是允许本机使用该DNS服务,同时在旁路由本机上运行的一些服务由于配置的DNS地址也为127.0.0.1的本机地址,找起来修改很麻烦,所以这里加上。
                                                  修改完后:
                                                  包括本机地址,家庭局域网地址、WireGuard虚拟局域网地址(或者Zerotier虚拟局域网地址),以及本地的IPv6地址,这里主要注意IPv6地址填写你的DNS服务器本机的本地链路IPv6地址,即fe80::开头,不要完全简写为fe80::1 ,建议通过ifconfig命令查看一下本地的IPv6地址,否则ADG可能存在监听失败无法启动的问题。
                                                  重启AdGuard Home后生效。

                                                  配置防火墙规则

                                                  OpenWRT Luci界面添加

                                                  如果你在主路由的默认防火墙wan口规则是拒绝入站和拒绝转发,那么没有必要单独进行防火墙规则的配置,因为53端口的访问和转发请求已经遵循默认规则被拒绝。
                                                  但是如果你的默认wan口规则允许入站和转发,那么建议还是进行通信规则的设置,特别是IPv6部分的配置,可以在OpenWRT的防火墙设置中直接添加通信规则:
                                                  notion image
                                                  • 源区域:wan和wan6
                                                  • 源地址:不选择
                                                  • 源端口:不填写
                                                  • 目标区域:lan,如果你的AdGuard Home配置在主路由上,那么为此设备。
                                                  • 目标端口:53,如果你的AdGuard Home使用的不是53端口,填写你的AdGuard Home监听的端口。
                                                  • 操作:拒绝
                                                  • 高级设置:
                                                    • 地址族限制:IPv4和IPv6
                                                    •  
                                                  最后保存即可。

                                                  nftables添加

                                                  nftables部分添加的思路和Luci部分相反,是通过nft防火墙只允许对应的网段访问53端口,其他不在配置规则范围之内的网段访问53端口,会被Drop丢弃。
                                                  IPv4部分
                                                   
                                                  IPv6部分

                                                  🤗 总结归纳

                                                  因为在家庭网络环境下的AdGuard Home并不需要对公网提供DNS解析服务,所以大部分情况下监听地址并不需要使用0.0.0.0,暴露公网IPv6地址,尽管IPv6地址被扫到的几率很低,但是由于AdGuard Home提供的DNS不具备鉴权功能,容易造成安全隐患或成为DDoS放大器的帮凶。

                                                  📎 参考文章

                                                   
                                                  💡
                                                  有关OpenWRT或者路由器安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                  尝试使用Grafana监控家庭网络状态(一)

                                                  2024年9月10日 08:00
                                                  😀
                                                  之前已经配置了很多关于家庭局域网方面的东西,目前还缺少一个可以监控整体网络状态的Dashboard。选来选取,最终决定使用Grafana + Loki + Vector + Prometheus这套方案。整体方案的资源占用确实也不小,但主要都是在Docker部署的几个服务端上,OpenWRT路由器上使用Node,也不算太占用资源。今天主要分享一下如何在手搓一个监控网络状态的Grafana Panel。
                                                  notion image

                                                  📝 什么是Grafana

                                                  Grafana 是一款开源的跨平台数据可视化与监控工具,专为实时动态展示和分析大规模数据而设计。它最初由 Torkel Ödegaard 于 2014 年开发,现已成为 DevOps、 IT 运维及数据分析领域的核心工具之一。Grafana 用于监控和分析各种数据源中的数据。它能够从多个数据源(如Prometheus、Loki、InfluxDB、Elasticsearch、MySQL、PostgreSQL 等等)获取数据,并通过图表、仪表盘Dashboard和警报Alert来展示这些数据。

                                                  Grafana的核心功能与用途

                                                  1. 可视化仪表盘
                                                    • 支持图表、表格、热图、地图等多种可视化形式。
                                                    • 可自定义仪表盘布局,实时刷新数据(秒级更新)。
                                                    • 示例:监控服务器 CPU 使用率、数据库查询性能、应用程序响应时间等。
                                                    1. 多数据源支持
                                                      • 接入超过 80 种数据源,包括:
                                                        • 时序数据库:Prometheus、InfluxDB、Graphite
                                                        • 日志平台:Elasticsearch、Loki
                                                        • 云服务:AWS CloudWatch、Google Cloud Monitoring
                                                        • 关系型数据库:MySQL、PostgreSQL
                                                        • 其他:JSON API、CSV 文件等。
                                                      1. 警报与通知
                                                        • 设置灵活的条件阈值(如 CPU > 90% 持续 5 分钟)。
                                                        • 支持通过 Email、Slack、PagerDuty、Webhook 等方式推送告警。
                                                        1. 用户权限与协作
                                                          • 提供多租户功能,支持团队共享仪表盘。
                                                          • 细粒度权限控制,可分配查看、编辑或管理权限。

                                                          为什么选择Grafana

                                                          我选择Grafana的原因主要是因为Grafana支持多种数据源,通过Vector、Loki、Prometheus可以很方便的将OpenWRT产生的日志文件数据、Metric数据等等导入到Grafana中,从而进行可视化的展示,打造一个监控家庭网络情况的Dashboard。

                                                          📝 Grafana监控整体方案

                                                          各部分使用的数据源如下:

                                                          OpenWRT主路由

                                                          以下这些包均可通过OpenWRT的包管理器opkg进行安装。
                                                          • prometheus-node-exporter-lua
                                                          • prometheus-node-exporter-lua-nat_traffic
                                                          • prometheus-node-exporter-lua-netstat
                                                          • prometheus-node-exporter-lua-openwrt

                                                          OpenWRT旁路由(旁路网关)

                                                          以下这些包均可通过opkg进行安装。
                                                          • prometheus-node-exporter-lua
                                                          • prometheus-node-exporter-lua-nat_traffic
                                                          • prometheus-node-exporter-lua-netstat
                                                          • prometheus-node-exporter-lua-openwrt

                                                          DNS

                                                          Prometheus + Vector + Loki

                                                          网络连通性

                                                          Shell脚本 + Cron + Vector + Loki,Shell脚本放在OpenWRT旁路由上。

                                                          监控方案介绍

                                                          Loki、Grafana和Prometheus的服务端通过Docker安装在我的本地电脑上,并通过Caddy进行反代使用域名访问。
                                                          OpenWRT路由器上提供了Prometheus Node Exporter的包,可以很方便的安装并提供数据源。在DNS方面,由于我使用的是ADG + MosDNS + OpenClash的模式,所以核心的DNS解析位于MosDNS这里,监控也就只对MosDNS的DNS请求进行监控,这部分也有相对成熟的方案,以后有时间会单独写一篇安装配置的指南文章。OpenClash的核心Clash(Mihomo)部分的数据暂时还无法获取,之前的Premium核心提供过metric的接口可以获取各项流量数据,可惜Premium内核本身是闭源的,而且现在作者也已经退网,Mihomo内核暂时也没有支持Metric暴露功能,有些遗憾。另外AdGuard Home也提供了Prometheus可用的接口,但是因为我对AdGuard Home内的数据并不是很关心,所以没有考虑添加到这个Dashboard中。
                                                          除了上述这几部分之外,我比较在乎网络的连通性,尤其是外网的连通性,通过OpenWRT和MosDNS的监控不是很好能够反应出网络是否通还是不通。但是这部分暂时没有成熟到可以直接使用的包或者程序,blackbox exporter可以解决这个问题,但是blackbox exporter对于这个需求来说,实在是有点过于庞大,所以只能自己手搓一个简单的脚本。
                                                          由于我们已经使用了Vector和Loki,所以最简单的办法就是通过Curl命令对特定外网网站进行请求,例如Curl Google,并将返回的信息记录到日志文件中,由Vector进行进行收集、处理和转换,然后由Loki进行存储并提供索引Index和查询功能。
                                                          在用于监控的国外网站我选择了http://www.google.com/generate_204 ,原因很简单就是因为完全被墙了,而且基本不会宕机。国内网站选择了小米的http://connect.rom.miui.com/generate_204 ,以上两个地址挂了的几率远远小于我的网络宕机DOWN掉的几率,所以如果无法请求成功,那么肯定是我的网络出现了问题。

                                                          📝 网络连通性日志处理

                                                          监控脚本

                                                          Shell脚本通过使用Curl命令发送HTTP请求,并记录响应时间和返回的状态,通过Cron定时任务持续检查网络的连通性。需要注意的是,/var 下的文件会在每次旁路由重启的时候清空并根据/etc 内的配置文件重新生成,所以如果有持久化数据存储需求的话,建议放在别的目录下例如/opt目录。

                                                          代码解释:

                                                          google_response=$(curl -o /dev/null -s -w "%{http_code} %{time_total}\n" http://www.google.com/generate_204) :
                                                          • curl:用于发送 HTTP 请求的命令。
                                                          • o /dev/null:将响应的内容丢弃,不保存到文件中。
                                                          • s:静默模式,不显示进度条等输出。
                                                          • w "%{http_code} %{time_total}\n":输出 HTTP 状态码和总响应时间。
                                                          • http://www.google.com/generate_204:请求的 URL。/generate_204 是一个常用的检查点,用于测试网络连接。
                                                          • google_response:将 curl 的输出(状态码和响应时间)保存到变量中。
                                                          google_status_code=$(echo $google_response | cut -d' ' -f1)
                                                          • google_response 变量中提取第一个字段(状态码),并保存到 google_status_code 变量中。
                                                          google_response_time=$(echo $google_response | cut -d' ' -f2)
                                                          • google_response 变量中提取第二个字段(响应时间),并保存到 google_response_time 变量中。
                                                          echo "{\"site\": \"google\", \"status_code\": \"$google_status_code\", \"response_time\": $google_response_time}" >> /var/log/network_monitor.log
                                                          • 将 Google 的状态码和响应时间以 JSON 格式写入 /var/log/network_monitor.log 文件中。>> 表示追加到文件末尾。
                                                          国内网站xiaomi部分与Google部分相同。

                                                          保存并赋予执行权限:

                                                          定时任务

                                                          即每分钟执行一次查询,并输出到日志文件中。这里的/path/to/你需要修改为你自己的路径地址。

                                                          Vector配置

                                                          在脚本将请求结果输出到日志文件后,需要使用Vector对日志进行收集、处理和传输到Loki。OpenWRT的包管理器OPKG提供了Vector的安装,可以直接安装,或者自行进行编译安装。需要注意的是,opkg安装的vector的配置文件为yml格式,与Vector需要的toml格式不同,在编写配置文件时需要特别注意。
                                                          配置文件分为三部分,sources部分定义日志文件的来源和读取方式,transforms部分定义日志的转换和提取方式,sinks定义与loki之间传输的方式。
                                                          在sources这里我们需要的信息分别是网站名称,用来区分是Google还是Xiaomi的204页面,status_code即状态码,如果是返回200即表明网站连通性没有问题,如果是4**或其他就需要检查自己的网络了。sinks部分注意修改endpoint为自己的loki服务器地址和端口。
                                                          保存之后,重启Vector
                                                           

                                                          Grafana配置

                                                          在Grafana中新建一个Dashboard,数据源选择为Loki,然后进行数据查询配置。这里面有一个坑,目前我使用Docker-compose部署的Grafana和Loki不支持unwrap 语法,需要使用line_format 才能正确的提取数据。
                                                          notion image
                                                          由于我需要分别检查国内和国外的网络连通性来确保科学上网的分流,所以需要在Grafana新建两个panel,分别使用上面两个查询命令。同时选择 Stat 面板进行可视化展示。

                                                          阈值Thresholds设置

                                                          通过阈值设置,可以通过颜色明显的察觉网络的异常。
                                                          在Grafana面板中:
                                                          1. 打开Field设置。
                                                          1. 设置Thresholds阈值:
                                                            • 200为绿色(表示成功)。
                                                            • 其他状态码(如500, 404)为红色(表示失败)。

                                                            📎 参考文章

                                                             
                                                            💡
                                                            有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                            OpenClash + Mosdns + ADG如何防止DNS泄露?

                                                            2024年8月25日 08:00
                                                            📌
                                                            OpenWRT的科学上网中,DNS泄露(DNS Leak)是大多数用户并不关心的部分,但也是小部分用户或者强迫症爱好者会纠结的部分。至于DNS泄露之后真正会造成什么样的后果,现在并没有任何确凿的示例,但是秉承着在这个互联网灰色地带尽量安全的准则(黑暗森林法则),以及为了满足自己无穷无尽的动手欲,今天就来尝试通过对自己家里的整体网络链路进行入手分析,寻找可能存在的DNS泄露点,以及进行修复。这是一个从2023年伴随着科学上网就一直在不断讨论的话题,今天我也加入进来。

                                                            📝 什么是DNS泄露

                                                            首先,我们需要来了解一下到底什么是DNS泄露以及其潜在的风险:
                                                            DNS泄露是指在使用VPN(虚拟专用网络)或者科学上网时,用户的DNS请求绕过VPN隧道,直接通过用户的本地网络发送给互联网服务提供商(ISP)的DNS服务器,而不是通过VPN提供的DNS服务器进行解析。这种情况会暴露用户的真实IP地址、位置和浏览活动,从而削弱了使用VPN或科学上网所提供的隐私和匿名性。通常,VPN(科学上网)的一个重要功能是加密和隐藏用户的流量,这其中包括DNS请求。但是,如果VPN或者科学上网程序配置不当或存在漏洞,DNS请求可能不会被加密或路由到正确的DNS服务器,导致信息泄露。这种泄露可能让ISP或其他第三方能够监视用户的上网行为,甚至在某些情况下,影响用户访问内容的安全性。
                                                            那么在国内来说,DNS泄露就可能会被ISP(你的宽带运营商,例如电信、联通、移动等等)知晓你要访问什么网站,从而被ISP(宽带运营商)识别,劫持至反诈页面或者被短信提醒。
                                                            根据我的个人的实际使用体验,在解决完家里网络DNS泄露的问题之后,目前还没有再被劫持到反诈页面,而在之前,访问Linux.do或者很多独立个人博客都会被劫持到反诈页面,这一点在具有墙中墙的部分省份尤其明显。

                                                            📝 OpenWRT DNS泄露排查流程及修复

                                                            DNS请求链路

                                                            在仅考虑DNS解析请求的链路情况下,目前我所使用的方案基于OpenWRT系统,由AdGuard HomeMosDNS以及Openclash组成,相互共存,以上服务均部署在旁路网关(旁路由)的OpenWRT上。各部分的选择原因如下:
                                                            AdGuard Home(ADG):作为监听在53端口的默认DNS服务,我没有选择重定向或者使用其他非标端口,而是直接使用53端口,替代OpenWRT默认的Dnsmasq提供DNS转发服务,这也可以使AdGuard Home与OpenClash共存。同时,由于旁路网关不需要承担DHCP的任务,为局域网内其他客户端分配IPv4地址,所以可以直接替换,将Dnsmasq的监听端口改成其他的就可以了,例如端口5353。AdGuard Home可以提供全局的、并且可视化的DNS请求记录查询功能,以及可以快速添加过滤广告功能,这是我所需要的,且其他DNS服务软件暂时无法提供的。
                                                            MosDNS:作为AdGuard Home上游DNS服务器使用,通过配置文件策略进行DNS分流,对国内DNS加速,对污染请求转发至上级OpenClash的DNS服务,通过科学上网进行远端请求。在广告过滤的功能上,MosDNS完全可以替代AdGuard Home,但是由于缺少可用性较好的面板,且AdGuard Home的规则定义模式不如MosDNS多样化,所以在我这里还无法完全替代AdGuard Home的工作。
                                                            OpenClash作为整体DNS请求解析链路的最后一环,单纯提供针对需要代理服务和科学上网的域名进行解析并返回查询结果,确保客户端所请求域名地址没有被污染,所以关闭DNS劫持,由AdGuard Home和MosDNS负责DNS工作,使三者共存。其实OpenClash对dnsmasq的依赖主要就在于DNS和实验性:绕过中国大陆IPv4这两部分,而在我们弄明白了OpenClash的绕过中国大陆IPv4实现原理之后,完全是可以替代掉OpenWRT默认使用的Dnsmasq。
                                                            notion image

                                                            发现问题

                                                            1. AdGuard Home的DNS泄露排查

                                                            在解决问题之前,我们需要先发现问题,我们需要先确认目前的网络情况是否存在DNS泄露。
                                                            首先通过IP/DNS Detect - What is your IP, what is your DNS, what informations you send to websites. (ipleak.net)进行DNS泄露情况检查和泄露结果查看,可以看到在未进行整体DNS请求链路调整之前的DNS泄露情况。
                                                            同时,通过在AdGuard Home进行日志查询,可以看到具体进行检测DNS泄露的DNS解析请求的域名,一般来说是一个三级域名,类似于yw9dmycvn53p2zedczygrbjx4v5anjd2as23ly3w-32.ipleak.net 这种。其检测DNS泄露的原理大概是通过生成大量的三级域名让我们请求解析,从而获取我们完整的DNS服务配置,当这里出现五星红旗及大陆IP时候,即证明已经产生的DNS泄露。
                                                            同时经过上述测试,在这里我们可以确认:
                                                            1. 由AdGuard Home所提供的DNS转发服务正常,能够正常转发至上级MosDNS进行解析。
                                                            1. 客户端的DNS请求是通过AdGuard Home向上级转发,也就是转发给MosDNS进行处理,并且转发成功,在AdGuard Home中的响应结果正常,没有出现SERVERROR
                                                            1. 由于我的AdGuard Home的DNS设置中,上游DNS只有Mosdns一个地址,那么可以确定问题不是出在AdGuard Home这里,可以继续对整体链路向上进行排查。
                                                            1. 如果你的AdGuard Home里面DNS配置中,添加了后备DNS服务器(Fallback DNS Server),那么这也可能是出现DNS泄露的一个地方。当上游DNS服务器无法正常响应时,AdGuard Home会主动使用后备DNS服务器(Fallback DNS Server)查询,且由于AdGuard Home未进行分流,从而可能导致DNS泄露。

                                                            2. MosDNS的DNS泄露排查

                                                            我对目前我的MosDNS执行序列执行重新画了流程图。同时我也建议你这么做,这样可以更好的了解MosDNS在你进行域名解析请求的时候都发生了什么,也能更好的了解自己所使用规则的运作原理及解析过程。我的配置文件是使用的Jasper-1024编写的MosDNS配置文件,地址为:mosdns_docker/mosdns_v5 ,并在此基础上我进行了部分修改:增加了污染域名的直接远端请求,同时去掉了并发请求DNS服务器,以及根据自己的需要进行了ECS中请求所使用IP地址的修改。
                                                            修改后我的MosDNS解析请求流程如下:
                                                            notion image
                                                            1. qtype65判断QTYPE65 是指一种特定的DNS查询类型,正式名称为HTTPS(也称为 SVCB 或 Service Binding)。这种查询类型的数字标识符为 65,是DNS协议中的一部分,用于增强安全性和优化连接。但由于QTYPE65 的相对新颖性和对新技术的依赖,它在实际使用中还不如传统的A、AAAA 等 DNS记录普及,且反而容易产生污染,所以拒绝,也不存在DNS泄露的可能性。
                                                            1. 无效域名和keyword为空域名:垃圾请求,拒绝,不存在DNS泄露可能性。
                                                            1. qtype12:PTR请求,通过序列query_other丢给上级DNS服务查询,本级不存在DNS泄露可能。
                                                            1. qtype255:DNS扩展请求,通过寻猎query_other丢给上级DNS服务查询,本级不存在DNS泄露可能。
                                                            1. 私有IP及geosite_private:本地请求,不涉及外网请求,交由query_lan本地化处理,本级不存在DNS泄露可能。
                                                            1. 广告及geosite_ad_all:广告的DNS请求,直接本级处理,丢弃,不存在DNS泄露可能。
                                                            1. 缓存检查:不存在直接泄露可能,但可能会存在污染被缓存可能。
                                                            1. cn域名判断:通过query_cn进行国内DOH/DOT公共DNS查询,本级不存在DNS泄露可能。
                                                            1. GFW域名判断:通过篇query_gfw直接转发请求至OpenClash远端处理解析并返回结果,本级不存在DNS泄露可能。
                                                            1. 非cn域名判断:通过query_nocn使用cloudflare及nextdns查询,并对结果进行过滤,解析结果为国内IP的请求将继续通过序列向下进行查询,去除被污染的DNS结果。
                                                            1. no_ecs队列:没有什么用的一个执行片段,用于为域名解析请求添加ECS地址,使其响应结果更靠近所设ECS所在IP地址,加快访问速度,其自身不产生DNS请求,同时也不存在DNS泄露可能。
                                                            1. query_fallback序列:将最终未能成功解析的域名执行fallback片段,交由OpenClash进行远端解析请求,本层级不存在DNS泄露可能。
                                                            1. 日志查询:对日志文件进行查询,发现所有关于*.ipleak.net的域名解析全部走的query_fallback,也就是交给OpenClash进行域名解析,那么可以确认在MosDNS这部分,没有产生DNS泄露的情况。
                                                            通过对整体MosDNS序列的分析,我认为产生DNS泄露点并不在MosDNS这部分,应该在OpenClash这部分。

                                                            3. OpenClash泄露排查

                                                            Openclash我所使用的是mihomo内核,也就是原Clash-Meta内核,fake-ip混合模式,同时开启了IPv6的相关功能。fake-ip的机制见仁见智,这不是这篇文章关心的内容,我的目标还是找到泄露的点在哪里,并解决DNS泄露的问题。
                                                            通过查看OpenClash的日志发现:
                                                            也就是DNS的解析请求最终没有通过OpenClash进行远端解析,而是使用了nameserver或者default nameserver所配置的DNS服务器进行了DNS解析。而我的nameserver组里恰好就阿里云的223.5.5.5
                                                            在OpenClash的issue中也有人反应过:OpenClash会同时使用fallback组和nameserver组进行DNS解析请求([Bug] dns泄露 #3843)。也就是说fallback最终back来back去back回了国内,反而污染了已经分流好的域名解析请求,并造成了DNS泄露。

                                                            4. 修复OpenClash产生的DNS泄露问题

                                                            在OpenClash中,由于DNS的解析请求工作已经由下游的MosDNS完成了一部分,剩下的一部分应该交由上游的代理进行解析,自身并不需要再提供繁杂的DNS分流规则配置工作,那么也就应该简化原有的配置。
                                                            • nameserver:在不配置proxy-server-nameserver 时,nameserver作为默认解析代理节点的dns服务器,同时考虑到DNS污染及泄露可能,我这里配置了一个nextdns的服务器,你也可以配置一个你可以正常访问的且无污染的dns服务,推荐使用DOH或者DOT这种加密DNS。
                                                            • fallback:fallback规则在具有远端DNS请求及MosDNS分流的情况下,不再具有任何意义,因为所有经由OpenClash处理的域名解析请求均是需要使用远端请求的。所以我将所有的OpenClash中的fallback服务器删除。
                                                            • default-nameserver:默认DNS,用于解析DNS服务器的域名(例如部分DOH),由于我们并没有在OpenClash中使用任何域名形式的DNS,所以可以不必填写。但为空时可能会将订阅文件中的值填充至config.yaml中,所以我填了一个nextdns的ip地址。
                                                            • 追加上游DNS:取消勾选,不需要追加。
                                                            • 追加默认DNS:取消勾选,不需要追加。
                                                            • Fallback-Filter:取消勾选,不用fallback。
                                                            • nameserver-policy:取消勾选,DNS分流已经由MosDNS完成,且geoip和geosite文件是同源文件,没必要重复对域名分流两次。
                                                            • 点击应用配置。
                                                            这样配置的好处是,不用对GEOIP,CN进行no-resolve处理,不需要OpenClash进行兜底规则配置,简单粗暴,也就不用自己动手去修改配置文件,同时也对Dnsmasq的依赖程度降到了最低。

                                                            🤗 总结归纳

                                                            执行结果直接上一张DNS泄露检测的成果图吧:
                                                            notion image
                                                            notion image
                                                            国内DNS泄露基本上是解决了。出乎意料的是也没有出现经常看到的IPv6容易造成DNS泄露的问题。
                                                            我常用的DNS,国内还是会选择阿里巴巴(Alibaba)或者腾讯(dnspod),因为提供DOH,甚至可以提供H3,不使用运营商的DNS主要就是因为无法提供加密DNS,使我访问的网站可以清晰的被ISP运营商看到,而且很多时候会被劫持到反诈;国外的话主要使用Cloudflare(赛博菩萨)或者NextDNS,最多再从AdGuard或者9.9.9.11中选择一个。IPv6的话没必要单独配置IPv6地址的DNS,一般来说大部分DNS服务器都是IPv4和IPv6双栈模式,同一个服务器也可以解析IPv6的请求。在DNS的选择上,可以参考我的这篇文章《国内外DNS推荐列表
                                                            目前这套OpenWRT环境下的配置,在AdGuard Home开启乐观缓存(Optimistic caching)的情况下,DNS请求解析时间也可以接受,处理时间在14ms左右,最低可以达到9ms左右:
                                                            notion image
                                                            当前以上这些数据也仅供参考,如果有什么问题,可以在评论区回复。

                                                            查询DNS泄露的网站

                                                            一般来说,以ipleak为例,如果全部300次请求都没有产生泄露,那么就大概率没有DNS泄露。
                                                            最后,确保DNS泄露只是在一定程度上避免ISP或者其他组织机构对网络的劫持以及对科学上网的审查,并不能完全避免,因为还存在其他的方法,例如SNI嗅探、WebRTC泄露、浏览器指纹等等。

                                                            📎 参考文章

                                                            💡
                                                            有关DNS的问题,欢迎您在底部评论区留言,一起交流~

                                                            巨大的泵!KASPA主流显卡算力表

                                                            2023年3月15日 08:00
                                                            😀
                                                            KASPA 显卡算力表主要包括了各大显卡主流GPU型号(包括 Nvidia、AMD 以及 Intel Arc ),同时在这篇文章的list中也列出了每款显卡的算力Hashrate大小。需要注意的是,KASPA显卡算力表只是提供了基于 Gminer 的显卡算力测量,它并不是唯一的测量显卡算力的方法,而且由于挖矿行业的竞争日益激烈,挖矿难度也日益上升,因此 KASPA 显卡算力表中的算力数据可能随时发生变化。
                                                             

                                                            📝 KASPA主流显卡算力表正文

                                                             
                                                            本文列表中列出的各型号显卡所对应的算力Hashrate,为未超频及优化下的算力。具体能耗比可按自己需求控制。Kaspa 是比较吃核心的 POW Token,不太吃显存,显存频率可以调整为负数,最终整体能耗比可控制在 3MH/W 左右。
                                                            Kaspa介绍:什么是Kaspa?

                                                            AMD GPU核心的KASPA(kHeavyhash)算力:

                                                            显卡型号
                                                            算力
                                                            AMD RX580
                                                            165 MH/s
                                                            AMD 6900XT
                                                            960 MH/s
                                                            AMD 6800XT
                                                            870 MH/s
                                                            AMD 6800
                                                            730 MH/s
                                                            AMD 6700XT
                                                            460 MH/s
                                                            AMD 6600XT
                                                            360 MH/s
                                                            AMD 6600
                                                            330 MH/s
                                                            AMD Radeon VII
                                                            530 MH/s
                                                            AMD 5700XT
                                                            330 MH/s
                                                            AMD 5700
                                                            250 MH/s
                                                            AMD 5600XT
                                                            250 MH/s
                                                            AMD Vega64
                                                            300 MH/s
                                                            AMD Vega56
                                                            270 MH/s
                                                            AMD 5500XT
                                                            160 MH/s
                                                            AMD RX570
                                                            145 MH/s
                                                            AMD RX480
                                                            165 MH/s
                                                            AMD RX470
                                                            145 MH/s
                                                            AMD R9 Fury
                                                            330 MH/s
                                                            AMD 7900XTX
                                                            1075 MH/s
                                                            AMD 7900XT
                                                            1050 MH/s
                                                            AMD 6950XT
                                                            965 MH/s

                                                            Inter Arc GPU核心的KASPA(kHeavyhash)算力:

                                                            显卡型号
                                                            算力
                                                            Intel ARC A770
                                                            335 MH/s
                                                            Intel ARC A750
                                                            252 MH/s

                                                            Nvidia GPU核心的KASPA(kHeavyhash)算力:

                                                            显卡型号
                                                            算力
                                                            RTX 4090
                                                            2000 MH/s
                                                            RTX 4080
                                                            1200 MH/s
                                                            RTX 4070Ti
                                                            1000 MH/s
                                                            RTX 3090Ti
                                                            940 Mh/s
                                                            RTX 3090
                                                            910 Mh/s
                                                            RTX 3080Ti
                                                            890 Mh/s
                                                            RTX 3080
                                                            750 Mh/s
                                                            RTX 3070Ti
                                                            540 Mh/s
                                                            RTX 3070
                                                            510 Mh/s
                                                            RTX 3060Ti
                                                            420 Mh/s
                                                            RTX 3060
                                                            370 Mh/s
                                                            RTX 3050
                                                            280 Mh/s
                                                            RTX 2080Ti
                                                            750 Mh/s
                                                            RTX 2080
                                                            510 Mh/s
                                                            RTX 2070
                                                            400 Mh/s
                                                            RTX 2060
                                                            340 Mh/s
                                                            GTX 1660S
                                                            250 Mh/s
                                                            GTX 1660Ti
                                                            290 Mh/s
                                                            GTX 1660
                                                            240 Mh/s
                                                            GTX 1080Ti
                                                            480 Mh/s
                                                            GTX 1080
                                                            350 Mh/s
                                                            GTX 1070Ti
                                                            290 Mh/s
                                                            GTX 1070
                                                            230 Mh/s
                                                            GTX 1060
                                                            210 Mh/s
                                                            GTX 1050Ti
                                                            110 Mh/s
                                                            RTX A5000
                                                            630 Mh/s
                                                            RTX A4000
                                                            480 Mh/s
                                                            RTX A2000
                                                            290 Mh/s
                                                            RTX A4500
                                                            ??? Mh/s
                                                            NVIDIA A100
                                                            1000 Mh/s
                                                            P106-100
                                                            195 Mh/s
                                                            Quadro RTX 5000
                                                            450 Mh/s
                                                            RTX 5090
                                                            -
                                                            RTX 5080
                                                            -
                                                            RTX 5070
                                                            -
                                                            RTX 5060
                                                            -

                                                            🤗 总结归纳

                                                            目前 Kaspa 已经被 ASIC 矿机占领,显卡挖矿已经不再是效率的选择。
                                                             

                                                            卸载Xbox Game Bar

                                                            2024年12月27日 08:00
                                                            😀
                                                            这个月的NextDNS免费额度居然用超了,在有AdGuard Home做过滤,并且已经做DNS分流的情况下,30万次请求25天被用完,这确实有点超过我的意料。查看NextDNS的数据统计,发现请求最多的是catalog.gamepass.com 。查询之后发现这个是一部分是Windows里Xbox Game Bar发出的请求,我又不玩Xbox,而且每次串流时候,按到手柄Xbox键都会呼出Xbox Game Bar,真的好烦。行,今天就卸载了你Xbox Game Bar。
                                                            notion image

                                                            📝 Xbox Game Bar卸载教程

                                                            关闭Xbox Game Bar游戏栏选项

                                                            打开Windows设置 - Gaming - Game Bar,关闭使用此按钮切换按钮单击打开 Xbox 游戏栏
                                                            notion image

                                                            禁止Xbox Game Bar后台运行

                                                            通过Windows设置,打开已安装的应用程序页面:
                                                            notion image
                                                            搜索Xbox Game Bar,然后点击高级设置(Advanced Options),将后台运行许可部分设置为永不(Never)。然后在点击下面终止 按钮,关闭Xbox Game Bar的进程。这样确保Xbox Game Bar不会继续在Windows系统后台继续运行。

                                                            使用PowerShell彻底删除XboxGamingOverlay

                                                            使用管理员模式打开PowerShell,不要使用CMD。输入以下代码:
                                                            代码的意思是找到Microsoft.XboxGamingOverlay 这个程序,并进行移除。
                                                            至此,Xbox Game Bar就完全删除了。Xbox Game Bar的删除不会影响到Windows游戏模式(Game Mode)的使用,所以无需担心。

                                                            修改注册表解决ms-gamingoverlay-link报错

                                                            在使用PowerShell卸载XboxGaminOverlay后,每次打开Xbox手柄时都会提示you'll need a new app to open this ms-gamingoverlay-link ,我们可以通过修改注册表解决。复制下面的代码,并保存在一个*.bat文件中,双击执行,并选择No ,即可完全清除剩下的XboxGamingOverlay和ms-gamebar相关信息。

                                                            📎 参考文章

                                                             
                                                            💡
                                                            有关DNS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                            NotionNext博客精简优化

                                                            2024年12月25日 08:00
                                                            😀
                                                            最近几天一直在尝试对博客进行优化。博客是使用NotionNext,部署在Vercel上。NotionNext是我用过最舒服的博客程序之一,大部分情况下可以让我在Notion专注写东西,同时如果有新的想法,也可以通过Notion及时的进行更新,即便是出门在外使用手机的情况下。但NotionNext为了满足更普遍插件及主题需求,默认情况下需要加载很多的JS,这篇文章主要就是将我的优化过程进行记录。同时也记录一下我这一年写博客的一些感想。

                                                            📝 NotionNext优化

                                                            NotionNext是一个使用Next.js框架和Notion API的博客程序,使用Notion作为数据库,将写作与博客展示分开。对于我来说,NotionNext提供了一个良好的写作体验,同时也不用担心因为服务器到期或者网站遭受攻击导致的文章数据丢失问题,而且又能部署在Vercel上,节省了一笔服务器费用。
                                                            我使用的NotionNext是通过 yarn export 生成SSG静态页面方式部署在Vercel。在首次通过Page Speed Insights测试时,Performance分数只有70分出头,这还是在之前已经通过《🔧用Cursor帮我优化博客SEO》这篇文章所提及的优化之后。之前在Google Search Console中,Core Web Vitals也提示我的大部分页面需要进行LCP优化,原因是LCP时长超过了2.5秒。这也是促成我再次对博客进行优化的一个原因。
                                                            以后后的结果如下,终于偶尔可以在移动端达到全绿的结果,就算Performance无法到达90分以上,大部分时候也是在80-90之间,之后需要解决的就是继续压缩FCP延迟的问题。
                                                            notion image
                                                            文章只是提供一种修改的思路,在根据文章内容进行删减时,建议做好备份操作,避免产生不可逆影响。目前我使用的是NotionNext 4.7.11版本。在修改的过程中,请善用下面两条git命令用于回滚版本。同时不建议向我一样直接提交到GitHub并同步到Vercel部署,可以通过 yarn dev 在本地使用测试环境查看结果。
                                                            这次优化的另一个重点就是完善一下博客的SEO。尽管NotionNext已经默认配置好了一些SEO的部分,但是还是存在一些问题,需要自己手动调整和优化。

                                                            JS加载分析

                                                            在Vercel每次部署的时候,Build Log中均会生成+ First Load JS shared by all ,这是每次需要加载的总JS大小。在未经优化之前,整体加载大小为214KB,其中主要部分均为_app-*.js 这个文件。所以我们的首要目标就是缩小_app-*.js 这个文件的大小。在优化完成后,我成功的将_app-*.js 从112kb大小缩小到了63kb大小,将近50%,页面加载速度也所有提升。

                                                            _app.js分析及优化

                                                            _app-*.js 文件是通过NotionNext中pages/_app.js 文件生成,_app.js 是Next.js用于自定义App组件进行全局初始化页面的js文件。NotionNext默认的_app.js 包括如下内容:
                                                            从各种扩展插件部分开始,这里分别是:
                                                            • BLOGblog.config.js的各种配置信息。_app.js会把blog.config.js中的各项配置信息读取并在生成_app-*.js时包括在内。
                                                            • ExternalPlugins:读取/components/ExternalPlugins.js 内的配置信息,主要是外部第三方的插件调用。会写入到_app-*.js中。
                                                            • SEO:读取/components/SEO.js 内的配置信息。主要为SEO相关的配置,影响位置在<head></head>标签内。
                                                            • Clerk:包括zhCNClerkProvider等部分,主要是登录、注册部分功能,同时与openwrtite插件有关联。
                                                            那么核心需要优化的部分就是如下这些:
                                                            • 精简blog.config.js 内的配置信息,不使用的功能部分配置进行注释或者删除。
                                                            • 精简ExternalPlugins.js 内的插件调用,不使用的插件功能删除或者注释掉。
                                                            • 精简SEO.js 内的插件调用,以及对部分SEO配置项进行优化。
                                                            • 由于我不需要登录、注册以及OpenWrite插件进行微信公众号导流,所以将Clerk部分功能删除。

                                                            去除Clerk部分

                                                            Clerk是一个Serverless登录鉴权服务,支持大量第三方的OAuth登录,很方便就能搭建起登录体系。但是我并不需要这个登录体系,并且Clerk会引用一个较大的JS包,并合并到_app-*.js 中,这应该是最大的引入内容。我直接选择删除。
                                                            在直接全部删除之后,部署之后会出现错误,无法正常显示网站内容,需要添加如下代码,使NotionNext可以返回正常内容:
                                                            另外,Clerk在lib/global.js 文件中也有植入,所以需要一并清除:

                                                            blog.config.js 优化

                                                            blog.config.js内的配置信息太多。且由于在Github上fork的NotionNext项目无法修改为私有模式。存在部分配置泄露的可能。所以我尽可能的将配置信息放在Notion中的配置中心和Vercel的环境变量中。以下列出部分可安全注释或删除的配置:

                                                            基本信息部分

                                                            以上配置项可将内容部分删除。减少写入到_app-*.js 内的字符

                                                            社交链接部分

                                                            以上各种社会化媒体的配置部分,可将不需要的配置删除。我只保留了邮箱。其他均删除。

                                                            路径和组件映射

                                                            由于我不需要登录注册相关的功能,所以对应的页面也就不需要进行渲染。这里将验证页面、登录页面、注册页面以及管理台的页面路径和组件映射删除。你也可以选择注释掉,避免之后可能会用到相关的功能。

                                                            Facebook Fan Page组件配置部分

                                                            Facebook Fan Page主要是用来在Widget进行展示使用。我没有Facebook,所以也不需要这部分的功能及配置。

                                                            ALGOLIA搜索

                                                            Algolia搜索目前我使用的Medium主题还不支持。所以我选择暂时先注释掉。如果之后研究明白怎么在Medium主题内使用Algolia搜索,再取消注释。

                                                            各种特效、AI文章摘要、机器人以及音乐播放插件

                                                            我不喜欢各种特效,降低页面性能的同时,还会干扰浏览者。同时我也暂时不需要各种机器人帮助总结文章内容。我会尝试在每篇文章的底部总结去自己手写一些要点。音乐播放器对于我来说更是用不到的部分。以上这些我都是直接选择删除。

                                                            评论插件

                                                            NotionNext内置了包括twikoo、utterance、gitscus、gitalk、valine、webmention等评论插件,但是我实际使用到的只有twikoo,且没有选择更其他评论插件的想法。所以除了twikoo之外的插件部分全部删除。

                                                            站点数据统计

                                                            NotionNext在站点数据统计部分插件也内置了挺多的,包括Vercel、Busuanzi、Baidu、CNZZ、Google Analytics、51la、Matomo、Ackee、Clarity等等。目前我都用不到,只保留了一个SEO_GOOGLE_SITE_VERIFICATION 用于Google Search Console的站点认证使用。同时对于网站的数据统计,我通过使用Cloudflare Zaraz来使用Google Analytics,也就不在NotionNext启用并配置相关内容了。

                                                            广告营收部分

                                                            因为我之后可能还是会想尝试一下Google Adsense,所以这部分配置项进行了保留,仅将数值内容删除。
                                                            万维广告及对应的广告屏蔽插件检测我均不需要,所以删除。

                                                            订阅部分

                                                            我没有也不提供邮件订阅。访客群体大多数也是国内浏览者,没有太多使用邮件的习惯,所以我甚至邮件服务器都懒得去弄。这里只保留一个RSS就可以了。

                                                            作废配置部分

                                                            这里虽说是作废配置,但是经过我测试不可以直接删除,所以我将部分配置项的值进行了修改,能缩短一字节也是有意义的。

                                                            seo.js 优化

                                                            seo.js这个文件,名字虽然是seo,但是其实他是一个NotionNext的<head></head> 管理js文件。如果需要修改meta信息,或者添加网站认证代码,均可以在这个文件进行配置。

                                                            去除重复的favicon

                                                            在seo.js中有重复的<link rel=’icon’ />标签,可以移除一个。我移除的是下面这个:

                                                            修改Meta Charset位置

                                                            Charset位置建议放在<head></head> 标签中的第一个位置

                                                            删除Baidu站点管理相关部分

                                                            我不使用Baidu站点统计及站点管理功能,百度的抓取与收录对于我来说也没有什么意义。这个博客没有任何的备案,也未部署在国内的云服务器。

                                                            删除Busuanzi数据统计部分

                                                            删除WebMention部分头信息

                                                            Webmention需要通过xmlrpc使用pingback功能,所以会在<head>标签中添加link引用。我不适用Webmention,这部分删除,减少<head>标签体积。

                                                            添加canonical标签

                                                            默认的NotionNext没有添加canonical标签,在SEO中存在一点点缺憾,为了能让搜索引擎更好的理解站点结构和唯一性结果,所以在<head>中添加canonical标签。关于canonical是什么,可以参考这里:《如何使用 rel="canonical" 及其他方法指定规范网址
                                                            <head></head>之间添加上述canonical代码,href即链接为当前页面的链接。

                                                            Facebook Page相关

                                                            由于我不需要Facebook Page,同时在blog.config.js中也删除了相关的配置信息,所以在seo.js文件中也移除相关的代码。

                                                            DNS-Prefetch相关

                                                            因为我的博客有使用外部CDN提供的JS文件,所以添加了dns-prefetch<heaad> 标签中。在浏览者访问网站的时候,可以预解析外部引入的JS文件域名,从而加快一些网站的访问速度。涉及到的域名包括https://cdnjs.cloudflare.comhttps://cdn.jsdelivr.net 以及https://npm.elemecdn.com

                                                            ExternalPlugins.js 优化

                                                            ExternalPlugins.js 这个文件相当于引用外部插件的一个入口,在NotionNext的初始默认情况下,调用了太多的插件,包括:主题切换(THEME_SWITCH)、调试(DEBUG)、ACKEE数据统计、Vercel数据统计、Busuanzi数据统计、Facebook Page、烟花特效(FIREWORKS)、樱花特效(SAKURA)、星空特效(STARRY_SKY)、音乐播放器(MUSIC_PLAYER)、彩带(FLUTTERINGRIBBON)、自定义右键菜单(CUSTOM_RIGHT_CLICK_CONTEXT_MENU)、禁止复制(CAN_COPY)、WHIZ数据统计(WEB_WHIZ_ENABLED)、Chatbase、DAO_VOICE、万维广告(AD_WWADS_ID)、百度数据统计、CNZZ数据统计、ARTALK评论插件、Gitter评论插件、Matomo评论插件、51la数据统计插件、Tianli机器人、DIFY机器人、Clarity数据统计、鼠标跟随插件、COZE机器人、Vconsole调试插件等等插件。
                                                            在默认情况下,这些插件及外部引入的js文件均会加载并合并至_app-*.js文件中,这也是造成_app-*.js 文件过大的一个原因。我所删除的部分包括:

                                                            主题部分优化

                                                            除去上面_app.js 这些部分。在主题中,也有不少的插件直接植入。例如busuanzi、备案信息等等,这部分对于不同的主题并不通用,所以需要自己酌情修改。我所使用的是NotionNext主题是medium,在medium主题中,这些基本都是在footer.js文件或者articleinfo.js文件内。所以直接进行修改即可:

                                                            ArticleInfo.js

                                                            Footer.js

                                                            多语言引入JS优化

                                                            NotionNext提供了多语言,包括中文简体、中文繁体、英文、土耳其语、日语等,但由于博客主要使用中文,且没有多语言计划,所以只保留中文简体与英文。其他部分去掉。编辑lib/lang.js ,去除除中文简体与英文外其他部分:

                                                            CSS优化

                                                            NotionNext部分插件CSS写入了全局配置,在global.css 中可以找到。因为我的评论系统使用的是Twikoo,没有使用Waline和WebMention,所以相关CSS样式可以移除,在133行附近。同时因为我未使用ChatBox,所以相关代码也进行了移除。同时也对Fontawesome所使用的图标进行了优化,默认配置中是引用了Cloudflare CDN上的all.min.css ,包括全部可使用的FontAwesome图标,我使用不到那么多。

                                                            其他优化

                                                            这次对博客的整体瘦身优化过程中,也对以下部分进行了修改与调整:
                                                            • 添加了DNSSEC认证,避免中间人攻击及域名污染问题。由于目前为了提高国内的访问速度,使用的是SaaS回源优选Cloudflare IP,所以只在回源域名增加了DNSSEC认证。
                                                            • 关闭了Cloudflare提供的Crawler Hints功能,因为我怀疑我被Bing Excluded就是因为Cloudflare利用IndexNow推送一些不重要的页面、字体文件、图片等等。
                                                            • 关闭了Github Action中NotionNext提供的PushUrl功能。我经常会调整博客,所以每次Push之后都会触发,这也可能是Bing认为我滥用IndexNow的一个原因。
                                                            • 不再使用Cloudflare优选IP,尽量少白嫖一点赛博菩萨。同时在考虑是否关掉小黄云,这样国内的浏览者访问速度会更快些。
                                                            • 精简了列表页面的展示文章数量,从12减少到10。因为我认为从搜索引擎而来的访客都具有明确的目的,并且到达的也是明确的落地页,所以列表页的重要性没有那么高。而较少文章数量的列表页,能够提供更好的加载速度,尤其是首页(首页也是一个列表页)。
                                                            • 优化了标签页面和文章分类页面的meta description ,使他们具有和首页不同的meta描述信息。
                                                            • 去除了首页和全站搜索页面的输入框。因为我是通过yarn export方式的SSG部署,所以搜索功能其实并不可用,反而会跳转到404页面。
                                                            • 添加了部分页面的内链及锚文本,尽可能的做好SEO。
                                                            • 更换Prism Autoloader的CDN为cdnjs.cloudflare.com,通过IT DOG查了一下cdnjs在国内的访问速度并不差,原来的elemecdn会多一次请求,同时在使用Pagespeed Insights测试时候偶尔会timeout

                                                            🤗 总结归纳

                                                            首先特别感谢tangly1024所开发的NotionNext,让我又重新开始写博客,这是一个我认为很棒的开始。
                                                            在过去的这一年时间里,慢慢的将博客从0收录,到现在日访客200多将近300,看着访问曲线上升以及评论区的反馈,真的感到很有成就感,也真的为自己所分享的内容帮助到别人而开心。简中互联网现在可查阅的内容太少了,我也真的希望自己可以记录下一些能够解决别人问题的内容。
                                                            在过去的这一年中,通过写博客这件事情,我也慢慢开始上手进行写一些代码,尽管大部分都是在AI(Cursor、Cline等等)的帮助下,但是也感觉自己是在进步,有在学会找解决问题的方式。昨天还和朋友在聊现在AI的势头,会不会大部分工作都变得没有意义。我想,在AI普及之后,只是我们找答案的方式变了,但是提出问题与寻找答案,还是要靠我们人类自己。
                                                            我不太是一个善于描述内容的人,写博客对于我来说也是一种讲述内容的锻炼:如何将一件事的过程讲给浏览者听,让他们明白与理解。所以我也需要对访问博客的浏览者表示感谢,你们在帮助我锻炼这种能力。
                                                            最后,祝各位圣诞节、元旦新年快乐。

                                                            📎 参考文章

                                                            💡
                                                            有关NotionNext安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                            PVE环境RouterOS开启Container指南

                                                            2024年12月2日 08:00
                                                            😀
                                                            这是之前在折腾过程中填的一个小坑,因为PVE环境下的RouterOS(ROS)与MikroTik的实体路由器不同,当时尝试使用Container主要是想把AdGuard Home放进去,但是后来由于发现了LXC容器更适合做这种事情,也就没有在继续操作下去。在开启Container容器的时候出现了一点小坑,记录一下。本质上RouterOS的Container也是Docker的一种,在使用上会受限于RouterOS,所以并不能完全替代Docker,但在具体使用上,也可以参考Docker的一些用法。

                                                            📝 开启RouterOS Container指南

                                                            安装RouterOS Container组件

                                                            打开Winbox,点击System - Packages ,查看是否已经安装了Container组件,如果没有的话,需要前往https://mikrotik.com/download下载Extra packages ,解压后将container-7.16.2.npk文件通过Winbox的Files 上传后安装,下载时注意选择自己的架构版本,PVE用户选择X86架构。已经安装了ContainerPackages显示如下:
                                                            notion image

                                                            启用RouterOS Container

                                                            在Winbox中选择New Terminal ,输入如下命令,切换为enterprise模式,并启用container:
                                                            这时候会提示
                                                            提示我们需要关闭RouterOS的电源或者按RESET按钮,但是PVE的虚拟机没有RESET按钮,直接拔PVE主机的电源也不太现实。直接在Winbox中重启RouterOS或者通过PVE面板重启RouterOS均不能正常启用Container服务。
                                                            所以我们回到PVE的管理页面,找到RouterOS的虚拟机,直接选择停止,不要选择关机或者重启,这个操作就相当于直接拔了RouterOS这台虚拟机的电源。在系统提示RouterOS虚拟机已经停止后,选择启动,RouterOS会自动进行enterprise mode和Container启动的相关配置。
                                                            RouterOS启动完成后,通过Winbox进行连接,打开New Terminal,输入如下命令查看是否启用Container成功:
                                                            返回结果:
                                                            即表示Container已经正确启用。
                                                             

                                                            设置Docker镜像地址

                                                            打开Terminal,输入如下命令:
                                                            https://registry-1.docker.io 也可以替换为其他Docker镜像站地址,例如我之前提供的:🐳Docker加速镜像

                                                            📎 参考文章

                                                             
                                                            💡
                                                            有关RouterOS(ROS)安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                            Dae安装及配置指南

                                                            2024年12月1日 08:00
                                                            😀
                                                            我使用Dae替代OpenClash进行科学上网已经有一段时间,目前整体系统的运行情况也已经稳定,该踩的坑也都已经踩过。之前也零零散散写过几篇关于Dae的文章,主要是一些进阶的用法,例如搭配AdGuard Home和MosDNS等其他DNS解析程序,进行广告过滤、国内与国外域名分流等等使用方法,但这些文章没有更多的涉及到Dae本身的安装以及配置和使用指南,所以这篇文章就来填这个坑。

                                                            📝 什么是Dae

                                                            Dae(大鹅)是一个高性能的透明代理解决方案(科学上网解决方案),在作用上与MihomoSingbox等基本相同,均是通过域名、IP、端口、来源地址、目标地址以及规则集等等不同方式,对流量进行分流以及使用代理,从而达到科学上网的目的。但在核心原理上,Dae通过在Linux内核中使用eBPF实现流量分流拆分与透明代理,允许在网络驱动程序的最早阶段处理数据包。这样可以在将数据包传递给内核协议栈之前进行快速处理,比如丢弃、转发或修改数据包,所以相比其他软件,Dae的直连性能更好,同时也更方便实现国内外流量分流,在效率上更优。

                                                            Dae支持功能

                                                            • 支持通过本地主机的进程名称进行流量分流。
                                                            • 支持通过局域网中的MAC地址进行流量分流。
                                                            • 支持使用反向匹配规则进行流量分流。
                                                            • 支持根据策略自动切换节点。
                                                            • 支持 Shadowsocks、Trojan(-go) 和Socks5的全锥NAT(Full Cone)
                                                            • 支持高级DNS解析策略及域名分流
                                                            • 天然支持IPv6,无需额外设置

                                                            Dae支持协议

                                                            • HTTP(S), naiveproxy
                                                            • Socks
                                                            • VMess(AEAD, alterID=0) / VLESS
                                                            • ShadowsocksR
                                                            • Proxy chain (flexible protocol)链式代理

                                                            Dae支持系统

                                                            由于Dae软件自身特性(使用eBPF),只支持Linux核心的操作系统(Only Support By Linux Kernel),并且内核版本不低于5.17 ,如果使用0.9.0-rc以上,内核版本不低于6.1.0。Dae需要Linux Kernel内核开启如下选项,一般来说,完整的Linux系统都是已经处于开启状态:
                                                            可以通过如下命令查看Linux内核是否开启了这些选项:
                                                            所以Dae这个软件更适合部署于X86架构的路由器或者旁路由(旁路网关)上作为代理网关进行科学上网来使用,嵌入式设备或者硬路由由于Linux核心版本问题,大部分无法正常使用。常规的Linux发行版均可满足Dae的要求,例如Debian(我目前在使用的)、 Ubuntu、 Arch Linux、Fedora等等。Dae也支持在OpenWRT上进行使用,但需要自行进行固件编译,使用较新的Linux Kernel版本,并开启对应内核选项,默认版本大部分内核暂时不满足Dae的需求。
                                                            我个人建议作为科学上网的旁路网关(或者说是旁路由,但是其实并没有使用到路由的功能),还是尽量使用完整版的Linux发行版,现在Youtube上不少UP主也开始推荐主路由器 + Linux发行版作为旁路网关的家庭网络科学上网方案,一方面因为在旁路网关中,OpenWRT提供的很多功能用不到,另外一方面,在Linux Kernel的更新以及完整性上,OpenWRT也阉割了很多,Kernel特性支持较为落后,目前OpenWRT的主力版本还在使用5.15的Kernel,这也是为了兼容各种嵌入式设备与多平台架构的结果。

                                                            📝 Dae安装

                                                            本篇内容是以我个人网络环境和拓扑为操作前提进行编写,所以在特殊场景下,可能并不适用于你的网络环境。我所使用的整体系统环境如下:
                                                            • Proxmox VE(PVE)环境,未进行网卡直通
                                                            • Debian 12 (核心版本:6.1.0-26-amd64)
                                                            • 作为旁路由(旁路网关)使用,只有一个网口ens18

                                                            Dae安装脚本

                                                            Linux衍生版本安装Dae

                                                            衍生版本包括Debian、Ubuntu、Kali、Fedora、Arch等等。
                                                            Dae提供了脚本直接进行安装,可通过如下命令进行:
                                                            当前Release版本为0.80.9,最新RC版本为0.9.0 1.0rc2,如果希望使用rc版本,可使用如下命令:
                                                            如果需要卸载Dae,可使用如下命令:
                                                            安装完成后,二进制执行文件位于/usr/local/bin/dae ,同时会自动添加systemctl执行脚本;
                                                            配置文件位于/usr/local/etc/dae/config.dae
                                                            这个方法不适用与OpenWRT用户。如果你是OpenWRT用户,请参考下面部分。

                                                            OpenWRT通过OPKG安装Dae

                                                            如果你是ImmortalWRT 24.10版本用户(Linux内核版本6.6.73),通过ImmortalWRT的官方软件源通过opkg即可安装,同时需要安装的kmod依赖也在下面的命令里面。目前提供的版本为0.9.0-r2
                                                            以上方法也同样适用于Daed。

                                                            OpenWRT编译安装Dae

                                                            如果使用的是官方版本的OpenWRT(官方版本可能无法直接安装kmod的ipk文件),在编译时没有选择所需的kmod依赖,而是使用的默认packages,那么可能需要重新编译安装,推荐直接使用ImmortalWRT,具体流程如下:
                                                            1. 打开ImmortalWrt Firmware Selector并选择你的机器架构,软路由一般为Generic x86/64
                                                            notion image
                                                             
                                                            1. 点击Customize installed packages and/or first boot script进行定制ImmortalWRT,并在Installed Packages中复制粘贴如下内容:
                                                            1. 点击Request Build,进行定制版ImmortalWRT定制版编译请求,然后等待编译完成并生成下载链接,这个过程大概5-10分钟。
                                                            1. 编译完成后Custom Download里会显示不同版本的下载按钮,一般选择COMBINED-EFI (EXT4) ,下载后的镜像为*.img 格式,根据自己的虚拟化系统不同,进行格式转换。之后的流程与其他在软路由上安装OpenWRT的流程相同。
                                                            1. 单独的Dae安装文件(dae_0.9.0-r2_x86_64.ipk)下载地址为:https://downloads.immortalwrt.org/releases/24.10.0/packages/x86_64/packages/dae_0.9.0-r2_x86_64.ipk
                                                            以上方法也同样适用于Daed。

                                                            更新GeoIP与GeoSite数据库

                                                            如果需要更新GeoIPGeosite数据库,那么可以使用如下命令:
                                                            更新GEOIP
                                                            更新GEOSITE
                                                            更新后的GeoIP与GeoSite文件位于/usr/local/share/dae 文件夹内,Dae会自动使用该位置的GeoIP与GeoSite数据库文件,无需进行移动或复制至新的位置。

                                                            📝 Dae配置文件

                                                            Dae的配置文件很简单,而且可读性也很高,不必考虑乱七八糟的防火墙劫持与DNS劫持,在我的网络环境下,对付ISP的劫持反诈的劫持也有很好的效果。
                                                            以我个人网络环境为例,提供Dae配置文件如下,需要修改的部分为global部分lan_interface的网卡名称、subscription 内的订阅地址,group部分的节点过滤规则。这套配置目前使用于旁路网关上,支持IPv6,同时ipleak超过300次检测未发现DNS泄露情况。
                                                            12月27日更新:
                                                            • 增加了小米部分设备域名。部分反应miwifi.com 域名请求次数太多可能是导致内存泄露的原因。
                                                            需要注意部分:
                                                            • Group 内节点组名称需要与 Routing 中规则名称对应,例如修改了节点组 Proxy 的名称,那么在 Routing 中也需要修改 proxy 为新的名称
                                                            • 如果使用RC版本,DNS可以使用DOH或DOT,支持H3协议的DOH,以阿里巴巴的阿里云DNS举例:
                                                              • DOH:h3://dns.alidns.com:443
                                                              • DOT:tls://dns.alidns.com:853
                                                              • DOQ:quic://dns.alidns.com:853
                                                            • 节点过滤规则:如果使用固定节点,policy: fixed(0) 并且filter: name(节点名称) ,如果节点名称中包括emoji符号,可能无法正常选择提示报错,此时建议使用filter: name(keyword: ‘节点关键字’) 方式进行过滤选择。
                                                            • Routing 中的规则为顺序匹配,从上至下,所以建议将特定规则放在最上方,将例如Geosite:CN 等较大的规则集放在下方,避免规则冲突无法正常匹配。例如,你可以将自定义规则放置于最上方。

                                                            启动Dae

                                                            使用如下命令可以启动Dae。
                                                            在OpenWRT软路由中,启动命令为:
                                                            如果需要在前台使用Dae,便于查看Dae运行情况,可以使用:
                                                            在OpenWRT系统中则为如下命令:
                                                            当修改配置文件后,需要重载Dae配置文件时,可以使用:
                                                            在OpenWRT中则为如下命令

                                                            Dae自动更新并存储订阅

                                                            由于Dae每次启动时均需要重新读取订阅信息,本身并不存取订阅信息,当订阅链接被墙或者无法访问时,就无法正常获取到订阅信息及分组信息,造成访问异常。以下方法可以实现订阅信息存储和自动订阅更新。

                                                            systemd.timer方法

                                                            假设你的dae配置文件存储于/usr/local/etc/dae/ ,这也是通过自动安装脚本默认的存储位置。那么新建一个/usr/local/bin/update-dae-subs.sh文件:
                                                            赋予这个文件可执行权限:
                                                            配置systemd.timersystemd.service进行自动更新
                                                            • /etc/systemd/system/update-subs.timer: 以下代码是每12小时,或者每次系统启动后15分钟更新
                                                            • /etc/systemd/system/update-subs.service:
                                                            新建订阅链接文件:/usr/local/etc/dae/sublist ,并安装以下模板填写订阅链接,如果只有一个订阅,则保留并填写一个即可。当通过update-subs.timer 拉取订阅信息时,会自动建立sub1sub2sub3 的订阅文件。
                                                            赋予订阅链接文件600权限
                                                            修改config.daesubscription 部分内容为订阅文件
                                                            启动Timer

                                                            Crontab方法

                                                            如果你的系统没有system.timer ,也可以使用crontab进行替代。区别在于无法实现系统启动后自定义时间进行更新,只能定时更新。
                                                            编写/usr/local/bin/update-dae-subs.sh 文件
                                                            通过crontab实现定时更新,以下例子为12小时执行一次。你可以使用crontab计算器查询定时规则。
                                                            剩余步骤与上面system.timer部分相同。

                                                            🤗 Dae的其他用法

                                                            如果需要图形界面进行配置,可以选择Daed,配置文件内容大同小异,主要就是DNS和Routing部分,对应截取之后粘贴到控制台里面就好。

                                                            OpenAI相关规则

                                                            geosite:openai 规则并不全面,如果遇到无法使用的情况或者降智情况,可以添加以下部分规则,替换ai 代理组为你的代理组名称:
                                                            以上规则包括Gemini,Openai,Copilot,Apple Intelligence, Claude这些AI服务提供商。

                                                            关于Dae的CPU占用率高及内存泄露

                                                            建议添加如下规则禁止Quic。Daed也建议添加该规则。
                                                            同时建议添加机场节点域名至Direct规则内,避免回环产生的内存泄露。

                                                            📎 参考文章

                                                            💡
                                                            有关Dae安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                            PVE环境下LXC容器安装与配置Tailscale

                                                            2024年11月25日 08:00
                                                            😀
                                                            最近将AdGuard Home、Tailscale、DDNS-GO等服务从原有的旁路网关服务器上分离,全部装在了Proxmox VE(PVE)的LXC容器中(Alpine系统),减少旁路网关中Dae对其他服务的影响,让复杂的网络结构变得更清晰易于控制一些。LXC容器的资源占用出乎意料的低,在分配1vCPU的情况下,占用不到1%,以上服务全部安装配置完毕后,内存占用在120MB左右。

                                                            📝 LXC容器安装与配置Tailscale

                                                            LXC容器是什么

                                                            LXC全称Linux Containers,是Linux内核容器特性的用户空间接口。LXC容器使用与Linux系统其他部分隔离开的一个或一组进程。运行这些进程所需的所有文件都由另一个特定镜像提供,意味着从开发到测试再到生产整个过程中,Linux容器都是可移植且一致的。可以理解为Linux自己的Docker

                                                            配置LXC容器

                                                            由于LXC容器毕竟只是Proxmox VE(PVE)母机下的一个容器,并不具有完整的系统配置,如果通过正常方式安装Tailscale,会发现无法通过tun启用tailscale的虚拟网卡,例如报错:/dev/net/tun not found ,所以需要先在PVE母鸡进行配置:
                                                            通过SSH或者网页端Proxmox VE(PVE)节点的Shell,进行LXC容器配置,例如我的LXC容器ID为101,那么对应配置文件就位于:/etc/pve/lxc/101.conf ,在其中添加如下内容:
                                                            1. lxc.cgroup2.devices.allow: c 10:200 rwm
                                                              • 允许设备访问:这行配置允许容器访问特定的字符设备。
                                                              • c 10:200:表示字符设备,主设备号为10,次设备号为200,/dev/net/tun,用于 TUN/TAP网络设备。
                                                              • rwm:表示读、写和创建(mknod)的权限。
                                                              1. lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
                                                                • 挂载设备:这行配置将主机的/dev/net/tun设备挂载到容器的同一位置。
                                                                • none bind:表示进行绑定挂载,即将主机的设备节点直接映射到容器中。
                                                                • create=file:如果目标位置不存在,则创建一个文件节点。
                                                                1. 保存后,重启LXC容器。

                                                                安装TailScale

                                                                由于我使用的是Alpine系统,所以默认没有SSH服务,需要通过LXC容器的控制台,进行TailScale安装。
                                                                安装完成后,进行TailScale账户的绑定

                                                                配置TailScale自启动

                                                                配置IPv4及IPv6转发

                                                                因为我需要tailscale作为我内网穿透回家的路由点,所以需要配置IPv4及IPv6的转发。
                                                                如果系统使用的是sysctl.d目录的方式,那么进行如下配置:
                                                                目前我的环境(LXC容器,Alpine系统)就是这个方式,如果在sysctl.conf中进行IPv4和IPv6转发配置,会被空文件覆盖,并不会生效。

                                                                配置Tailscale广播子网路由

                                                                替换其中的192.0.2.0/23为你的局域网IP地址范围(根据热心网友的提示,修改/24/23)。然后在Tailscale的管理页面勾选节点的subnet allow请求即可。如果tailscale之前已经启动,那么需要先关闭后再使用上述命令启动。

                                                                UDP GRO错误解决

                                                                由于在使用Alpine系统,所以可能会在运行tailscale up命令后出现以下报错:
                                                                解决办法为安装ethtool,并通过ethtool配置UDP GRO Forwarding开启,以及UDP GRO List关闭:
                                                                其中eth0wan口名称。

                                                                持久化处理

                                                                在完成上述的配置之后,重启LXC容器时,以上的配置会被PVE母鸡初始化,所以我们需要将上述的配置进行固化。
                                                                LXC容器ethtool命令固化
                                                                /etc/network/interfaces中,eth0 auto 行下方增加命令:
                                                                命令详解:
                                                                • pre-up:这是一个指令,表示在网络接口启动之前要执行的命令。在这种情况下,ethtool 命令会在接口 eth0 激活之前执行。
                                                                • ethtool:这是一个用于查询和控制网络驱动和硬件设置的命令行工具。
                                                                • K eth0:这部分指定要对网络接口 eth0 应用设置。
                                                                • rx-udp-gro-forwarding on
                                                                  • rx-udp-gro-forwarding 是一个选项,用于启用或禁用 UDP 通用接收卸载(GRO)转发。
                                                                  • 设置为 on 启用该功能,这可以通过允许网络栈在处理前将多个 UDP 数据包合并为更大的一个来提高 UDP 流量的性能,减少 CPU 开销。
                                                                • rx-gro-list off
                                                                  • rx-gro-list 是一个与 GRO 列表处理相关的选项。
                                                                  • 设置为 off 禁用此功能,这可能是根据特定网络硬件或驱动程序的能力来确保最佳性能或兼容性所必需的。
                                                                Proxmox VE(PVE) Debian母鸡增加持久化
                                                                /etc/network下新增文件.pve-ignore.interfaces ,文件内容为LXC容器内网卡的名称,例如根据本文来看,就是eth0 ,如果你不清除你的网卡名称是什么,也可以在LXC容器中执行以下命令来获取名称:

                                                                📎 参考文章

                                                                💡
                                                                有关Tailscale安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                又来革命?AutoGPT!

                                                                2023年4月15日 08:00
                                                                 
                                                                😀
                                                                AutoGPT是一种非凡的人工智能技术,它通过API利用GPT-4和GPT-3.5来创建完整的项目,通过迭代自己的提示并在每次迭代中建立它们。它可以读写文件,浏览网页,查看其提示的结果,并将它们与提示历史记录结合起来。简而言之,AutoGPT是朝着AGI的突破,并有可能彻底改变我们的工作方式。
                                                                AutoGPT是一个实验性的开源应用程序,展示了GPT-4语言模型的能力。该程序由GPT-4驱动,自主开发和管理业务以增加净值。作为GPT-4首批完全自主运行的例子之一,Auto-GPT推动了人工智能可能性的边界。
                                                                 

                                                                📝 AutoGPT的优势

                                                                AutoGPT具有许多优点。首先,它可以自动、高效地生成自然语言文本,这意味着它可以在不需要人类输入和干预的情况下自我提示,执行多个任务。其次,它可以通过强化学习来优化自己的架构并生成比传统GPT模型更高效的代码。此外,AutoGPT还能够通过自我监督学习来从自己的输出中学习并随着时间的推移提高其性能。
                                                                AutoGPT为不同行业的用户提供了无数机会。例如,它可以帮助在营销、内容创作和数据分析等领域自动化任务,使企业能够专注于核心竞争力并推动创新。
                                                                notion image

                                                                🤗 如何使用AutoGPT

                                                                使用AutoGPT的第一步是定义AI的角色。用户应根据他们希望它执行的任务为其AI分配一个名称和角色。例如,研究、Python代码生成或故事增强。
                                                                接下来,您需要设置清晰的目标,然后执行任务。AutoGPT是一个实验性的开源应用程序,它展示了GPT-4语言模型的能力。该程序由GPT-4驱动,自主开发和管理业务以增加净值。它是GPT-4首批完全自主运行的例子之一,真正推动了人工智能可能性的边界。
                                                                您可以访问Auto-GPT在GitHub上的存储库,那里您将找到所有必要的文件和说明。此外,您还可以加入Auto-GPT Discord社区,向其他人提问并与志同道合的人交流。您也可以在Twitter上关注项目创建者Torantulino,以便随时了解最新的发展和进展。
                                                                 
                                                                 

                                                                ImmoralWRT软件源分享

                                                                2024年6月6日 08:00
                                                                😀
                                                                ImmortalWrt是OpenWrt的一个第三方分支,主要针对国人用户开发,在不对系统进行过度修改的情况下,不仅继承了OpenWRT的灵活性和强大功能,还提供更多的本地化软件包和设备支持,对IPv6的支持也很稳定,应该是国内目前最为纯净的OpenWRT系统。也是支持使用Dae的OpenWRT分支。
                                                                本文章适用于ImmortalWRT用户,与OpenWRT官方源仓库不一定兼容,如需使用OpenWRT官方源仓库,可参考:🖥️OpenWRT 软件源整理

                                                                📝 ImmoralWRT软件源

                                                                ImmoralWRT软件仓库地址

                                                                ImmoralWRT在国内有镜像加速,目前ImmoralWRT路由系统在安装完成之后默认使用的OPKG软件仓库为下面这个:
                                                                软件仓库提供版本及架构选择,请根据自身设备所使用的OpenWRT版本及系统架构进行选择。

                                                                Opkg配置ImmoralWRT软件源

                                                                以下内容以ImmoralWRT-23.05.3,X86-64架构的软件源为例,其他版本及架构可通过仓库选择之后复制地址替换到下面的代码中。

                                                                命令行方式

                                                                1. 编辑/etc/opkg/customfeeds.conf
                                                                1. 复制以下软件源配置信息至文件中并进行保存
                                                                1. 更新软件源

                                                                Luci界面操作方式

                                                                1. 登入OpenWRT管理页面
                                                                1. 打开系统 - 软件包 ,点击配置opkg
                                                                1. /etc/opkg/customfeeds.conf 粘贴以下内容并保存
                                                                1. 点击更新列表进行软件源更新

                                                                镜像地址

                                                                如果默认的镜像地址在你的网络下速度并不理想,可以替换使用其他镜像地址:
                                                                • CERNET(校园网联合镜像站):
                                                                • 南开大学开源镜像站
                                                                • 北京大学开源镜像站
                                                                • 上海科技大学Geek Pie开源镜像站
                                                                • 中国科学技术大学开源镜像站
                                                                • 致远镜像站
                                                                • 吉林大学开源镜像站
                                                                • 上海交通大学开源镜像站
                                                                • 南京大学开源镜像站
                                                                • Cloudflare镜像站

                                                                替换方法

                                                                修改 /etc/opkg/customfeeds.conf 文件,将源地址 https://downloads.immortalwrt.org 或 https://mirrors.vsean.net/openwrt 更改上面的镜像站地址。
                                                                或者通过命令行方式进行修改,格式为s,[原来的软件源地址],[替换的软件源地址],g
                                                                替换完成后通过opkg update进行更新。

                                                                ImmoralWRT固件下载

                                                                推荐使用官方提供的Firmware固件下载服务。如具备动手能力可自行编译固件。

                                                                📎 参考文章

                                                                 
                                                                💡
                                                                有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                如何在Debian上编译安装Neovim

                                                                2023年7月12日 08:00
                                                                😀
                                                                Neovim是一个开源的Vim替代品,提供了许多增强功能,如异步操作、内嵌脚本语言、内置编译器等。在Debian操作系统上编译安装Neovim需要一些命令行技巧。本文将向您详细说明如何在Debian上编译安装Neovim。

                                                                📝 什么是Neovim

                                                                notion image
                                                                Neovim是一个高度可定制的类Vim编辑器,与原始Vim编辑器相比,它具有以下一些优势:
                                                                1. 异步操作:Neovim允许您在编辑文件时执行异步操作,例如代码补全和语法检查,从而提高编辑效率。
                                                                1. 内置脚本语言:Neovim内置Lua作为脚本语言,提供了更多的自定义选项和插件。
                                                                1. 用户界面改进:Neovim提供了更加直观的用户界面,以及更好的键盘快捷键和操作体验。
                                                                1. 兼容性:Neovim兼容大多数Vim插件,因此您可以轻松地移植现有的Vim配置。
                                                                1. 更好的多标签支持:Neovim提供了更好的多标签支持,允许您在多个文件间快速切换。
                                                                1. 更好的LSP支持。
                                                                但是由于目前Deiban软件仓库中提供的Neovim steable停留在0.4X版本,testing版本还是0.7.X版本,很多功能优化已经落后Release版本太多,很多插件也不再进行支持,所以我们采用编译的方式进行安装。
                                                                notion image

                                                                准备工作

                                                                首先,您需要确保您的Debian系统上已经安装了必要的编译工具,如GCC、make等。如果您没有安装这些工具,可以使用以下命令进行安装:
                                                                此外,您还需要安装一些Neovim依赖项,如Python、Lua等。使用以下命令安装这些依赖项:

                                                                下载Neovim源代码

                                                                现在,您可以从GitHub下载Neovim的源代码。您可以使用以下命令从GitHub下载最新版本的源代码:

                                                                编译安装Neovim

                                                                现在,您已经准备好编译安装Neovim了。在源代码目录中,运行以下命令来编译安装:
                                                                编译完成后的neovim安装于/usr/local文件夹中,不用进行软链接或者cp操作。你也可以修改CMAKE_INSTALL_PREFIX为你想安装的目录,同样记得给目录添加到环境变量PATH中。

                                                                兼容性提示

                                                                除了Debian系统外,Ubuntu, Centos, Redhat, Kali等常用Linux系统也可通过本文的方式进行编译安装(甚至OpenWRT也可以)。

                                                                二进制文件安装Neovim

                                                                除了通过编译安装Neovim之外,也可以通过Github Release Page直接下载Neovim的二进制文件进行使用。主要发行版本均支持此方式。

                                                                英文版本

                                                                Neovim配置

                                                                我个人在使用Astronvim提供的配置文件。AstroNvim 是一款美观且功能丰富的Neovim配置,注重可扩展性和易用性。安装起来也很简单:
                                                                 

                                                                青龙面板错误解决方法小全

                                                                2023年3月1日 08:00
                                                                😀
                                                                本篇文章旨在记录并解决目前我在使用Docker运行青龙面板(qinglong)薅京东羊毛时所遇到的问题,包括各种疑难杂症、依赖问题、报错问题。希望可以对其他人有所帮助,我会持续进行更新,请善用ctrl-f进行搜索。有人问青龙面板除了挂京东之外,还能挂什么? 现在除了挂京东之外,其他都没有什么收益,就专心薅东哥羊毛吧,不是黑号的情况下,每个月1000京豆还是有的。

                                                                📝 青龙面板问题列表

                                                                1. 运行日志提示:cookie.match is not a function

                                                                cookie相关脚本出现问题,删除任务之后重新拉库解决

                                                                2. bizCode, bizMsg, lxml依赖问题

                                                                目前已基本没有脚本依赖这三个,大部分教程已经过期,alpine包仓库里也已经移除这三个程序。
                                                                如果需要安装bizCode、bizMsg依赖,需要先安装alpine-sdk、autoconf、automake以及libtool依赖,这样的话,整体Linux部分依赖就是,注意顺序:
                                                                整体的Linux依赖安装时间较长,请耐心等待。
                                                                在依赖安装过程中,安装过程中可能日志中可能会出现:
                                                                建议自查网络是否存在问题。
                                                                另外还有一种办法就是使用Debian镜像版本的青龙,docker-compose文件为:
                                                                如果你的青龙面板部署在旁路由上,和科学上网插件在同一台机器,建议使用Docker的host模式,避免因为网络问题所产生的报错:

                                                                3. 青龙日志分析 && 自动补全依赖提示:

                                                                这种情况一般是因为拉了多个库,存在多个日志检测脚本文件造成的。通过添加环境变量:
                                                                通过指定运行的日志检测脚本的绝对路径,让其他日志检测脚本检测到路径与此变量不符将停止运行

                                                                4. 微信签到红包报错

                                                                账号是黑号,没必要挣扎了。

                                                                5. Faker2库拉取失败,点击链接提示404

                                                                Faker2库的拉取命令为:
                                                                其中,使用git.metauniverse-cn.com用于Github的加速,如果拉库失败,且点击链接提示404,可在开启科学上网的情况下,使用不加速Github的拉库命令:

                                                                6. 总看到助力池,那助力池是什么?如何使用助力池进行助力?

                                                                参考这篇文章:《如何加入京东助力池?

                                                                7. Python3依赖安装失败

                                                                例如ping3canvasjiebaPrettyTable等。这些Python的依赖安装报错大概为:

                                                                解决方法(1)

                                                                主要都是集中在pip发现有多个版本的该Python包,无法选择使用哪个。这个问题一般是由于pip 版本问题导致的,我们需要对docker内的pip版本进行更新。步骤如下:
                                                                1. 通过SSH进入Docker内的Bash命令行
                                                                1. 更新pip版本
                                                                1. 添加Linux依赖
                                                                在青龙的依赖管理中,Linux部分添加如下依赖:
                                                                1. 重新执行ping3canvasjiebaPrettyTable等Python3的依赖安装。

                                                                解决方法(2)

                                                                如果解决方法(1)没有解决Python依赖安装报错问题,那么可能是网络问题导致的依赖下载超时。建议修改Docker网络模式为HOST宿主模式,这种问题一般出现在青龙面板和科学上网同时都部署在旁路由上导致,Docker无法正常使用旁路由的分流。如果你使用的是Clash系列的插件,也可以在青龙面板的配置文件中修改ProxyUrl 为你的插件所提供的socket5http代理地址及端口,例如OpenClash的为http://127.0.0.1:7890
                                                                使用Host模式的Docker-Compose文件:

                                                                8. Ninja面板扫码登录不跳转

                                                                Ninja扫码登录京东之后未跳转,这个是青龙面板的版本问题。2.18.2版本的青龙面板不再使用/ql/data/config/auth.json 存储登录鉴权信息,所以Ninja无法写入JD Cookie,造成扫码登录京东之后不跳转,JD Cookie也未更新。
                                                                遇到此问题建议更换青龙面板为较老版本。

                                                                9. 青龙面板拉库提示脚本添加失败(jwt malformed)

                                                                具体表现为拉库成功,但是添加脚本失败,大概的类似日志如下:

                                                                解决办法

                                                                在docker shell中运行如下命令:
                                                                命令大概意思为添加tslib依赖,并重新检查青龙面板的依赖关系,并对存在问题的部分进行自动修复。
                                                                然后再次执行拉库命令即可,这里使用的是faker4的纯净版脚本库:

                                                                10. 如何获取京东APP的wskey和pin

                                                                目前Android上的VNET app已经无法下载,所以可以使用ProxyPin进行替代。Google Play商店可以下载。操作基本与VNET类似,需要先安装证书,并添加京东APP到白名单,才可以开启数据监控。
                                                                如果在ProxyPin中找不到x-im.jd.com 相关域名获取pin和wskey(目前能够搜索到的大多数教程都是通过这个域名获取wskey,但是目前似乎京东APP不再请求这个地址),可以尝试查找sh.jd.com 相关域名,也可以获取到pin和wskey。
                                                                 

                                                                Control Panel for Twitter,关闭Twitter讨厌的为你推荐!

                                                                2023年2月12日 08:00
                                                                😀
                                                                Twitter(推特)自从Musk收购并更名为X之后骚操作不断,最近的更新中增加了“为你推荐(For You)”这个功能,基于关注的关系网,进行内容推荐,而且默认网页版进去之后就是“为你推荐(For You)”,把个人关注的时间线变成了广场一样的Public Zone。尤其是各种小黄推和广告穿插其中,影响阅读体验的同时,也日渐感觉营养跟不上。
                                                                而且,Twitter目前最为令人讨厌的一点是,Twitter官方并没有提供关闭“为你推荐(For You)”的功能,所以只能通过其他的渠道去解决。

                                                                📝 Control Panel for Twitter 介绍

                                                                notion image
                                                                前几天逛Greasyfork(油猴)时候发现了一个脚本(script)能够让Twitter(也就是X)恢复成原来的样子,默认显示自己的时间线Timeline,不显示为你推荐,并且可以过滤Twitter的广告。这个油猴脚本的名字叫做Control Panel for Twitter
                                                                功能方面有这么一些,简单概括一下:
                                                                1. 默认为“(关注)Following”(时间顺序)时间线,如果Twitter试图将您移至“为你推荐(For You)”时间线,则自动将您切换回。
                                                                1. 隐藏“为你推荐”的标签页Tab。
                                                                1. 将转推移动到单独的选项卡
                                                                1. 将引用推文和对它们的回复移动到主页时间线中的单独选项卡
                                                                1. 隐藏引用您已屏蔽帐户的推文
                                                                1. 在主页时间线和其他地方隐藏“关注谁”、“关注一些主题”等(右侧边栏)
                                                                1. Full-width timeline(全宽的时间线):隐藏侧边栏及侧边栏的广告,让时间线内容在主页、列表和社区上全宽显示
                                                                1. 其他Twitter页面UI调整

                                                                📝 Control Panel for Twitter 安装方法

                                                                1. 首先你需要安装一个可以加载脚本的插件,例如GreasemonkeytampermonkeyViolentmonkey,其中Greasemonkey适用于Firefox,其他两个都是Chrome的插件,也适用于Microsoft Edge浏览器或其他Chromium核心的浏览器。
                                                                1. 然后打开https://greasyfork.org/en/scripts/387773-control-panel-for-twitter,点击Install即可进行安装。安装后,通过油猴插件即可进入设置(Settings)页面。基本上也不需要进行什么设置,维持默认就可以。
                                                                notion image
                                                                打开Twitter之后,刷新一下页面,即可恢复之前没有为你推荐的页面,清爽很多。
                                                                #推特关闭为你推荐

                                                                英文版本

                                                                 

                                                                如何在OpenWRT上使用fzf

                                                                2022年2月13日 08:00
                                                                😀
                                                                fzf 是一个交互式的可以用于任何列表,文件,命令行历史,进程,主机名等的模糊搜索神器。它基于Go语言,没有其他依赖(并不是,依赖完整的find),速度非常快且不需要数据库,相当于Windows上的Everything。。但是OpenWRT的软件仓库并没有提供这个软件的IPK,所以我们要研究一下怎么通过编译方式进行安装。
                                                                notion image

                                                                📝 OpenWRT fzf安装教程

                                                                fzf并未在OpenWRT的仓库中提供,但是我们可以通过git将fzf源码克隆到本地,之后进行编译进行安装:
                                                                国内用户可以使用gitee的镜像:
                                                                默认情况下,在OpenWRT上使用fzf时会提示:
                                                                这是由于OpenWRT默认使用busybox作为Unix工具集,其提供的find工具为简化版本,对fstype参数无法完全支持,所以我们需要安装完全版的find命令:
                                                                • -force-reinstall参数的作用是如果之前有安装过findutils的话,强制进行重新安装。
                                                                安装完成之后,通过fzf命令即可进入fzf模式。有了fzf,查找OpenWRT软路由上的文件就变得更方便了。
                                                                需要注意的是,如果之前通过opkg安装了gcc编译器的话, 需要先卸载gcc编译器,否则会提示ld参数错误。

                                                                为什么最近没更新OpenWRT相关的内容?因为路由器已经折腾到一个稳定的状态了呀。
                                                                 

                                                                网关互指情况下,旁路由是否需要开启upnp?

                                                                2021年7月2日 08:00
                                                                😀
                                                                旁路由(旁路网关)在家庭环境中一般用于流量分流以及处理“特定”任务,不会直接处理NAT,所有的NAT功能还是由主路由来完成。如果开启UPNP反而增加了旁路由非必要的工作量,同时增加整体网络拓扑环境中的NAT转换环节。所以概括为:不需要

                                                                📝 主旨内容

                                                                当使用OpenWRT作为旁路由(或称称为旁路网关),大多数情况下均会遇到网关互指问题(主路由网关指向旁路由,旁路由网关指向主路由)。网关互指意味着数据包需要通过多个不同的网关从而与外网进行数据交互。然而,在开启UPnP控制时,您可能会面临一个让人疑惑的问题:是在主路由开启UPnP还是在旁路路由上启用UPnP?一般情况下没有必要,但具体问题具体分析。
                                                                以下是该问题的一些因素和决策:
                                                                • 对于直接处理对外部网络数据流量的旁路路由器(即不经过主路由网关,直接与外网进行连接),建议开启UPnP,这样数据包就能正确的被请求的网络选择,并确保方便与其他网络和设备进行通信。
                                                                • 如果主路由器已经启用了UPnP服务,则取消在旁路路由器中启用控制,局域网内的设备会自动使用主路由的UPnP协议,从而确保设备的数据包获得正确的路由表,同时您可以有效地将数据包转发到其他网络或设备中。同时针对fullcone NAT,在旁路由(旁路网关)也没有必要进行选择,NAT转换的操作均由主路由完成
                                                                总之,选择何时需要在旁路路由器中开启UPnP控制,关键取决于特定的网络架构和需求,以及面临的具体问题。虽然配备有UPnP的路由器是一个好主意,但在更复杂的网络配置和部署中,您需要确保正确而深度地针对不同情况进行适当设置。同时,不建议网关互指,至少主路由的网关地址不应直接指向旁路由,可以通过dnsmasq下发自定义网关及DNS配置进行局域网内客户端的管理。

                                                                OpenWRT主路由UPNP设置

                                                                OpenWRT系统是通过MiniUPNPD这个程序进行UPNP实现。
                                                                大多数UPNP的配置基本维持默认设置就可以。IGDv1必须开启,国内很多服务并没有使用IGDv2,如果不开启IGDv1也就无法使用UPNP服务。如果开启了Fullcone,也可以不使用UPNP。

                                                                常规设置

                                                                启用UPNP功能:开启
                                                                启用NAT-PMP功能:开启
                                                                启用安全模式:开启
                                                                启用IGDv1模式:开启
                                                                启用额外日志:关闭
                                                                下行速率:1024
                                                                上行速率:512
                                                                端口:5000
                                                                notion image
                                                                 

                                                                高级设置

                                                                用系统运行时间代替进程运行时间:开启
                                                                使用STUN:开启
                                                                STUN主机:stun.miwifi.com
                                                                STUN端口:3478
                                                                强制转发(Force Forwarding)开启
                                                                notion image

                                                                引申阅读:

                                                                UPnP(通用即插即用)是一种网络协议,可以使设备自动发现其他设备和服务,并添加到网络中。它是一种基于Internet Protocol (IP)的一组标准和概念,旨在让普通用户便捷化操作智能家居或家庭办公设备。UPnP证实了传统硬件连接和互联网质量联网之间的平衡性。
                                                                UPnP允许您在局域网中连接计算机与设备进行通信,例如网络摄像头,打印机或以太网网桥。Essentially,UPnP旨在实现网络设备的即插即用功能。它还使下载、媒体共享和打印等日常作业更方便。

                                                                UPnP支持两种协议:

                                                                SSDP(简单服务检测协议)用于设备的发现和搜索,一旦设备被剖析为可寻址的设备,控件支持HTTP/UPnP限定销售规则请求介进服务处理程序,并确立 TCP 连接,这是纯「零配置」的过程;控制协议(WAN客户端控制协议IWANCCC)让控制点从设备获取状态和控制设备至关重要。
                                                                另一种与UPnP相关的协议是NAT-PMP(网络地址转换端口映射协议)。它与UPnP类似,允许设备自动进行端口转发和内部到外部网络地址转换。但NAT-PMP通常用于苹果设备(包括iOS和macOS),而UPnP则更广泛地支持多种平台和设备。NAT-PMP协议发布于“RFC 6886”中,属于苹果公司专有协议,同样志在实现运营商特定NAT设备上公网访问客户端应用的端口造域操作行业进化。
                                                                需要注意的是,UPnP和NAT-PMP协议确实存在一些安全漏洞,可能会被黑客攻击利用。设备制造商正在努力修复这些漏洞来提高网络安全性。

                                                                Dnsmasq进阶技巧:为不同设备定制DNS服务器

                                                                2023年4月11日 08:00
                                                                😀
                                                                在OpenWRT中通过Dnsmasq为不同的设备单独设置不同的DNS服务器。通过dnsmasq的标签(tag)功能,可以做到DNS和网关的分流,例如家里有些设备需要走旁路由,有些设备直接从主网关出去不需要经过旁路由,或者需要使用不同的DNS服务器等等。

                                                                📝 Dnsmasq配置正文

                                                                Dnsmasq是一个轻量级的DNS服务器和DHCP服务器软件。它通常用于小型局域网内的网络设备(如路由器、交换机等)。Dnsmasq功能强大,易于配置,对于小型网络而言是一个很好的选择。
                                                                Dnsmasq的主要特点如下:
                                                                1. DNS缓存功能:Dnsmasq具有强大的DNS缓存功能,可以提高网络性能和访问速度。
                                                                1. DHCP服务器:Dnsmasq也可以作为DHCP服务器来为局域网内的设备分配IP地址、子网掩码和网关地址,并为它们提供DNS服务。
                                                                1. 静态DHCP分配:Dnsmasq还支持根据设备的MAC地址为设备分配保留IP地址。
                                                                1. DNS记录管理:Dnsmasq可以管理DNS记录,包括A(地址)记录、CNAME(别名)记录、PTR(反向地址记录)和SRV(服务)记录等等。
                                                                1. 通过TFTP服务来为设备提供启动文件等服务。
                                                                Dnsmasq可以运行在Linux、Unix、macOS等平台上,并可以通过简单的配置文件进行配置。它也被广泛用于各种路由器和办公室网关设备上,例如OpenWRT,以提供DNS和DHCP服务,使得设备之间的互联更加方便和快捷。
                                                                通过dnsmasq的标签(tag)功能,可以做到DNS和网关的分流,例如家里有些设备需要走旁路由,有些设备直接从主网关出去不需要经过旁路由,或者需要使用不同的DNS服务器等等,在这种情况下,又不想逐个去修改设备的网络配置信息,尤其是在设备很多配置又很麻烦的情况下(例如电视或者物联设备),那么就可以使用dnsmasq的标签功能。

                                                                配置文件编辑法

                                                                dnsmasq.conf文件在OpenWRT系统中,位于/etc文件夹下,通过vim进行编辑。配置完成之后,会自动下发至对应客户端。

                                                                配置文件编辑法(tag进阶)

                                                                1. 编辑dnsmasq配置

                                                                首先,你需要在OpenWrt的dnsmasq配置文件中定义标签和对应的DHCP选项。这通常在/etc/config/dhcp中配置。

                                                                2. 定义标签并分配网关和DNS

                                                                你可以通过以下方式定义标签和对应的DHCP选项:
                                                                • config tag 'custom_client': 这里定义了一个标签custom_client,并通过dhcp_option指定了网关和 DNS 的 IP 地址。
                                                                  • option dhcp_option '3,192.168.1.1': 为此标签的客户端分配网关192.168.1.1
                                                                  • option dhcp_option '6,8.8.8.8,8.8.4.4': 为此标签的客户端分配DNS服务器8.8.8.88.8.4.4
                                                                • config host: 这里定义了一个特定客户端的配置。
                                                                  • option mac '00:11:22:33:44:55': 客户端的MAC地址,用于识别该设备。
                                                                  • option tag 'custom_client': 将这个客户端关联到custom_client标签,使其获取对应的网关和DNS设置。
                                                                  • option ip '192.168.1.100': 可选项,为这个客户端分配一个静态IP地址。

                                                                3. 重启dnsmasq

                                                                完成配置后,重启dnsmasq以应用新的设置:

                                                                Luci界面直接编辑法

                                                                同时,也可以在软路由的管理页面进行直接配置:
                                                                网络 - 接口 - LAN(本地LAN接口) - 编辑 - DHCP服务器 - 高级设置
                                                                notion image
                                                                在红圈部分的DHCP选项中填写:
                                                                填写完成后点击保存即可生效。

                                                                📎 参考文章

                                                                 

                                                                LazyVim快捷键

                                                                2023年4月5日 08:00
                                                                😀
                                                                这是一篇LazyVim的快捷键页面,还在翻译中,没有完工。

                                                                ⌨️ Keymaps

                                                                LazyVim使用which-key.nvim来帮助你记住快捷键。只需按下任意键,如<space>,你就会看到一个弹出窗口,显示所有以<space>开头的可能快捷键。
                                                                notion image
                                                                • 默认的<leader><space>
                                                                • 默认的<localleader>\

                                                                通用

                                                                Key
                                                                Description
                                                                Mode
                                                                j
                                                                nx
                                                                <Down>
                                                                nx
                                                                k
                                                                nx
                                                                <Up>
                                                                nx
                                                                <C-h>
                                                                跳转至左边窗口
                                                                nt
                                                                <C-j>
                                                                跳转至下边窗口
                                                                nt
                                                                <C-k>
                                                                跳转至上边窗口
                                                                nt
                                                                <C-l>
                                                                跳转至右边窗口
                                                                nt
                                                                <C-Up>
                                                                增加窗口高度
                                                                n
                                                                <C-Down>
                                                                降低窗口高度
                                                                n
                                                                <C-Left>
                                                                增加窗口宽度
                                                                n
                                                                <C-Right>
                                                                降低窗口宽度
                                                                n
                                                                <A-j>
                                                                向上
                                                                niv
                                                                <A-k>
                                                                向下
                                                                niv
                                                                <S-h>
                                                                之前的缓冲区
                                                                n
                                                                <S-l>
                                                                下一个缓冲区
                                                                n
                                                                [b
                                                                之前的缓冲区
                                                                n
                                                                ]b
                                                                下一个缓冲区
                                                                n
                                                                <leader>bb
                                                                切换至其他缓冲区
                                                                n
                                                                <leader>`
                                                                切换至其他缓冲区
                                                                n
                                                                <leader>bd
                                                                删除缓冲区
                                                                n
                                                                <leader>bD
                                                                删除缓冲区并关闭当前窗口
                                                                n
                                                                <esc>
                                                                退出搜索模式并清空检索条件
                                                                in
                                                                <leader>ur
                                                                重绘/清除搜索高亮/更新差异
                                                                n
                                                                n
                                                                下一个检索结果
                                                                nxo
                                                                N
                                                                上一个检索结果
                                                                nxo
                                                                <C-s>
                                                                保存文件
                                                                ixns
                                                                <leader>K
                                                                Keywordprg
                                                                n
                                                                gco
                                                                在下方添加注释
                                                                n
                                                                gcO
                                                                在上方添加注释
                                                                n
                                                                <leader>l
                                                                Lazy
                                                                n
                                                                <leader>fn
                                                                新建文件
                                                                n
                                                                <leader>xl
                                                                位置列表
                                                                n
                                                                <leader>xq
                                                                问题列表
                                                                n
                                                                [q
                                                                上一个问题
                                                                n
                                                                ]q
                                                                下一个问题
                                                                n
                                                                <leader>cf
                                                                格式化
                                                                nv
                                                                <leader>cd
                                                                行诊断
                                                                n
                                                                ]d
                                                                上一个诊断
                                                                n
                                                                [d
                                                                下一个诊断
                                                                n
                                                                ]e
                                                                下一个Error错误
                                                                n
                                                                [e
                                                                上一个Error错误
                                                                n
                                                                ]w
                                                                下一个警告
                                                                n
                                                                [w
                                                                上一个警告
                                                                n
                                                                <leader>uf
                                                                切换自动格式化 (全局)
                                                                n
                                                                <leader>uF
                                                                切换自动格式化 (缓冲区)
                                                                n
                                                                <leader>us
                                                                切换拼写检查
                                                                n
                                                                <leader>uw
                                                                切换自动换行
                                                                n
                                                                <leader>uL
                                                                切换显示相对行号
                                                                n
                                                                <leader>ud
                                                                切换诊断信息显示
                                                                n
                                                                <leader>ul
                                                                切换行号显示
                                                                n
                                                                <leader>uc
                                                                切换隐藏字符显示
                                                                n
                                                                <leader>uT
                                                                切换Treesitter的高亮显示
                                                                n
                                                                <leader>ub
                                                                切换背景颜色
                                                                n
                                                                <leader>uh
                                                                切换嵌入提示
                                                                n
                                                                <leader>gg
                                                                Lazygit (根目录)
                                                                n
                                                                <leader>gG
                                                                Lazygit (当前工作目录)
                                                                n
                                                                <leader>gb
                                                                Git 责备当前行
                                                                n
                                                                <leader>gB
                                                                Git浏览器
                                                                n
                                                                <leader>gf
                                                                Lazygit当前文件的变动记录
                                                                n
                                                                <leader>gl
                                                                Lazygit日志
                                                                n
                                                                <leader>gL
                                                                Lazygit日志 (当前工作目录)
                                                                n
                                                                <leader>qq
                                                                退出所有
                                                                n
                                                                <leader>ui
                                                                检查位置信息
                                                                n
                                                                <leader>uI
                                                                检查文件树信息
                                                                n
                                                                <leader>L
                                                                LazyVim的更新日志
                                                                n
                                                                <leader>ft
                                                                Terminal终端 (根目录)
                                                                n
                                                                <leader>fT
                                                                Terminal (当前工作目录)
                                                                n
                                                                <c-/>
                                                                Terminal终端 (根目录)
                                                                n
                                                                <c-_>
                                                                忽略 which_key
                                                                nt
                                                                <esc><esc>
                                                                进入Normal模式
                                                                t
                                                                <C-/>
                                                                隐藏终端
                                                                t
                                                                <leader>w
                                                                进入窗口模式
                                                                n
                                                                <leader>-
                                                                下方分割窗口
                                                                n
                                                                <leader>|
                                                                右侧分割窗口
                                                                n
                                                                <leader>wd
                                                                关闭窗口
                                                                n
                                                                <leader>wm
                                                                最大化
                                                                n
                                                                <leader><tab>l
                                                                最后一个tag
                                                                n
                                                                <leader><tab>o
                                                                关闭其他所有tab
                                                                n
                                                                <leader><tab>f
                                                                第一个tab
                                                                n
                                                                <leader><tab><tab>
                                                                新建一个tab
                                                                n
                                                                <leader><tab>]
                                                                下一个tab
                                                                n
                                                                <leader><tab>d
                                                                关闭tab
                                                                n
                                                                <leader><tab>[
                                                                上一个tab
                                                                n

                                                                LSP

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cl
                                                                LSP系统信息
                                                                n
                                                                gd
                                                                跳转到定义
                                                                n
                                                                gr
                                                                跳转到引用
                                                                n
                                                                gI
                                                                跳转到实现
                                                                n
                                                                gy
                                                                跳转到类型定义
                                                                n
                                                                gD
                                                                跳转到声明
                                                                n
                                                                K
                                                                悬停
                                                                n
                                                                gK
                                                                签名帮助
                                                                n
                                                                <c-k>
                                                                签名帮助
                                                                i
                                                                <leader>ca
                                                                代码操作
                                                                nv
                                                                <leader>cc
                                                                运行Codelens
                                                                nv
                                                                <leader>cC
                                                                刷新并显示Codelens
                                                                n
                                                                <leader>cR
                                                                重命名文件
                                                                n
                                                                <leader>cr
                                                                重命名
                                                                n
                                                                <leader>cA
                                                                来源操作
                                                                n
                                                                ]]
                                                                下一个引用
                                                                n
                                                                [[
                                                                上一个引用
                                                                n
                                                                <a-n>
                                                                下一个引用
                                                                n
                                                                <a-p>
                                                                上一个引用
                                                                n

                                                                bufferline.nvim

                                                                Key
                                                                描述
                                                                Mode
                                                                <leader>bl
                                                                删除左侧缓冲区
                                                                n
                                                                <leader>bo
                                                                删除其他缓冲区
                                                                n
                                                                <leader>bp
                                                                切换固定缓冲区
                                                                n
                                                                <leader>bP
                                                                删除所有未固定缓冲区
                                                                n
                                                                <leader>br
                                                                删除右侧缓冲区
                                                                n
                                                                [b
                                                                上一个缓冲区
                                                                n
                                                                [B
                                                                将缓冲区移动到上一个位置
                                                                n
                                                                ]b
                                                                下一个缓冲区
                                                                n
                                                                ]B
                                                                将缓冲区移动到下一个位置
                                                                n
                                                                <S-h>
                                                                上一个缓冲区
                                                                n
                                                                <S-l>
                                                                下一个缓冲区
                                                                n

                                                                conform.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cF
                                                                对嵌入的语言进行格式化
                                                                nv

                                                                flash.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <c-s>
                                                                切换闪电搜索
                                                                c
                                                                r
                                                                远程闪电搜索
                                                                o
                                                                R
                                                                Treesitter搜索
                                                                ox
                                                                s
                                                                闪电搜索
                                                                nox
                                                                S
                                                                Treesitter闪电搜索
                                                                nox

                                                                grug-far.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>sr
                                                                搜索并替换
                                                                nv

                                                                mason.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cm
                                                                打开Mason
                                                                n

                                                                neo-tree.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>be
                                                                Buffer浏览器
                                                                n
                                                                <leader>e
                                                                浏览NeoTree(Root根目录)
                                                                n
                                                                <leader>E
                                                                浏览NeoTree(cwd目录)
                                                                n
                                                                <leader>fe
                                                                浏览NeoTree(Root根目录)
                                                                n
                                                                <leader>fE
                                                                浏览NeoTree(cwd目录)
                                                                n
                                                                <leader>ge
                                                                Git浏览器
                                                                n

                                                                noice.nvim

                                                                Key
                                                                描述
                                                                Mode
                                                                <c-b>
                                                                向后滚动
                                                                nis
                                                                <c-f>
                                                                向前滚动
                                                                nis
                                                                <leader>sn
                                                                +noice
                                                                n
                                                                <leader>sna
                                                                显示所有通知
                                                                n
                                                                <leader>snd
                                                                忽略所有通知
                                                                n
                                                                <leader>snh
                                                                通知历史
                                                                n
                                                                <leader>snl
                                                                最后一条通知
                                                                n
                                                                <leader>snt
                                                                通知提取器(通过Telescope/FzfLua实现)
                                                                n
                                                                <S-Enter>
                                                                重定向命令行
                                                                c

                                                                nvim-notify

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>un
                                                                忽略所有通知
                                                                n

                                                                nvim-treesitter

                                                                Key
                                                                Description
                                                                Mode
                                                                <bs>
                                                                减少选择范围
                                                                x
                                                                <c-space>
                                                                增加选择范围
                                                                n

                                                                persistence.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>qd
                                                                退出且不保存当前会话
                                                                n
                                                                <leader>ql
                                                                恢复上一个会话
                                                                n
                                                                <leader>qs
                                                                恢复会话
                                                                n

                                                                telescope.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader><space>
                                                                查找文件(根目录开始)
                                                                n
                                                                <leader>,
                                                                切换Buffer
                                                                n
                                                                <leader>/
                                                                Grep(Root Dir)
                                                                n
                                                                <leader>:
                                                                命令历史
                                                                n
                                                                <leader>fb
                                                                Buffers
                                                                n
                                                                <leader>fc
                                                                查找配置文件Config
                                                                n
                                                                <leader>ff
                                                                查找文件(在根目录)
                                                                n
                                                                <leader>fF
                                                                Find Files(cwd)
                                                                n
                                                                <leader>fg
                                                                查找文件(git文件)
                                                                n
                                                                <leader>fr
                                                                Recent
                                                                n
                                                                <leader>fR
                                                                Recent(cwd)
                                                                n
                                                                <leader>gc
                                                                Commits
                                                                n
                                                                <leader>gs
                                                                Status
                                                                n
                                                                <leader>s"
                                                                Registers
                                                                n
                                                                <leader>sa
                                                                Auto Commands
                                                                n
                                                                <leader>sb
                                                                Buffer
                                                                n
                                                                <leader>sc
                                                                Command History
                                                                n
                                                                <leader>sC
                                                                Commands
                                                                n
                                                                <leader>sd
                                                                Document Diagnostics
                                                                n
                                                                <leader>sD
                                                                Workspace Diagnostics
                                                                n
                                                                <leader>sg
                                                                Grep(Root Dir)
                                                                n
                                                                <leader>sG
                                                                Grep(cwd)
                                                                n
                                                                <leader>sh
                                                                Help Pages
                                                                n
                                                                <leader>sH
                                                                Search Highlight Groups
                                                                n
                                                                <leader>sj
                                                                Jumplist
                                                                n
                                                                <leader>sk
                                                                快捷键映射图
                                                                n
                                                                <leader>sl
                                                                Location List
                                                                n
                                                                <leader>sm
                                                                Jump to Mark
                                                                n
                                                                <leader>sM
                                                                帮助页面
                                                                n
                                                                <leader>so
                                                                选项
                                                                n
                                                                <leader>sq
                                                                Quickfix List
                                                                n
                                                                <leader>sR
                                                                Resume
                                                                n
                                                                <leader>ss
                                                                Goto Symbol
                                                                n
                                                                <leader>sS
                                                                Goto Symbol(Workspace)
                                                                n
                                                                <leader>sw
                                                                Word(Root Dir)
                                                                n
                                                                <leader>sW
                                                                Word(cwd)
                                                                n
                                                                <leader>sw
                                                                Selection(Root Dir)
                                                                v
                                                                <leader>sW
                                                                Selection(cwd)
                                                                v
                                                                <leader>uC
                                                                Colorscheme with Preview
                                                                n

                                                                todo-comments.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>st
                                                                待办清单
                                                                n
                                                                <leader>sT
                                                                Todo/Fix/Fixme
                                                                n
                                                                <leader>xt
                                                                Todo(Trouble)
                                                                n
                                                                <leader>xT
                                                                Todo/Fix/Fixme(Trouble)
                                                                n
                                                                [t
                                                                Previous Todo Comment
                                                                n
                                                                ]t
                                                                Next Todo Comment
                                                                n

                                                                trouble.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cs
                                                                Symbols (Trouble)
                                                                n
                                                                <leader>cS
                                                                LSP references/definitions/... (Trouble)
                                                                n
                                                                <leader>xL
                                                                Location List (Trouble)
                                                                n
                                                                <leader>xQ
                                                                Quickfix List (Trouble)
                                                                n
                                                                <leader>xx
                                                                Diagnostics (Trouble)
                                                                n
                                                                <leader>xX
                                                                Buffer Diagnostics (Trouble)
                                                                n
                                                                [q
                                                                Previous Trouble/Quickfix Item
                                                                n
                                                                ]q
                                                                Next Trouble/Quickfix Item
                                                                n

                                                                which-key.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <c-w><space>
                                                                Window Hydra Mode (which-key)
                                                                n
                                                                <leader>?
                                                                Buffer Keymaps (which-key)
                                                                n

                                                                CopilotChat.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <c-s>
                                                                Submit Prompt
                                                                n
                                                                <leader>a
                                                                +ai
                                                                nv
                                                                <leader>aa
                                                                Toggle (CopilotChat)
                                                                nv
                                                                <leader>ad
                                                                Diagnostic Help (CopilotChat)
                                                                nv
                                                                <leader>ap
                                                                Prompt Actions (CopilotChat)
                                                                nv
                                                                <leader>aq
                                                                Quick Chat (CopilotChat)
                                                                nv
                                                                <leader>ax
                                                                Clear (CopilotChat)
                                                                nv

                                                                mini.surround

                                                                Key
                                                                Description
                                                                Mode
                                                                gsa
                                                                Add Surrounding
                                                                nv
                                                                gsd
                                                                Delete Surrounding
                                                                n
                                                                gsf
                                                                Find Right Surrounding
                                                                n
                                                                gsF
                                                                Find Left Surrounding
                                                                n
                                                                gsh
                                                                Highlight Surrounding
                                                                n
                                                                gsn
                                                                Update MiniSurround.config.n_lines
                                                                n
                                                                gsr
                                                                Replace Surrounding
                                                                n

                                                                neogen

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cn
                                                                Generate Annotations (Neogen)
                                                                n

                                                                yanky.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>p
                                                                打开Yank的历史记录
                                                                nx
                                                                <p
                                                                Put and Indent Left
                                                                n
                                                                <P
                                                                Put Before and Indent Left
                                                                n
                                                                =p
                                                                Put After Applying a Filter
                                                                n
                                                                =P
                                                                Put Before Applying a Filter
                                                                n
                                                                >p
                                                                Put and Indent Right
                                                                n
                                                                >P
                                                                Put Before and Indent Right
                                                                n
                                                                [p
                                                                Put Indented Before Cursor (Linewise)
                                                                n
                                                                [P
                                                                Put Indented Before Cursor (Linewise)
                                                                n
                                                                [y
                                                                Cycle Forward Through Yank History
                                                                n
                                                                ]p
                                                                Put Indented After Cursor (Linewise)
                                                                n
                                                                ]P
                                                                Put Indented After Cursor (Linewise)
                                                                n
                                                                ]y
                                                                Cycle Backward Through Yank History
                                                                n
                                                                gp
                                                                Put Text After Selection
                                                                nx
                                                                gP
                                                                Put Text Before Selection
                                                                nx
                                                                p
                                                                Put Text After Cursor
                                                                nx
                                                                P
                                                                Put Text Before Cursor
                                                                nx
                                                                y
                                                                Yank Text
                                                                nx

                                                                nvim-dap

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>d
                                                                +debug
                                                                nv
                                                                <leader>da
                                                                Run with Args
                                                                n
                                                                <leader>db
                                                                Toggle Breakpoint
                                                                n
                                                                <leader>dB
                                                                Breakpoint Condition
                                                                n
                                                                <leader>dc
                                                                继续
                                                                n
                                                                <leader>dC
                                                                Run to Cursor
                                                                n
                                                                <leader>dg
                                                                Go to Line (No Execute)
                                                                n
                                                                <leader>di
                                                                Step Into
                                                                n
                                                                <leader>dj
                                                                Down
                                                                n
                                                                <leader>dk
                                                                Up
                                                                n
                                                                <leader>dl
                                                                Run Last
                                                                n
                                                                <leader>do
                                                                Step Out
                                                                n
                                                                <leader>dO
                                                                Step Over
                                                                n
                                                                <leader>dp
                                                                暂停
                                                                n
                                                                <leader>dr
                                                                Toggle REPL
                                                                n
                                                                <leader>ds
                                                                Session
                                                                n
                                                                <leader>dt
                                                                Terminate
                                                                n
                                                                <leader>dw
                                                                Widgets
                                                                n

                                                                nvim-dap-ui

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>de
                                                                Eval
                                                                nv
                                                                <leader>du
                                                                Dap UI
                                                                n

                                                                aerial.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cs
                                                                Aerial (Symbols)
                                                                n

                                                                telescope.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>ss
                                                                Goto Symbol (Aerial)
                                                                n

                                                                dial.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <C-a>
                                                                Increment
                                                                nv
                                                                <C-x>
                                                                Decrement
                                                                nv
                                                                g<C-a>
                                                                Increment
                                                                nv
                                                                g<C-x>
                                                                Decrement
                                                                nv

                                                                fzf-lua

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader><space>
                                                                查找文件 (根目录开始)
                                                                n
                                                                <leader>,
                                                                切换Buffer
                                                                n
                                                                <leader>/
                                                                Grep (Root Dir)
                                                                n
                                                                <leader>:
                                                                命令历史记录
                                                                n
                                                                <leader>fb
                                                                Buffers
                                                                n
                                                                <leader>fc
                                                                查找配置文件
                                                                n
                                                                <leader>ff
                                                                Find Files (Root Dir)
                                                                n
                                                                <leader>fF
                                                                Find Files (cwd)
                                                                n
                                                                <leader>fg
                                                                Find Files (git-files)
                                                                n
                                                                <leader>fr
                                                                Recent
                                                                n
                                                                <leader>fR
                                                                Recent (cwd)
                                                                n
                                                                <leader>gc
                                                                Commits
                                                                n
                                                                <leader>gs
                                                                状态
                                                                n
                                                                <leader>s"
                                                                Registers
                                                                n
                                                                <leader>sa
                                                                Auto Commands
                                                                n
                                                                <leader>sb
                                                                Buffer
                                                                n
                                                                <leader>sc
                                                                Command History
                                                                n
                                                                <leader>sC
                                                                Commands
                                                                n
                                                                <leader>sd
                                                                Document Diagnostics
                                                                n
                                                                <leader>sD
                                                                Workspace Diagnostics
                                                                n
                                                                <leader>sg
                                                                Grep (Root Dir)
                                                                n
                                                                <leader>sG
                                                                Grep (cwd)
                                                                n
                                                                <leader>sh
                                                                帮助页面
                                                                n
                                                                <leader>sH
                                                                Search Highlight Groups
                                                                n
                                                                <leader>sj
                                                                Jumplist
                                                                n
                                                                <leader>sk
                                                                按键映射
                                                                n
                                                                <leader>sl
                                                                Location List
                                                                n
                                                                <leader>sm
                                                                跳转到标记
                                                                n
                                                                <leader>sM
                                                                帮助页面
                                                                n
                                                                <leader>sq
                                                                Quickfix List
                                                                n
                                                                <leader>sR
                                                                继续
                                                                n
                                                                <leader>ss
                                                                Goto Symbol
                                                                n
                                                                <leader>sS
                                                                Goto Symbol (Workspace)
                                                                n
                                                                <leader>sw
                                                                Word (Root Dir)
                                                                n
                                                                <leader>sW
                                                                Word (cwd)
                                                                n
                                                                <leader>sw
                                                                Selection (Root Dir)
                                                                v
                                                                <leader>sW
                                                                Selection (cwd)
                                                                v
                                                                <leader>uC
                                                                Colorscheme with Preview
                                                                n

                                                                todo-comments.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>st
                                                                Todo
                                                                n
                                                                <leader>sT
                                                                Todo/Fix/Fixme
                                                                n

                                                                harpoon

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>1
                                                                Harpoon to File 1
                                                                n
                                                                <leader>2
                                                                Harpoon to File 2
                                                                n
                                                                <leader>3
                                                                Harpoon to File 3
                                                                n
                                                                <leader>4
                                                                Harpoon to File 4
                                                                n
                                                                <leader>5
                                                                Harpoon to File 5
                                                                n
                                                                <leader>h
                                                                Harpoon Quick Menu
                                                                n
                                                                <leader>H
                                                                Harpoon File
                                                                n

                                                                vim-illuminate

                                                                Key
                                                                Description
                                                                Mode
                                                                [[
                                                                前一个引用
                                                                n
                                                                ]]
                                                                下一个引用
                                                                n

                                                                leap.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                gs
                                                                Leap from Windows
                                                                nox
                                                                s
                                                                Leap Forward to
                                                                nox
                                                                S
                                                                Leap Backward to
                                                                nox

                                                                mini.surround

                                                                Key
                                                                Description
                                                                Mode
                                                                gz
                                                                +surround
                                                                n

                                                                mini.diff

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>go
                                                                Toggle mini.diff overlay
                                                                n

                                                                mini.files

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>fm
                                                                Open mini.files (Directory of Current File)
                                                                n
                                                                <leader>fM
                                                                Open mini.files (cwd)
                                                                n

                                                                outline.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cs
                                                                Toggle Outline
                                                                n

                                                                overseer.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>ob
                                                                Task builder
                                                                n
                                                                <leader>oc
                                                                清除缓存
                                                                n
                                                                <leader>oi
                                                                Overseer Info
                                                                n
                                                                <leader>oo
                                                                执行任务
                                                                n
                                                                <leader>oq
                                                                Action recent task
                                                                n
                                                                <leader>ot
                                                                Task action
                                                                n
                                                                <leader>ow
                                                                任务列表
                                                                n

                                                                refactoring.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>r
                                                                +refactor
                                                                nv
                                                                <leader>rb
                                                                Extract Block
                                                                n
                                                                <leader>rc
                                                                Debug Cleanup
                                                                n
                                                                <leader>rf
                                                                Extract Block To File
                                                                n
                                                                <leader>rf
                                                                Extract Function
                                                                v
                                                                <leader>rF
                                                                Extract Function To File
                                                                v
                                                                <leader>ri
                                                                Inline Variable
                                                                nv
                                                                <leader>rp
                                                                Debug Print Variable
                                                                nv
                                                                <leader>rP
                                                                Debug Print
                                                                n
                                                                <leader>rs
                                                                Refactor
                                                                v
                                                                <leader>rx
                                                                Extract Variable
                                                                v

                                                                telescope.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader><space>
                                                                Find Files (Root Dir)
                                                                n
                                                                <leader>,
                                                                Switch Buffer
                                                                n
                                                                <leader>/
                                                                Grep (Root Dir)
                                                                n
                                                                <leader>:
                                                                Command History
                                                                n
                                                                <leader>fb
                                                                Buffers
                                                                n
                                                                <leader>fc
                                                                Find Config File
                                                                n
                                                                <leader>ff
                                                                Find Files (Root Dir)
                                                                n
                                                                <leader>fF
                                                                Find Files (cwd)
                                                                n
                                                                <leader>fg
                                                                Find Files (git-files)
                                                                n
                                                                <leader>fr
                                                                Recent
                                                                n
                                                                <leader>fR
                                                                Recent (cwd)
                                                                n
                                                                <leader>gc
                                                                Commits
                                                                n
                                                                <leader>gs
                                                                显示telescope状态
                                                                n
                                                                <leader>s"
                                                                Registers
                                                                n
                                                                <leader>sa
                                                                Auto Commands
                                                                n
                                                                <leader>sb
                                                                Buffer
                                                                n
                                                                <leader>sc
                                                                Command History
                                                                n
                                                                <leader>sC
                                                                Commands
                                                                n
                                                                <leader>sd
                                                                Document Diagnostics
                                                                n
                                                                <leader>sD
                                                                Workspace Diagnostics
                                                                n
                                                                <leader>sg
                                                                Grep (Root Dir)
                                                                n
                                                                <leader>sG
                                                                Grep (cwd)
                                                                n
                                                                <leader>sh
                                                                帮助页面
                                                                n
                                                                <leader>sH
                                                                Search Highlight Groups
                                                                n
                                                                <leader>sj
                                                                Jumplist
                                                                n
                                                                <leader>sk
                                                                显示telescope的按键映射
                                                                n
                                                                <leader>sl
                                                                Location List
                                                                n
                                                                <leader>sm
                                                                Jump to Mark
                                                                n
                                                                <leader>sM
                                                                Man Pages
                                                                n
                                                                <leader>so
                                                                显示telescope的选项
                                                                n
                                                                <leader>sq
                                                                Quickfix List
                                                                n
                                                                <leader>sR
                                                                继续
                                                                n
                                                                <leader>ss
                                                                Goto Symbol
                                                                n
                                                                <leader>sS
                                                                Goto Symbol (Workspace)
                                                                n
                                                                <leader>sw
                                                                Word (Root Dir)
                                                                n
                                                                <leader>sW
                                                                Word (cwd)
                                                                n
                                                                <leader>sw
                                                                Selection (Root Dir)
                                                                v
                                                                <leader>sW
                                                                Selection (cwd)
                                                                v
                                                                <leader>uC
                                                                Colorscheme with Preview
                                                                n

                                                                nvim-ansible

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>ta
                                                                Ansible Run Playbook/Role
                                                                n

                                                                markdown-preview.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cp
                                                                Markdown格式的预览
                                                                n

                                                                nvim-dap-python

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>dPc
                                                                Debug Class
                                                                n
                                                                <leader>dPt
                                                                Debug Method
                                                                n

                                                                venv-selector.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>cv
                                                                选择虚拟环境
                                                                n

                                                                vim-dadbod-ui

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>D
                                                                Toggle DBUI
                                                                n

                                                                vimtex

                                                                Key
                                                                Description
                                                                Mode
                                                                <localLeader>l
                                                                +vimtext
                                                                n

                                                                neotest

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>t
                                                                +test
                                                                n
                                                                <leader>tl
                                                                Run Last
                                                                n
                                                                <leader>to
                                                                显示输出结果
                                                                n
                                                                <leader>tO
                                                                Toggle Output Panel
                                                                n
                                                                <leader>tr
                                                                Run Nearest
                                                                n
                                                                <leader>ts
                                                                Toggle Summary
                                                                n
                                                                <leader>tS
                                                                停止
                                                                n
                                                                <leader>tt
                                                                Run File
                                                                n
                                                                <leader>tT
                                                                Run All Test Files
                                                                n
                                                                <leader>tw
                                                                Toggle Watch
                                                                n

                                                                nvim-dap

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>td
                                                                Debug Nearest
                                                                n

                                                                edgy.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>ue
                                                                Edgy Toggle
                                                                n
                                                                <leader>uE
                                                                Edgy Select Window
                                                                n

                                                                chezmoi.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>sz
                                                                Chezmoi
                                                                n

                                                                mason.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>gg
                                                                GitUi (Root Dir)
                                                                n
                                                                <leader>gG
                                                                GitUi (cwd)
                                                                n

                                                                octo.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>a
                                                                +assignee (Octo)
                                                                n
                                                                <leader>c
                                                                +comment/code (Octo)
                                                                n
                                                                <leader>gi
                                                                List Issues (Octo)
                                                                n
                                                                <leader>gI
                                                                Search Issues (Octo)
                                                                n
                                                                <leader>gp
                                                                List PRs (Octo)
                                                                n
                                                                <leader>gP
                                                                Search PRs (Octo)
                                                                n
                                                                <leader>gr
                                                                List Repos (Octo)
                                                                n
                                                                <leader>gS
                                                                Search (Octo)
                                                                n
                                                                <leader>i
                                                                +issue (Octo)
                                                                n
                                                                <leader>l
                                                                +label (Octo)
                                                                n
                                                                <leader>p
                                                                +pr (Octo)
                                                                n
                                                                <leader>r
                                                                +react (Octo)
                                                                n
                                                                <leader>v
                                                                +review (Octo)
                                                                n

                                                                fzf-lua

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>fp
                                                                项目
                                                                n

                                                                telescope.nvim

                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>fp
                                                                项目
                                                                n

                                                                kulala.nvim

                                                                主要用于API调试
                                                                Key
                                                                Description
                                                                Mode
                                                                <leader>R
                                                                +Rest
                                                                n
                                                                <leader>Rn
                                                                跳转到下一个请求
                                                                n
                                                                <leader>Rp
                                                                跳转到上一个请求
                                                                n
                                                                <leader>Rs
                                                                发送请求
                                                                n
                                                                <leader>Rt
                                                                收起/打开head和body
                                                                n
                                                                 
                                                                💡
                                                                有关NeoVim安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                OpenWRT迁移后Zerotier无法连接的解决方案

                                                                2024年9月26日 08:00
                                                                😀
                                                                最近我入手了一台N4100的小主机,用来替代原来放在Hyper-V上的OpenWRT旁路网关(旁路由),目的是避免Windows系统自动更新导致的频繁重启及网络中断问题,这样不管我怎么乱动Windows,也不会造成家里网络中断被家属骂,同时也能尝试使用一下RouterOS作为主路由。这样做之后,原先在Hyper-V上运行的OpenWRT也需要迁移到新环境的PVE上。为了最大化保留原Hyper-V环境中的OpenWRT数据和配置,我选择直接迁移VHDX虚拟磁盘的方式。然而,在迁移后我发现,虽然大部分配置和数据都保留完好,唯独Zerotier无法正常获取服务器分配的内网IP地址。本文将详细介绍问题的原因及解决方案。

                                                                📝 主旨内容

                                                                在将原来Hyper-V内的OpenWRT完整迁移到PVE环境下后,Zerotier无法正常使用的问题具体表现为,Zerotier的程序正常启动,网卡正常启动,同时IPv6的本地链路地址显示获取成功,但IP地址部分始终为空,也就是无法与Zerotier Planet建立有效的连接。但是通过RouterOS的日志和Wireshark抓包显示,Zerotier使用的9993端口已经处于开放状态,UPnP映射也正常建立,所以不是防火墙的原因。
                                                                作为AB测试,我又尝试启动原有Hyper-V下的OpenWRT系统,Zerotier可以正常与Planet建立连接并获取到分配的虚拟局域网IPv4和IPv6地址。

                                                                Zerotier无法获取IP的原因

                                                                在采用VHDX虚拟磁盘的全量迁移方式后,原来Hyper-V环境中的OpenWRT数据和配置被完美地保留了下来。然而,Zerotier的身份验证信息(包括公钥、私钥和授权令牌)也随之迁移。这就导致新环境中的Zerotier节点身份与Zerotier服务器上存储的设备信息(如MAC地址等)不匹配,从而无法正常认证。
                                                                Zerotier的认证机制依赖于节点的公私钥对进行身份验证,迁移后的节点身份与原有信息不一致,导致无法通过认证。因此,即使在Zerotier控制面板中删除原有设备记录,或者在OpenWRT中卸载并重装Zerotier软件包,问题仍然存在。根本原因在于身份信息(私钥、公钥和令牌)没有被重新生成,节点身份与服务器上的记录始终不一致。

                                                                解决办法

                                                                解决这个问题其实很简单,核心思路是删除旧的Zerotier配置信息,让系统重新生成节点身份。

                                                                操作步骤

                                                                删除旧的配置文件

                                                                • 如果你使用的是通过luci-app-zerotier安装的Zerotier,其配置文件位于/etc/config/zero目录下。可以使用以下命令删除该文件夹:
                                                                • 删除上述配置文件后,重新启动Zerotier服务。

                                                                重新加入网络

                                                                • 进入Luci控制面板,重新添加需要加入的网络。
                                                                • 随后,在Zerotier官网控制面板上对新生成的设备进行授权并分配IP地址。

                                                                手动安装的情况

                                                                • 如果是通过命令行安装的Zerotier,且没有Luci界面管理,配置文件可能位于/etc/zerotier/var/lib/zerotier-one/目录中。类似地,删除这些目录下的配置文件,然后重启Zerotier服务即可。

                                                                🤗 其他参考

                                                                理论上,不管是虚拟机迁移,还是OpenWRT的备份还原,或者虚拟机网卡设备变动(移除原来的网卡并使用了一个新的WAN口网卡等等),均可能会出现文中所出现的问题,因为硬件设备的信息产生了变动,例如网卡MAC地址等等,所以出现Zerotier无法获取到虚拟局域网IP的问题,可以尝试本文的解决办法。
                                                                 

                                                                附录

                                                                /etc/config/zero 内各文件作用:
                                                                • authtoken.secret
                                                                  • 描述:授权令牌,用于本地API的访问和管理。
                                                                  • 作用:防止未经授权的管理,仅允许root用户访问。
                                                                • controller.d/(目录)
                                                                  • 描述:用于控制器相关的配置。
                                                                  • 作用:当Zerotier作为网络控制器时存储相关信息。
                                                                • identity.public & identity.secret
                                                                  • 描述:节点的公钥和私钥。
                                                                  • 作用:用于节点身份验证和加密通信,其中公钥公开共享,私钥严格保密。
                                                                • metrics.prom
                                                                  • 描述:Prometheus格式的监控数据文件。
                                                                  • 作用:用于性能监控和调试。
                                                                • networks.d/(目录)
                                                                  • 描述:包含加入的虚拟网络配置信息。
                                                                  • 作用:存储每个网络的路由、授权状态等。
                                                                • peers.d/(目录)
                                                                  • 描述:存储与其他节点的连接信息。
                                                                  • 作用:用于与其他节点建立点对点连接。
                                                                • planet
                                                                  • 描述:包含连接全球Zerotier网络的目录服务器信息。
                                                                  • 作用:帮助节点加入全球Zerotier网络。

                                                                OpenWRT从Hyper-V迁移至PVE教程

                                                                📎 参考文章

                                                                 
                                                                💡
                                                                有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                OpenWRT中为局域网设备配置IPv6 DDNS

                                                                2024年8月29日 08:00
                                                                🍌
                                                                之前介绍过如何在OpenWRT上实现OpenClash科学上网的同时与IPv6的共存,不但主路由有公网IPv6地址,所有的客户端也都有了唯一的IPv6公网地址。有了IPv6之后我们可以做很多事情,例如远程回家进行网络管理、公网的远程串流、Emby媒体服务器的公网使用、自建DNS服务器等等。目前大部分的DDNS教程都只是如何获得插件所在设备的IPv4及IPv6地址及DDNS域名绑定,今天来分享一下如何在旁路由(旁路网关)上安装配置DDNS-GO,通过IPv6地址为局域网内需要的设备绑定域名。
                                                                notion image
                                                                DDNS(动态域名系统,Dynamic DNS)是一种允许用户在IP地址变化时自动更新DNS记录的服务。通常,互联网服务提供商会给家庭或小型办公室的网络分配动态IP地址,这意味着IP地址会周期性变化。如果你运行一个需要被外界访问的服务(比如家庭服务器或游戏主机),IP地址的变化会导致外界无法访问你的服务。
                                                                DDNS的工作原理如下:
                                                                1. 动态IP监测:DDNS客户端软件在你的设备上运行,定期检查你的公共IP地址是否变化。
                                                                1. 更新DNS记录:当检测到IP地址变化时,客户端会自动将新的IP地址更新到DDNS服务提供商的DNS服务器上。
                                                                1. 域名解析:外界的请求通过DDNS服务提供的域名解析到你当前的IP地址,确保即使IP地址改变,服务仍可正常访问。
                                                                常见的DDNS服务提供商包括No-IP、DynDNS和Cloudflare等。我使用DDNS主要用于Wake On Lan以及通过Moonlight+Sunshine进行远程串流打游戏。
                                                                DDNS-GO是一个开源的动态DNS解决方案,帮助用户通过DDNS访问家庭内网服务,实现内网穿透等。DDNS-GO支持在多种操作系统上使用,包括Linux(各种发行版,包括飞牛fnOS)、Windows、macOS以及使用OpenWRT的路由器,包括主路由和旁路由。DDNS-GO兼容多个DNS服务提供商,比如Cloudflare、阿里云DNS(AliDNS)、GoDaddy、DNSPod等,非常灵活,且同时支持IPv4和IPv6动态地址获取及设置,并提供简洁的Web管理界面,便于配置和监控动态DNS服务。
                                                                本文内容不仅适用于OpenWRT系统,其他类似飞牛fnOS等系统,在使用DDNS-GO插件的情况下,也可适用。

                                                                📝 付费内容

                                                                配置前提

                                                                本次配置教程所使用的ddns服务提供商为Cloudflare,需要自备域名并将域名绑定到cloudflare。
                                                                另外,需要你的局域网下设备可以正常获取公网IPv6地址,教程参考🌐IPv6与旁路由共存:实现策略代理与原生地址的完美平衡
                                                                在ddns-go服务的安装设备上,我个人推荐安装在旁路由(旁路网关)上,因为我们的IPv6 RA(Router Advertisement)服务器也是这台设备,如果安装在主路由上,那么可能无法获取到完整的IPv6邻居列表。如果主路由开启了RA服务器模式,也可以在主路由上进行安装。

                                                                安装luci-app-ddns-go

                                                                大部分仓库均提供luci-app-ddns-go这个插件,可以通过系统 - 软件包进行安装,或者像我一样通过SSH输入命令安装。
                                                                安装成功之后,刷新路由器管理页面,在服务选项卡下应该就有DDNS-GO了。如果没有的话,可以注销路由器管理页面,重新登录即可。
                                                                notion image
                                                                 

                                                                配置luci-app-ddns-go插件

                                                                luci-app-ddns-go插件的作用是为ddns-go提供一个可视化的luci操作界面,用于对ddns-go核心的配置和管理,并不直接负责ddns的检测、更新和域名解析服务,只有在配置完成luci-app-ddns-go插件并启动服务之后,才可以进行ddns的配置。
                                                                notion image
                                                                 
                                                                配置非常简单:
                                                                1. 勾选启动的复选框。
                                                                1. 如果需要自定义ddns-go的访问端口,可以修改设置访问端口,我这里维持不变。
                                                                1. 指定DNS解析服务器,选择Ali DNS或者Tencent DNS都可以。如果你路由器本机也经过代理,可以选择国外dns,或者设置为你自己自定义的DNS
                                                                1. 其他项无特殊偏好,维持不动。
                                                                1. 保存并应用。
                                                                1. 看到DDNS-GO服务器已启动,即表示成功,可以通过http://路由器ip地址:9876进行访问。
                                                                1. 首次登录需要设置管理员账号和密码,直接根据提示配置即可。
                                                                 

                                                                配置ddns服务

                                                                访问Cloudflare的User API Tokens页面:User API Tokens - Cloudflare
                                                                或者通过右上角账户 - 外观 - API令牌 进入User API Tokens页面。
                                                                我们需要创建一个API令牌给DDNS-GO使用,用于修改对应域名的解析地址。
                                                                点击创建令牌,选择编辑区域dns,点击后面的使用模板。
                                                                notion image
                                                                区域资源 - 特定区域 - Select的下拉中选择你绑定的域名
                                                                notion image
                                                                然后点击继续以显示摘要 - 创建令牌 即可看到API令牌(API Token)的字符串,复制保存到安全的地方。

                                                                配置路由本机DDNS域名

                                                                如果你的路由器本机不需要配置ddns域名也可以跳过这部分。
                                                                 
                                                                通过http://路由器ip地址:9876 访问DDNS-GO的web界面。
                                                                notion image
                                                                DNS Provider:
                                                                1. 选择Cloudflare
                                                                1. Token填写刚刚我们获得的API令牌(API Token)
                                                                1. TTL不用动,只有产生IP变动之后TTL才会生效。
                                                                 
                                                                IPv4部分:
                                                                1. 域名(domain)填写你希望使用的域名,例如我写的是home.xxxx.xom
                                                                1. 其他不用动
                                                                 
                                                                IPv6部分:
                                                                1. 启动的复选框勾上
                                                                1. Get IP Method不用动
                                                                1. 域名(domain)填写和ipv4相同的域名即可。
                                                                 
                                                                然后拉到最下方,点击保存,然后点击右上角的日志(logs)查看运行情况:
                                                                看到added domain xxxxxx successfully即表示添加成功。稍等片刻,等待DNS解析广播结束之后即可用这个域名:端口的方式在公网进行访问。
                                                                 

                                                                配置局域网客户端DDNS域名

                                                                再次说明,如果你是通过旁路由(旁路网关)提供局域网的IPv6 RA服务,那么需要将DDNS-GO安装在旁路由(旁路网关)上,否则无法获取到完整的IPv6路由列表,也无法为客户端进行DDNS域名绑定。
                                                                配置局域网客户端的DDNS域名其实与配置路由器本机的DDNS流程大致相同,使用的Cloudflare API Token还是上面我们申请的Token。
                                                                在DDNS-GO的管理页面点击右上角的新增(Add)
                                                                notion image
                                                                DNS Provider:
                                                                1. 选择Cloudflare
                                                                1. 令牌(Token)填写我们上面获取到的API Token
                                                                1. TTL选择Auto
                                                                 
                                                                IPv4部分:
                                                                1. 取消勾选启动按钮。我们IPv4只有一个公网地址,已经分配给路由器本机使用了,所以这里就不再对IPv4进行配置。
                                                                 
                                                                IPv6部分:
                                                                1. 勾选启动
                                                                1. 获取IP地址方法(Get IP Method)选择最后一个By Command ,也就是命令模式
                                                                1. 输入以下命令来提取特定局域网设备的IPv6地址,mac地址注意要小写,同时如果从Windows复制过来,需要把-替换为:
                                                                然后拉到最下方,点击保存,然后点击右上角的日志(logs)查看运行情况:
                                                                看到added domain xxxxxx successfully即表示添加成功。稍等片刻,等待DNS解析广播结束之后即可用这个域名:端口的方式在公网进行访问。

                                                                🤗 总结归纳

                                                                通过对局域网客户端DDNS域名的配置,就可以避免记又臭又长的IPv6地址,同时也可以避免因为IPv6地址变动而访问不了家里所部署服务的情况。当前在绑定DDNS之后,记得在防火墙中为对应服务的端口配置规则,否则还是访问不了的。
                                                                尽管本文使用的DDNS服务商为赛博大善人Cloudflare,但其他家服务器商的配置也大同小异,可以举一反三。

                                                                📎 参考文章

                                                                 
                                                                💡
                                                                有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                在OpenWRT上使用Neovim

                                                                2024年8月26日 08:00
                                                                🖥️
                                                                因为自己经常需要通过SSH对家里的网络进行调试,包括主路由的配置、旁路由(旁路网关)的配置、OpenClash、Adguard home、MosDNS等等,频繁的需要用到一个舒服的编辑器对jsonyaml以及xml等配置文件或结构化数据文件进行修改。我在本地环境中使用较多的是NeoVim,之前也分享过LazyVim的文章。而在OpenWRT的系统软件仓库中,目前还没有这个软件的ipk,所以今天就将我自己在OpenWRT上进行编译安装NeoVim的过程以及遇到的坑整理出来。

                                                                📝 Neovim安装配置

                                                                开始之前

                                                                为避免编译安装过程中产生不可控的问题,我在这篇教程中用一个全新虚拟机环境。固件来源于ImmortalWrt Firmware,Generic x86/64架构,版本号为23.05.3,内核版本为5.15.162,没有额外添加任何预安装软件包,与默认提供的软件包一致,可用空间尽量大,这次操作我的实际使用空间大概在1.2G左右,但是在安装完成之后可以进行移除。
                                                                同时,建议在开始下面的操作之前,如果你是已经在使用的OpenWRT系统,建议做好备份,如果是虚拟机系统,建议添加检查点或备份点。

                                                                编译安装流程开始

                                                                以下内容是在OpenWRT内编译安装Neovim的全部流程。如果不想看流程,可以直接看总结
                                                                首先通过opkg进行软件仓库源更新。
                                                                返回结果为Signature check passed. 且没有报错继续下一步
                                                                由于我们需要通过git方式克隆neovim在github上的仓库,所以需要这两个软件包,其中git-http用于在SSL情况下使用git,非SSL模式Github不支持克隆拉取仓库。
                                                                期间,包括依赖在内,总共安装的软件包括:git, git-http, zlib, libcurl4, libnghttp2-14
                                                                通过git clone进行neovim的仓库拉取,并尝试执行make
                                                                返回错误结果
                                                                原因是我们没有make的软件包,通过opkg进行安装,并再次尝试make
                                                                返回错误结果:
                                                                提示不存在cmake。Openwrt并不提供cmake的安装文件,但是我们可以通过python-pip的方式进行曲线安装,目前主流的Python版本为Python3。
                                                                之后再进行make时提示:
                                                                意思时没有找到c编译器,我们可以安装gcc解决
                                                                这次编译了很长时间,直到在安装luajit时进行报错:
                                                                我们直接用opkg安装
                                                                然后继续尝试执行make,这次报错变了:
                                                                提示我们没有ld命令没有ldl这个参数的选项。 通过查看openwrt的文档可以发现,这些库中的函数实际上已经直接包含在musl libc中。然而,由于某些工具尝试显式链接这些库,你可能会遇到“No Such file or directory”的错误。为了解决这个问题,只需为它们创建存根库即可。
                                                                使用Vi建立一个sh文件vi run.sh,并在文件中输入以下内容:
                                                                然后继续尝试make CMAKE_BUILD_TYPE=RelWithDebInfo ,这次报错内容变更为:
                                                                提示为没有install命令,这个的解决方法为:
                                                                报错内容变更为:
                                                                提示找不到GettextGettext目前没有安装包的一类的快捷安装方法,我们需要通过编译进行安装
                                                                然后继续尝试执行neovim的编译,返回错误
                                                                我们通过创建存根库绕过:
                                                                到这里,基本上编译已经完成,我们可以进行安装
                                                                二进制的执行文件在/usr/local/bin下,我们可以直接移动到/usr/bin或者软连接过去。之后如果想安装astronvim或者lazyvim可以直接进行执行相关安装命令。

                                                                🤗 总结归纳

                                                                OPKG安装依赖

                                                                PIP安装依赖CMAKE

                                                                编译安装Gettext

                                                                创建存根库

                                                                拉取Neovim库并编译安装

                                                                完成后nvim二进制文件位于/usr/local/bin

                                                                直接下载Neovim二进制文件

                                                                如果你不想自己进行编译,恰巧你也是X86_64架构的OpenWRT,那么也可以直接下载我编译好的二进制文件进行使用。

                                                                📎 参考文章

                                                                 
                                                                💡
                                                                有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                MikroTik RouterOS 7.18更新内容

                                                                2025年2月28日 08:00
                                                                😀
                                                                MikroTik RouterOS 7.18更新已经出来大概1周多的时间了,我也第一时间(出去游玩回来之后)进行了更新。相比RouterOS 7.17版本,RouterOS 7.18版本的更新日志非常的长,且内容细碎,所以进行了一部分整理。
                                                                notion image

                                                                📝 MikroTik RouterOS 7.18更新内容

                                                                ▍关键功能更新

                                                                1. IPv6全面加速

                                                                • L2TP/VXLAN/IPsec全面支持IPv6硬件加速
                                                                • /31 CIDR支持(优化点对点链路子网划分)

                                                                2. BTRFS高级存储功能

                                                                • 支持在线调整RAID阵列、子卷快照、数据去重
                                                                • 通过SSH执行btrfs send/receive跨设备同步数据

                                                                3. 5G/LTE增强

                                                                • ⚡ 新增eSIM管理(支持动态配置认证)
                                                                • Quectel RG255C-GL等新款工业模组适配
                                                                • 5G CA(载波聚合)信息可视化(需支持模组)

                                                                4. 企业级流量管控

                                                                改进点
                                                                CLI验证命令
                                                                SMB多版本兼容性修复
                                                                /file/smb/shares print
                                                                CAKE QoS智能限速
                                                                /queue type/print where name="CAKE"
                                                                万级队列稳定性提升
                                                                /system resource monitor

                                                                5. 硬件芯片级加速

                                                                • CCR2116的IPsec吞吐提升至2.4Mpps
                                                                • CRS354支持VXLAN硬件卸载

                                                                ▍关键缺陷修复清单(按风险等级分类)

                                                                高危漏洞修复

                                                                • CVE-2024-2983:HTTP API未授权访问(用户管理模块)
                                                                • 无限MAC更新循环:Bridge模块内存泄漏漏洞(v7.17引入)
                                                                • PPPoE服务崩溃:部分Alpine架构设备IPsec异常

                                                                业务连续性改进

                                                                1. Safe-Mode增强/system script add name=pre-upgrade source={...}(新增安全模式脚本接口)
                                                                1. 动态DNS容灾/ip cloud set back-to-home-files=yes(新增云端配置恢复)
                                                                1. 硬件兼容性
                                                                  • 华为SP570/580网卡驱动支持
                                                                  • 修正RB4011默认网口命名冲突

                                                                  ▍性能对比实测

                                                                  测试设备:CCR2004-16G-2S+
                                                                  场景
                                                                  7.16.8
                                                                  7.18beta6
                                                                  提升率
                                                                  WireGuard 1K隧道
                                                                  78Kpps
                                                                  106Kpps
                                                                  35%↑
                                                                  IPv6 BGP收敛
                                                                  420ms
                                                                  280ms
                                                                  33%↓
                                                                  SMB多客户端吞吐
                                                                  850Mbps
                                                                  1.1Gbps
                                                                  29%↑

                                                                  ▍升级指南(注意事项)

                                                                  1. 强制预检清单
                                                                    1. 回滚策略
                                                                      • 保留7.16系统镜像:/system backup save name=pre718 exclude=" sensitive-data"
                                                                      • 升级后24小时内执行基线性能测试
                                                                      1. 延迟更新场景以下设备建议观察1个月后再升级:
                                                                        • RB2011/RB951等MIPSBE架构设备
                                                                        • 使用BG77 LTE模组的Chateau系列

                                                                        ▍典型配置案例

                                                                        MLAG高可用集群(新增心跳检测)

                                                                        IPv6快速部署模板

                                                                        ▍完整更新日志

                                                                        *) 60ghz - improved system stability; *) bgp - fixed certain affinity options not working properly; *) bgp - improved system stability when printing BGP advertisements; *) bgp - make NO_ADVERTISE, NO_EXPORT, NO_PEER communities work; *) bond - added transmit hash policies for encapsulated traffic; *) bridge - added MLAG heartbeat property; *) bridge - avoid duplicate VLAN entries with dynamic wifi VLANs; *) bridge - do not reset MLAG peer port on heartbeat timeout (log warning instead); *) bridge - fixed endless MAC update loop (introduced in v7.17); *) bridge - fixed missing S flag on interface configuration changes; *) bridge - improved stability when using MLAG with MSTP (introduced in v7.17); *) bridge - improvements to MLAG host table updates; *) bridge - process more DHCP message types (decline, NAK, inform); *) bridge - removed controller-bridge (CB) and port-extender (PE) support; *) bridge - show VXLAN remote-ip in host table; *) btest - allow limiting access to server by IP address; *) certificate - fixed localized text conversion to UTF-8 on certificate creation; *) chr - fixed limited upgrades for expired instances; *) chr/x86 - added network driver for Huawei SP570/580 NIC; *) chr/x86 - fixed error message on bootup; *) chr/x86 - fixed GRE issues with ice network driver; *) chr/x86 - Realtek r8169 updated driver; *) cloud - added "Back To Home Files" feature; *) cloud,bth - use in-interface matcher for masquerade rule; *) console - added dsv.remap to :serialize command to unpack array of maps from print as-value; *) console - added file-name parameter to :serialize; *) console - allow ISO timezone format in :totime command; *) console - allow tab as dsv delimiter; *) console - allow to toggle script error logging with "/console settings log-script-errors"; *) console - do not autocomplete arguments when match is both exact and ambiguous; *) console - do not show numbering in print follow; *) console - fixed "get" and "proplist" for certain settings; *) console - fixed issue where ping command displays two lines at the same time; *) console - fixed issue with disappearing global variable; *) console - implement scriptable safe-mode commands and safe-mode handler; *) console - improved hints; *) console - log errors within scripts to the system log; *) console - make non-pseudo terminals work with imports; *) console - put !empty sentence when API query returns nothing; *) console - renamed "back-to-home-users" to "back-to-home-user"; *) container - add default registry-url=https://lscr.io; *) container - allow HTTP redirects when accessing container registry; *) container - allow specifying registry using remote-image property; *) container - improved image arch choice; *) container - use parent directory of container root-dir for unpack by default, so that container layer files are downloaded directly on target disk; *) defconf - added IPv6 FastTrack configuration; *) device-mode - do not allow changing CPU frequency if "routerboard" is not allowed by device mode (introduced in v7.17); *) device-mode - fixed feature and mode update via power-reset on PPC devices; *) dhcpv4-client - allow selecting to which routing tables add default route; *) dhcpv4-client - fixed default option export output; *) dhcpv4-server - fixed "active-mac-address" update when client has changed MAC address; *) dhcpv4-server - fixed framed-route removal; *) dhcpv4-server - fixed lease assigning when server address is not bind to server interface (introduced in v7.17); *) dhcpv6-client - added "validate-server-duid" option; *) dhcpv6-client - allow specifying custom DUID; *) dhcpv6-client - do not run script on prefix renewal; *) dhcpv6-relay - added option to create routes for bindings passing through relay; *) dhcpv6-server - respond to client in case of RADIUS reject; *) discovery - advertise IPv6 capabilities based on "Disable IPv6" global setting; *) discovery - improved stability during configuration changes; *) discovery - report actual PSE power-pair with LLDP; *) discovery - use power-via-mdi-short LLDP TLV only on pse-type1 802.3af; *) disk - add disk trim command (/disk format-drive diskx file-system=trim); *) disk - allow to add swap space without container package; *) disk - allow to set only type=raid devices as raid-master; *) disk - cleanup raid members mountpoint, improve default name of file base block-device; *) disk - do not allow adding device in raid when major settings mismatch in superblock and config; *) disk - do not allow configuring empty slot as raid member; *) disk - fix detecting disks on virtual machines; *) disk - fixed removing device from raid while resyncing; *) disk - fixed setting up dependent devices when file-based block-device becomes available; *) disk - fixed showing free space on tmpfs (introduced in v7.17); *) disk - improved stability; *) disk - improved system stability when SMB interface list is used (introduced in v7.17); *) disk - mount multi-device btrfs filesystems more reliably at startup; *) disk - set non-empty fs label when formatting by default; *) dns - do not show warning messages for DNS static entries when they are not needed; *) ethernet - fixed issue with default-names for RB4011, RB1100Dx4, RB800 devices; *) ethernet - fixed link-down on startup for ARM64 devices (introduced in v7.16); *) ethernet - improved link speed reporting on 2.5G-baseT and 10Gbase-T ports; *) fetch - added "http-max-redirect-count" parameter, allows to follow redirects; *) fetch - do not require "content-length" or "transfer-encoding" for HTTP; *) file - added "recursive" and "relative" parameters to "/file/print" for use in conjunction with "path" parameter; *) file - allow printing specific directories via path parameter; *) file - improved handling of filesystems with many files; *) firewall - allow in-interface/in-bridge-port/in-bridge matching in postrouting chains; *) firewall - fixed incorrectly inverted hotspot value configuration; *) firewall - increased maximum connection tracking entry count based on device total RAM size; *) hotspot - fixed an issue where extra "flash/" is added to html-directory for devices with flash folders (introduced in v7.17); *) igmp-proxy - fixed multicast routing after upstream interface flaps (introduced in v7.17); *) iot - added new "iot-bt-extra" package for ARM, ARM64 which enables use of USB Bluetooth adapters (LE 4.0+); *) iot - improvements to LoRa logging and stability; *) iot - limited MQTT payload size to 32 KB; *) ip - added support for /31 address; *) ippool - added pool usage statistics; *) ipsec - added hardware acceleration support for hEX refresh; *) ipsec - fixed chacha20 poly1305 proposal; *) ipsec - fixed installed SAs update process when SAs are removed; *) ipv6 - added ability to disable dynamic IPv6 LL address generation on non-VPN interfaces; *) ipv6 - added FastTrack support; *) ipv6 - added routing FastPath support (enabled by default); *) ipv6 - added support for neighbor removal and static entries; *) ipv6 - fixed configuration loss due to conflicting settings after upgrade (introduced in v7.17); *) l2tp - added IPv6 FastPath support; *) l3hw - added initial HW offloading for VXLAN on compatible switches; *) l3hw - added neigh-dump-retries property; *) l3hw - fixed /32 (IPv6 /128) route offloading when using interface as gateway; *) l3hw - fixed partial route offloading for 98DX224S, 98DX226S, 98DX3236 switches; *) l3hw - respect interface specifier (%) when matching a gateway; *) log - added CEF format support for remote logging; *) log - added option to select TCP or UDP for remote logging; *) lte - added at-chat support for EC21EU; *) lte - added basic support for Quectel RG255C-GL modem in "at+qcfg="usbnet",0" USB composition; *) lte - added confirmation-code parameter for eSIM provisioning; *) lte - added initial eSIM management support; *) lte - fixed cases where the MBIM dialer could get stuck; *) lte - fixed Huawei ME909s-120 support; *) lte - fixed interface recovery in mixed multiapn setup for MBIM modems; *) lte - fixed missing 5G info for "/interface lte print" command; *) lte - fixed missing IPv6 prefix advertisement on renamed LTE interfaces; *) lte - fixed prolonged reboots on Chateau 5G ax; *) lte - fixed SIM slot initialization with multi-APN setups; *) lte - improved automatic link recovery and modem redial functions; *) lte - improved initialization for external USB modems; *) lte - lte monitor, show CQI when modem reports it as 0 - undetectable, no RX/down-link resource block assigned to modem by provider; *) lte - R11eL-EC200A-EU fixed online firmware upgrade and added support for firmware update from local file; *) lte - R11eL-EC200A-EU improved failed connection handling and recovery; *) lte - reduce modem initialization time for R11e-LTE-US; *) lte - reduced SIM slot switchover time for modems with AT control channel (except R11e-LTE); *) lte - removed nonexistent CQI reading for EC200A-EU modem; *) net - added initial support for automatic multicast tunneling (AMT) interface; *) netinstall - try to re-create socket if link status changes; *) netinstall-cli - fixed DHCP magic cookie; *) ospf - fixed DN bit not being set; *) ospfv3 - fixed ignored metric for intra-area routes; *) ovpn - added requirement for server name when exporting configuration; *) ovpn - disable hardware accelerator for GCM on Alpine CPUs (introduced in v7.17); *) ovpn-client - added 1000 character limit for password; *) pimsm - fixed incorrect neighbor entry when using lo interface; *) poe-out - added "power-pair" info to poe-out monitor (CLI only); *) poe-out - added console hints; *) poe-out - added new modes "forced-on-a" and "forced-on-bt" (CLI only); *) poe-out - upgraded firmware for 802.3at/bt PSE controlled boards (the update will cause brief power interruption to PoE-out interfaces); *) port - improved handling of USB device plug/unplug events; *) ppc - fixed HW encryption (introduced in v7.17); *) ppp - add support for configuration of upload/download queue types in profile; *) ppp - added support for random UDP source ports; *) ppp - fixed setting loss when adding new ppp-client interface for BG77 modem from CLI; *) ppp - properly cleanup failed inactive sessions on pppoe-server; *) ptp - do not send packets on STP blocked ports; *) ptp - improved system stability; *) qos-hw - fixed global buffer limits for 98CX8410 switch; *) queue - improved system stability when many simple queues are added (introduced in v7.17); *) queue - improved system stability; *) queue - prevent CAKE bandwidth config from potentially causing lost connectivity to a device; *) resolver - fixed static FQDN resolving (introduced in v7.17); *) rip - fixed visibility of added key-chains in interface-template; *) rose-storage - add btrfs filesystem add-device/remove-device/replace-device/replace-cancel commands to add/remove/replace disks to/from a live filesystem; *) rose-storage - add btrfs filesystem balance-start/cancel commands; *) rose-storage - add btrfs filesystem scrub-start, scrub-cancel commands (CLI only); *) rose-storage - add btrfs transfers, supports send/receive into/from file for transferring subvolumes across btrfs filesystems; *) rose-storage - add support to add/remove btrfs subvolumes/snapshots; *) rose-storage - added support for advanced btrfs features: multi-disk support, subvolumes, snapshots, subvolume send/receive, data/metadata profiles, compression, etc; *) rose-storage - allow to separately mount any btrfs subvolumes; *) rose-storage - fixes for btrfs server; *) rose-storage - update rsync to 3.4.1; *) rose-storage,ssh - support btrfs send/receive over ssh; *) route - added /ip/route/check tool; *) route - added subnet length validation on route add; *) route - do not use disabled addresses when selecting routing id; *) route - fixed busy loops (route lockups); *) route - fixed incorrect H flag usage; *) route - improved stability when polling static routes via SNMP; *) route - properly resolve imported BGP VPN routes; *) routerboot - disable packet switching during etherboot for hEX refresh ("/system routerboard upgrade" required); *) routerboot - improved stability for IPQ8072 ("/system routerboard upgrade" required); *) routing-filter - improved stability when using large address lists (>5000); *) routing-filter - improved usage of quotes in filter rules; *) sfp - fixed missing "1G-baseX" supported rate for NetMetal ac2 and hEX S devices; *) sfp - improved linking with certain QSFP modules on CRS354 devices; *) sfp - improved system stability with some GPON modules for CCR2004 and CCR2116 devices; *) sfp,qsfp - improved initialization and linking; *) smb - fixed connection issues with clients using older SMB versions (introduced in v7.17); *) smb - fixes for SMB server; *) smb - improved system stability; *) snmp - added "mtxrAlarmSocketStatus" OID to MIKROTIK-MIB; *) snmp - added disk serial number through description field; *) snmp - sort disk list and assign correct disk types; *) ssh - improved channel resumption after rekey and eof handling; *) supout - added IPv6 settings section; *) supout - added per CPU load information; *) switch - allow entering IPv6 netmask for switch rules (CLI only); *) switch - fixed dynamic switch rules created by dot1x server (introduced in v7.17); *) switch - fixed issues with inactive hardware-offloaded bond ports; *) switch - improved egress-rate on QSFP28 ports; *) switch - improved system stability for CRS304 switch; *) switch - improvements to certain switch operations (port disable, shaper and switch initialization); *) system - added option to list and install available packages (after using "check-for-updates"); *) system - do not allow to install multiple wireless driver packages at the same time; *) system - do not cause unnecessary sector writes on check-for-updates; *) system - enable "ipv6" package on RouterOS v6 downgrade if IPv6 is enabled; *) system - fixed a potential memory leak that occurred when resetting states after an error; *) system - force time to be at least at package build time minus 1d; *) system - improved HTTPS speed; *) system - improved stability on busy systems; *) system,arm - automatically increase boot part size on upgrade or netinstall (fixed upgrade failed due to a lack of space on kernel disk/partition); *) tile - improved system stability; *) traceroute - added "too many hops" error when max-hops are reached; *) traceroute - limit max-hops maximum value to 255; *) user - improved authentication procedure when RADIUS is not used; *) vxlan - added disable option for VTEPs; *) vxlan - added IPv6 FastPath support; *) vxlan - added option to dynamically bridge interface and port settings (hw, pvid); *) vxlan - added TTL property; *) vxlan - changed default port to 4789; *) vxlan - fixed unset for "group" and "interface" properties; *) vxlan - replaced the "inherit" with "auto" option for dont-fragment property (new default); *) webfig - added confirmation when quitting in Safe Mode; *) webfig - do not reload form when failed to create new object; *) webfig - fixed "TCP Flags" property when inverted flags are set in console; *) webfig - fixed datetime setting under certain menus; *) webfig - fixed displaying passwords; *) webfig - fixed Switch/Ports menu not showing correctly; *) webfig - hide certificate information in IP Services menu when not applicable; *) webfig - remember expand/fold state; *) wifi - added max-clients parameter; *) wifi - avoid excessive re-transmission of SA Query action frames; *) wifi - fix issue which made it possible for multiple concurrent WPA3 authentications to interfere with each other; *) wifi - implement steering parameters to delay probe responses to clients in the 2.4GHz band; *) wifi - log a warning when a client requests power save mode during association as this may prevent successful connection establishment; *) wifi - re-word the "can't find PMKSA" log message to "no cached PMK"; *) wifi - try to authenticate client as non-FT client if it provides incomplete set of FT parameters; *) wifi-qcom - fix reporting of radio minimum antenna gain for hAP ax^2; *) wifi-qcom - prevent AP from transmitting broadcast data unencrypted during authentication of first client; *) winbox - added "Copy to Provisioning" button under "WiFi/Radios" menu; *) winbox - added "Last Logged In/Out" and "Times Matched" properties under "WiFi/Access List" menu; *) winbox - added "Reset Alert" button under "IP/DHCP Server/Alerts" menu; *) winbox - added L3HW Advanced and Monitor; *) winbox - added missing options under "System/Disk" menu; *) winbox - added TCP settings under "Tools/Traffic Generator/Packet Templates" menu; *) winbox - do not show 0 Tx/Rx rate under "WiFi/Registration" menu when values are not known; *) winbox - do not show LTE "Antenna Scan" button on devices that do not support it; *) winbox - fixed locked input fields when creating new certificate template; *) winbox - show LTE "CA Band" field only when CA info is available; *) winbox - show warning messages for static DNS entries; *) x86 - fixed "unsupported speed" warning;

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关RouterOS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                        OpenWRT路由动态域名解析(DDNS)配置指南|no-ip.com实战教程

                                                                        2025年2月28日 08:00
                                                                        😀
                                                                        DDNS(Dynamic Domain Name System)是动态IP家庭网络实现远程访问的核心技术,旨在解决普通家庭宽带IP地址随机变化的痛点。将你随时变化的公网IP地址(如:58.210.76.123)自动绑定到一个固定域名(如:yourhome.ddns.net),从而可以通过域名直接访问家庭网络,而不用担心因为IPv4地址变化而造成的无法访问。

                                                                        📝 为什么需要动态域名解析?

                                                                        当你的家庭网络满足以下条件时,DDNS是在非家庭网络环境下,远程访问家庭内部局域网设备的必备方案:
                                                                        1. 从运营商获取动态公共IP地址(非固定IP,也不一定是公网IPv4地址)
                                                                        1. 需要远程访问内网设备(如:NAS存储、IP摄像头、WEB服务器)
                                                                        1. 主路由器不支持DDNS功能(常见于运营商定制光猫)

                                                                        📝 网络拓扑示意图


                                                                        📝 配置三部曲(附具体操作指令)

                                                                        步骤①:注册域名服务

                                                                        ✅ 推荐选择 no-ip.com 免费套餐。登录后,通过左侧菜单的NO-IP HOSTNAME添加新的动态域名并配置生成DDNS KEY。添加完成域名后,需要记录Username和Password,用于后续在DDNS相关程序中使用。需要注意的是,NO-IP.COM 的IPv4和IPv6动态域名解析是分开的,如果需要双栈解析,需要配置两个动态域名。
                                                                        notion image
                                                                        ✅ 创建类似yourhome.ddns.net的二级域名,no-ip.com提供了很多二级域名后缀可供选择。

                                                                        步骤②:OpenWRT软件安装

                                                                        大部分软件源均有ddns-scripts的安装包,如果你所使用的软件源没有,且无法使用Lucky或者DDNS-GO等替代品,那么也可以参考《OpenWRT 软件源整理》修改OpenWRT的OPKG软件源。
                                                                        ⚠️ 注意:需保持设备联网状态,安装耗时约2分钟;同时,如果需要Luci图形界面,也可以使用Lucky或者DDNS-GO

                                                                        步骤③:配置文件修改

                                                                        使用SSH连接后编辑/etc/config/ddns

                                                                        📝 疑难解答要点

                                                                        Q:如何验证配置成功? A: 执行日志查看指令:
                                                                        成功时显示good [你的公网IP]响应
                                                                        Q:公网IP检测失败怎么办? ✅ 尝试替换ip_url为以下服务:

                                                                        📝 最佳实践建议

                                                                        1. 安全加固:建议开启两步验证生成独立API密码
                                                                        1. 端口转发规则:在主路由设置仅限于必要端口
                                                                        1. 自动续期:no-ip免费域名需每月登录确认
                                                                        1. 备选方案:可同步配置Cloudflare DDNS
                                                                        1. IP更新频率限制:多数DDNS限制5分钟/次的更新请求,高频触发会被暂时封禁
                                                                        1. 地域性屏蔽风险:部分国外服务商域名(如.ddns.net)可能受区域防火墙干扰
                                                                        1. 数据隐私条款:检查服务商的隐私政策,避免监控请求日志(优先选择DuckDNS等开源方案)
                                                                        1. 重要服务建议至少配置两个不同提供商的DDNS,通过DNS轮询(Round Robin)实现故障转移,例如主用Dynu+备用ClouDNS。

                                                                        📝 免费的DDNS服务提供商

                                                                        服务商
                                                                        免费域名示例
                                                                        核心优势
                                                                        核心限制
                                                                        适合场景
                                                                        DuckDNS
                                                                        xxx.duckdns.org
                                                                        开源/无需注册/API简洁
                                                                        仅4个子域名可绑定
                                                                        树莓派/IoT设备
                                                                        no-ip.com
                                                                        xxx.ddns.net
                                                                        客户端支持广泛/稳定性高
                                                                        需30天登录验证避免过期
                                                                        家庭NAS/摄像头监控
                                                                        Afraid.org
                                                                        xxx.afraid.org
                                                                        支持自定义域名/子域名不限量
                                                                        界面老旧/唤醒邮件可能进垃圾箱
                                                                        开发者/多设备用户
                                                                        ClouDNS
                                                                        xxx.ip-dynamic.com
                                                                        支持IPv6/流量统计功能
                                                                        每月需手动激活服务(官网点一次)
                                                                        IPv6网络环境
                                                                        Dynu
                                                                        xxx.dynu.net
                                                                        Web管理友好/API灵活
                                                                        域名续期需手动跳转操作
                                                                        小型企业远程办公
                                                                        华为云DDNS
                                                                        需自有域名
                                                                        国内访问延迟低/解析速度快
                                                                        需已注册备案域名
                                                                        中国大陆本地化服务

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        任何配置问题,欢迎在评论区留下你的网络拓扑和使用场景! 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                        Windows下使用Docker自建Vaultwarden密码管理器

                                                                        2025年2月27日 08:00
                                                                        😀
                                                                        密码管理器我很久之前使用过LastPass,后来因为LastPass被渗透存在安全问题,就不再继续使用,转而使用Microsoft Edge浏览器自带的密码管理器,在功能上基本满足需求,但是存在一个很致命的问题,就是我浏览器完全被绑定在了Edge,包括PC和Android,为了密码管理而必须使用Edge,这也是我萌生了使用Bitwarden的最核心原因。这篇文章主要介绍在Windows环境下,通过使用Docker搭建Vaultwarden的方法,以及通过Cloudflare Tunnel实现内网穿透,提供给移动端设备在外使用。

                                                                        📝 Docker安装

                                                                        我选择Windows系统原因不是因为Windows系统在实现这些服务管理上有多好,完全是因为我的PVE小主机内存捉襟见肘,所以暂时先将Docker放在这台Windows主机上,在之后对PVE的小主机进行扩容后,再进行迁移。

                                                                        安装方法

                                                                        前往Windows | Docker Docs 下载Docker的安装程序,下载完成后打开进行安装。需要注意的是,Windows系统需要打开WSL或者Hyper-V功能后才可正常进行安装,原因在于Docker需要使用WSL或者Hyper-V的虚拟化技术。在这里,建议使用WSL作为虚拟化后端。

                                                                        Windows开启WSL或Hyper-V的方法

                                                                        以Windows 11为例,打开控制面板,选择程序启用或关闭Windows功能
                                                                        notion image
                                                                        如果准备使用Hyper-V作为虚拟化后端,则勾选Hyper-V
                                                                        如果准备使用WSL作为虚拟化后端,则勾选适用于Linux的Windows子系统

                                                                        📝 Vaultwarden安装及配置

                                                                        Vaultwarden(原名 Bitwarden_RS)是一个开源的密码管理服务器,它是官方密码管理工具Bitwarden的轻量级替代品,专为自托管(Self-hosted)环境设计,兼容Bitwarden的官方客户端(Windows/macOS/Linux/iOS/Android)及浏览器插件。

                                                                        拉取Vaultwarden镜像

                                                                        使用Docker Pull命令进行镜像的拉取,如果由于国内网络原因无法拉取,可以参考《Docker国内加速镜像 | Homelab Dolingou Network》使用加速镜像。

                                                                        启动Vaultwarden容器

                                                                        终端命令行模式

                                                                        Windows下,由于转义符以及路径格式问题,无法使用Vaultwarden官方在文档中所提供的docker run命令,以下是我根据Windows的格式所修改的命令,通过PowerShell执行:
                                                                        其中:
                                                                        • --env=DOMAIN= 后面填写你准备使用的域名,域名之后会通过Cloudflare Tunnel使用内网穿透,从而在外也可以正常使用Bitwarden。
                                                                        • --volume= 后面填写你挂载磁盘目录的路径,例如我的是F:\Docker\vaultwarden ,替换这部分即可,不要删除:/data/
                                                                        • -p 即端口映射,如果你需要修改为高位端口或其他自定义端口,则格式为端口:80 ,例如你想要使用10086端口,那么就是10086:80

                                                                        Docker Desktop图形界面模式

                                                                        除了使用上述命令行模式启动Vaultwarden容器,也可以通过Docker Desktop所提供的GUI模式进行容器的启动。
                                                                        打开Docker Desktop,点击左侧Images,找到Vaultwarden的镜像(vaultwarden/server),点击后面的开始按钮:
                                                                        notion image
                                                                        点击Optional Settings:
                                                                        notion image
                                                                        • Container name:填写容器名称,如果不填写,那么会随机生成一个。
                                                                        • Host port:填写你想要使用的端口
                                                                        • Host path:点击后面的···,选择你想要使用的挂载地址
                                                                        • Container path:填写/data/
                                                                        • Variable:填写DOMAIN,注意大小写
                                                                        • Value:填写你准备使用的域名
                                                                        点击Run启动容器。
                                                                         
                                                                        这时候,使用浏览器访问127.0.0.1:映射端口 即可打开Vaultwarden的页面,首次进入需要新建一个账户。

                                                                        📝 Cloudflare Tunnel安装及实现内网穿透

                                                                        我们已经完成了Vaultwarden本地的部署工作,那么在非局域网环境下,如何才能使用Vaultwarden进行密码填充和管理?这时候就可以请出赛博大善人Cloudflare,利用Zero Trust提供的Tunnel服务,进行内网穿透。
                                                                        首先需要你有一个域名,且域名托管于Cloudflare,同时已经绑定付款卡。
                                                                        登录Cloudflare账号之后,点击左侧菜单的Zero Trust,然后选择Networks → Tunnels,点击Create a tunnel。
                                                                        notion image
                                                                        Tunnel Type选择Cloudflared。
                                                                        notion image
                                                                        并为你的Tunnel填写一个响亮的名字,例如vaultwarden或者bitwarden等等,然后点击Save Tunnel进入下一步。在Install and run a connector中,我们使用Docker模式,原因在于既然开启一个Docker容器也是开,那多开一个Docker容器也是开,还不用额外安装软件。
                                                                        Choose your environment中选择Docker,然后下面会出现容器运行的代码,在Docker的Terminal中,或者直接在Powershell中,或者Terminal终端中,或者其他你喜欢使用的终端里面输入复制的代码:
                                                                        即可启动Cloudflare Tunnel的容器。
                                                                        notion image
                                                                        然后在Route Traffic中,进行路由信息的完善以及域名的绑定。
                                                                        • Subdomain:填写你要使用的二级域名前缀
                                                                        • Domain:选择你托管在Cloudflare的域名
                                                                        • Path:空
                                                                        • Type:选择HTTP
                                                                        • URL:填写局域网IP:映射的端口 ,例如我的机器是10.0.0.10,端口为80,那么就填写10.0.0.10:80 。切记不要使用localhost或者127.0.0.1
                                                                        点击Save Tunnel即可完成创建工作,现在访问你配置的域名,即可打开Vaultwarden的页面。

                                                                        📝 使用Onedrive进行Vaultwarden备份

                                                                        前面我们在启动Vaultwarden容器的时候配置了挂载的目录,为了避免密码库丢失以及后续的迁移需要,我们可以使用Onedrive进行备份同步。我没有选择对data目录再次压缩并设置压缩密码的方式,目前仅通过mklink进行软链接,直接同步备份挂载的目录,命令如下:
                                                                        这个命令需要在CMD模式下使用,Powershell无法使用。%CD%\Onedrive\bak\Warden 为同步到Onedrive下的bak下的warden目录,可根据自己需求进行修改,F:\Docker\vaultwarden 为vaultwarden挂载的目录。

                                                                        📝 关于资源使用

                                                                        目前在启动Vaultwarden容器和Tunnel容器的情况下,算上Docker本身的内存占用为1.2G左右,容器占用在80M左右,磁盘占用1.83G,CPU占用忽略不计,整体小于Bitwarden服务端所要求的2G内存。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关Vaultwarden安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                        利用Rclone将PVE备份同步到OneDrive

                                                                        2024年10月4日 08:00
                                                                        😀
                                                                        因为现在使用的All In One (Boom),主路由、旁路由(旁路网关)、DNS服务器等等都放在这台小小的N4100上面,而且我的主路由RouterOS还是L6授权,授权跟着硬盘,如果PVE挂了,那么我的RouterOS授权也就没了。所以非常担心如果真的Boom了应该怎么办。在进行今天备份到Onedrive的操作之前,我已经通过SMB方式挂载了一块Windows主机下的硬盘给PVE,进行每日定时备份,但是依旧担心如果本地的这个备份也出现了问题,应该怎么搞,有没有备份到远端的方法。而且因为Office 365提供1T的超大云盘空间,平常也使用不了这么多,平白放着就浪费了,不如尝试将PVE的备份同步到Onedrive。
                                                                         

                                                                        📝 方案介绍

                                                                        整体方案是开启PVE的备份功能,并将备份的数据存储在PVE的存储空间内,使用Rclone的Sync功能,进行备份数据的同步,并通过Cron进行定时任务的配置,实现定时的数据备份。
                                                                        Rclone是一个开源的命令行工具,专门用于管理和同步不同云存储服务之间的文件。它支持多种云存储平台,如Google Drive、Dropbox、OneDrive、Amazon S3等。Rclone支持单向和双向同步,确保本地与云端文件的一致性,同时支持带宽控制,避免占用太多的家庭网络带宽,最重要的,Rclone支持增量同步,也就是只传输修改过的文件,节省同步时间和带宽的消耗。

                                                                        📝 操作指南

                                                                        获取Onedrive的access_token

                                                                        首先我们需要在本地有浏览器的环境下安装Rclone,并通过配置获取Onedrive的access_token。原因在于PVE环境下一般我们不安装桌面环境和浏览器,所以无法通过浏览器访问的方式回调获取Onedrive的access_token
                                                                        以我日常使用的Windows 11为例,首先安装Rclone,你可以通过访问Rclone downloads进行手动下载和安装,或者如果你和我一样使用scoop进行Windows下软件管理,那么可以通过以下命令直接安装:
                                                                        安装后执行以下命令开始配置获取Onedrive的access_token
                                                                        notion image
                                                                        access_token信息类似于以下这种:
                                                                        我们需要复制{}及其内容进行保存,例如:
                                                                        等下会用到。Rclone获取的Onedrive access_token有效期为一小时,过期之后无法再继续使用。

                                                                        PVE配置Rclone

                                                                        与刚刚在Windows上配置基本相同,需要先进行Rclone的安装
                                                                        之后进行Rclone配置,基本与Windows下也相同

                                                                        Rclone同步备份文件

                                                                        如果PVE备份的存储是local的话,那么备份文件位于/var/lib/vz/dump 内,如果是后续添加的存储空间,那么根据挂载位置位于/mnt 目录内,例如我是通过smb协议挂载的远端目录,那么位于/mnt/pve/smb/dump ,这个根据自己备份存储位置的不同,需要自己寻找。
                                                                        通过以下命令进行Sync同步备份至OneDrive:
                                                                        • /mnt/pve/smb/dump: 即我的PVE备份文件所在目录;
                                                                        • onedrive:bak/pve: 即同步至OneDrive服务下的bak/pve文件夹,如果文件夹不存在,会自动创建;
                                                                        • --exclude "System Volume Information/**" : 忽略系统Volume卷部分,由于我的SMB是挂载在Windows下,所以会有一些隐藏的系统卷文件夹和文件,如果不加这个参数,会报错:

                                                                        Cron添加Rclone Sync定时任务

                                                                        因为我的PVE每天定时备份是在每天的凌晨2点,所以我通过配置rclone sync同步备份时间为每天的凌晨2点半,这个时间基本上家里也没有人在用网络,不用担心上传占满带宽。

                                                                        🤗 总结归纳

                                                                        没有总结。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关PVE安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                                                         

                                                                        Debian 10通过systemd-resolved修改DNS

                                                                        2025年2月6日 08:00
                                                                        😀
                                                                        过年时候在CoalCloud的服务器到期忘了续费,结果机器关停。续费之后发现Caddy的反代无论如何都无法生效,查看日志发现是无法申请到域名的证书,无法解析letsencrypt的域名。直接修改/etc/resolve.conf 又无法保存,发现是一个链接文件。尽管直接删除链接文件之后,重新新建一个resolve.conf 可以解决DNS解析的问题,但是还是想在系统根源上解决问题。

                                                                        📝 问题复现

                                                                        起因是Ahref提示我博客的大部分图片都挂了,无法正常访问,我直接访问会提示502 bad gateway,而我的图片是通过CoalCloud的服务器提供的反向代理来使用notion图床,所以根源在于反向代理挂了。

                                                                        Caddy日志

                                                                        我的反代是通过Caddy来实现。Caddy的日志的如下:
                                                                        可以看到是因为无法解析https://acme-staging-v02.api.letsencrypt.org/directory 域名而导致的签发证书失败。原因在于这台云服务器本身的DNS配置问题。

                                                                        云服务器DNS检查

                                                                        在我的一贯印象中,Linux系统的DNS服务配置是在/etc/resolve.conf 中,可以在这台Debian 10的云服务器上,我通过cat命令输出/etc/resolve.conf 内的内容为空,而且通过vim 去编辑,即便是具有root 权限的模式下,却无法保存,具体的vim错误提示忘记截图保存了,大概意思就是无法写入到resolve.conf这个文件中。
                                                                        通过ls -l命令查看,/etc/resolve.conf 文件是/run/systemd/resolve/stub-resolv.conf 的软链接文件。
                                                                        通过查阅资料,原来Debian 10系统的DNS服务是由systemd-resolved 提供,同时/run/systemd/resolve/stub-resolv.conf 也是由systemd-resolved 生成,那么修改系统DNS的方法就不再是修改/etc/resolve.conf文件,而是去修改systemd-resolved的配置文件,配置文件位于/etc/systemd/resolved.conf ,文件内容如下:
                                                                        将DNS前面的注释去掉,并添加上Google DNS和Cloudflare DNS,并删除掉Cache前面的注释,允许DNS Cache缓存之后,通过命令systemctl restart systemd-resolved.service 重启即可。

                                                                        🤗 总结归纳

                                                                        其实也可以非常粗暴的将systemd-resolved干掉,还使用原来的/etc/resolve.confsystemd本身是作为启动管理的软件,现在野心有点大,什么都想插一脚。但是看到支持DNSSECDOT支持,之后可能会用到,所以还是先进行保留。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关Debian安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                        RouterOS如何直接访问光猫

                                                                        2025年1月19日 08:00
                                                                        😀
                                                                        最近在折腾IPTV的时候发现,每次都需要拔掉PVE上连接电脑端口的网线,插到光猫上才能访问光猫的管理页面,过程太麻烦,所以整理了一下RouterOS如何在不插拔网线的情况下,直接访问光猫的管理页面方法,供大家参考。

                                                                        📝 RouterOS直接访问光猫教程

                                                                        前置条件

                                                                        这里的前置条件是我目前的网络情况,供参考
                                                                        • 光猫使用桥接模式,由RouterOS进行拨号
                                                                        • 光猫管理地址为192.168.1.1
                                                                        • RouterOS及家庭局域网的网段位于10.0.0.0/24
                                                                        • RouterOS连接光猫的端口为ether4

                                                                        配置方法

                                                                        简单的配置方法为使用RouterOS的终端(Terminal),通过输入以下命令执行:
                                                                        这段代码的意思是为ether4端口添加一个IP地址,为192.168.1.2,属于192.168.1.0网段,同时添加注释ONT,也就是光猫。
                                                                        这段代码的意思是将来自10.0.0.0/24网段的流量,通过ether4接口转发到目标地址192.168.1.1,并对源地址进行伪装(NAT)。NAT伪装(masquerade)会将源地址替换为ether4接口的IP地址,从而实现内部网络访问外部网络的功能。

                                                                        🤗 总结归纳

                                                                        教程很简单,只需要两条命令,但需要注意的是,上面创建的RouterOS防火墙规则建议放在靠后的的位置,避免因为RouterOS防火墙规则优先级问题导致未知错误。
                                                                        另外RouterOS最新发布了7.17版本,改动还挺多的,Winbox 4.0也进行了更新,目前版本为beta 16

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关RouterOS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                        Follow for Android

                                                                        2025年1月10日 08:00
                                                                        😀
                                                                        最近一直通过Follow浏览订阅的RSS、Twitter以及Youtube频道等等,真的很方便,有一种重新回到将近20年前,使用Google Reader那种时候通过订阅很多博客并获取知识的感觉。Follow一直没有推出Android的App,需要使用网页版。但是对于这种高频使用的服务,我天生希望使用App的方式,所以这次又整了个活,用Tauri通过Webview的方式将Follow的网页服务封装在了APP里。

                                                                        📝 项目介绍

                                                                        整体项目很简单,就是通过Webview打开Follow.is的网站,然后用Tauri生成Android编译APK所需要的文件,最后进行打包。整体APP大小在28M左右,暂时还没有做任何太多优化,先占个坑,在后续自己使用过程中如果发现问题会进行更新。
                                                                        Follow.is的整体优化非常好,在浏览器中各种交互操作也已经非常成熟,所以我做的事情非常简单,就是将Follow.is的网页通过Webview打开,再做一点缓存加快载入速度。Follow for Android应用本身除缓存外不会存储任何用户数据,同时在权限申请方面,也只需要互联网权限:
                                                                        另外,在APP的请求记录里会出现读取剪贴板行为,这是由于在点击输入框时会自动进行获取,我没有禁止,避免无法粘贴Feed地址。当然只有在使用这个Follow APP时候才会发生这种读取。
                                                                        对于系统版本,目前需要SDK版本≥33,否则会提示版本不兼容。
                                                                        最后,感谢RSSNext/Follow的全部贡献成员,同时期待Follow官方正式推出Android和iOS的客户端版本。
                                                                         

                                                                        项目地址

                                                                        followforandroid
                                                                        moreoronceUpdated Jan 23, 2025
                                                                        notion image
                                                                        notion image

                                                                        支持功能

                                                                        • Google和Github的登录可用
                                                                        • RSS正常可以阅读(Youtube订阅源暂时无法直接播放视频)
                                                                        • 添加订阅源正常
                                                                        • 大部分页面显示正常(目前还没有找到不正常的)
                                                                        • 使用Service Worker进行缓存
                                                                        • 理论上支持Android TV使用
                                                                         
                                                                        APP大小不到28M,整体安装后,算上缓存在100M左右。
                                                                        notion image

                                                                        安装文件

                                                                        没有区分架构,理论上支持全部

                                                                        🤗 总结归纳

                                                                        了解Tauri和配置用的时间较长,Tauri 2.0版本目前还没有完全的文档能够参考阅读,有些地方可能需要自己试试看。生成Android构建文件之后,主要花费的时间在编译上,第一次感觉自己的这颗AMD Ryzen 5600X的CPU性能有点不够用了。
                                                                        文章介绍内容现在也比较少,后续再一点一点完善吧。Enjoy it。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关Follow for Android安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~ 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                        InnerTune,一个第三方Youtue Music客户端

                                                                        2024年10月6日 08:00
                                                                        😀
                                                                        自从网易云音乐的黑胶VIP到期之后,网易云音乐变得越来越难用,哪有听歌还要看广告之后才能听的,而且很多音乐提供的版本音质差就算了,有的只播放一个开头就因为不是VIP自动切歌,尤其是在健身房时候,突然切歌的伤害实在是太大了。在Android上,没有什么太好的选择,我又不是苹果用户,所以Apple Music就算了,选来选去,最后还是决定用Youtube Music。但是Youtube Music Android版本本身也有个问题,在不是Premium的情况下,是没有办法背景播放的,例如在手机息屏或者切换应用程序之后,音乐就暂停了,但是这个对于Android用户来说不是什么问题,毕竟我们什么样的App都有。
                                                                        notion image

                                                                        📝 InnerTune介绍

                                                                        InnerTune是一个基于Material 3设计风格的YouTube Music客户端,专为Android平台开发,是一个开源项目,提供了YouTube Music官方客户端的绝大多数功能,并极大的提升在没有订阅Youtube Premium情况下的听歌体验。而且InnerTune非常贴心的内置了Proxy代理选项,可以方便的通过代理来访问Youtube Music的曲库。
                                                                        InnerTune项目地址如下:
                                                                        InnerTune
                                                                        z-huangUpdated Jan 8, 2025
                                                                        项目从2020年2月11日在Github提交了第一次Commit,到现在已经近5年的时间,是一个长期在维护的项目,所以暂时不用担心烂尾等问题。目前项目总计获得了4.3K的Star,266的Fork,1015条Issues已经被解决,是一个很负责的项目。
                                                                        整体程序大小24.6M,比网易云音乐那种动辄占用1G多的程序简洁太多了,而且日常运行中也不会有事没事发个Push通知或者自己唤醒耗电。要说唯一的缺点,就是得有代理了,而且听歌要费流量。
                                                                        目前已经是我手机上主要听音乐的App,即便是我在订阅了Youtube Premium的情况下。

                                                                        功能特点:

                                                                        • 无广告播放:可以从YouTube/YouTube Music播放歌曲,且没有广告干扰。
                                                                        • 后台播放:支持在后台播放音乐,即使切换到其他应用,音乐也能继续播放。
                                                                        • 搜索功能:支持从YouTube Music搜索歌曲、视频、专辑和播放列表。
                                                                        • 登录支持:用户可以通过YouTube Music账号登录获取个性化推荐和收藏内容。
                                                                        • 缓存与离线播放:可以缓存和下载歌曲,支持离线播放。
                                                                        • 同步歌词:提供与歌曲同步显示的歌词功能。
                                                                        • 歌词翻译:内置歌词翻译功能,帮助用户理解外语歌曲。
                                                                        • 跳过静音:自动跳过歌曲中的静音部分,提升播放体验。
                                                                        • 音频标准化:自动调整音量,保持不同歌曲之间的音量一致。
                                                                        • 节奏/音高调整:可以调节歌曲的播放速度和音调,满足不同需求。
                                                                        • 动态主题:根据系统主题动态变化应用的外观,带来个性化体验。
                                                                        • Android Auto支持:在Android Auto环境中使用该应用,适用于车载系统。
                                                                        • 个性化快捷选择:提供快速选择功能,便捷找到用户喜爱的音乐。
                                                                        • Discord Rich Presence支持:与Discord集成,展示正在播放的歌曲信息。

                                                                        程序界面:

                                                                        程序界面整体遵循Material 3设计风格,简洁不花哨,完全够用。

                                                                        主界面:

                                                                        notion image

                                                                        音乐播放界面及歌词界面:

                                                                        notion image
                                                                        notion image
                                                                        notion image
                                                                         

                                                                        设置界面:

                                                                        notion image

                                                                        InnerTune下载地址

                                                                        目前开发者提供三个下载方式,Github、F-Droid市场以及IzzyOnDroid市场,通过下面图片点击超链接即可进入下载页面。
                                                                        需要注意:如果通过Github Release进行下载*.apk 安装包进行下载,手机用户需要选择full_arm64-v8a.apk 的安装包:

                                                                        InnerTune提示Unknown Error播放失败

                                                                        使用Debug的Foss版本

                                                                        如果出现播放失败问题,例如InnerTune版本为0.5.10 ,在播放页面提示Unknown Error,可以尝试使用debug版本,目前InnerTune Debug版本工作正常:

                                                                        自行编译安装包

                                                                        另外一种解决办法为尝试自行编译InnerTune的APK安装包,步骤大概如下:

                                                                        1. 设置开发环境

                                                                        下载Android Studio:在你的电脑上下载Android Studio,访问https://developer.android.com/studio。这是一款官方的集成开发环境(IDE),专门用于安卓应用开发。

                                                                        2. 下载或克隆InnerTune仓库

                                                                        访问InnerTune的GitHub仓库:https://github.com/z-huang/InnerTune/archive/refs/heads/dev.zip,下载或克隆项目的ZIP文件。

                                                                        3. 解压项目

                                                                        如果下载的文件是压缩包(ZIP格式),请解压项目文件。

                                                                        4. 在Android Studio中打开项目

                                                                        启动Android Studio,点击左上角菜单按钮,选择File -> Open,然后选择解压后的项目文件夹。

                                                                        5. 生成签名APK

                                                                        点击顶部左侧的菜单按钮,然后依次选择Build -> Generate Signed App Bundle / APK
                                                                        选择APK选项,然后点击Next
                                                                        如果你已经有签名密钥,请提供密码并继续;如果没有,请选择Create New创建新密钥。只需要填写路径、别名和密码即可,其他信息可以随意填写。完成后点击Next
                                                                        选择fossRelease构建目标,然后点击Create按钮。
                                                                        等待1到10分钟,直到构建完成。

                                                                        6. 定位生成的APK文件

                                                                        如果右下角弹出通知,标题为Generate signed APK with locate button,点击通知中的locate按钮。
                                                                        APK文件会显示在你的默认文件浏览器中。你可以通过USB、电子邮件或其他方式将APK文件传输到你的手机。

                                                                        7. 备份并替换现有InnerTune应用

                                                                        在使用新APK之前,请在当前InnerTune应用的设置中创建备份。
                                                                        只有完成备份后,才能卸载现有的InnerTune应用。
                                                                        定位你制作的APK文件,像安装其他APK一样进行安装。

                                                                        8. 恢复备份并登录Google账号

                                                                        打开新安装的应用,从设置中恢复之前的备份。
                                                                        如果你遇到问题,请尝试登录或退出你的Google账号。一些用户发现,在登录和退出账号后再进行操作可以解决问题。

                                                                        9. 安全提示

                                                                        切勿安装他人提供的APK:出于明显的安全原因,强烈建议你亲自制作和安装APK文件。这是确保应用安全的最佳方式。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关Android APP安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        飞牛OS安装Tailscale实现内网穿透

                                                                        2024年10月14日 08:00
                                                                        😀
                                                                        飞牛OS(fnOS)的热度最近一直很高,我也想蹭蹭热度,试用了一下飞牛OS。目前影音库已经迁移完毕,需要开始配置内网穿透,让自己在外面也可以访问NAS中的数据,例如同步OpenMediaVault中的密码、相册同步、Jellyfin访问,或者在外面快速的添加种子到qbitorrent中等等。飞牛OS本身提供了FN Connect用于进行内网穿透,但是需要注册飞牛账号并提供手机号,我觉得没什么必要,而且我之前一直使用的都是Tailscale,在国内有IPv6的大部分情况下都可以直连成功,所以这次也直接飞牛OS上进行配置。

                                                                        📝 配置过程

                                                                        开启SSH登录

                                                                        默认飞牛OS安装完成后,SSH登录是关闭状态,需要在管理网页手动打开。开启位置位于:设置 - 系统设置 - SSH 。同时,建议修改端口为1024以上的高位端口,避免在路由器未配置IPv6防火墙或IPv6防火墙规则配置不完善情况下被扫描爆破。
                                                                        notion image
                                                                        修改完成后,通过Putty、Termius或者你喜欢的终端进行登入,记得修改端口为刚刚所设定的端口。登录账户和登录密码均为网页端使用的账号密码(默认账号为admin),纯终端登录命令为:

                                                                        安装TailScale

                                                                        TailScale官方提供的Linux版本的安装脚本文件,可直接进行执行:
                                                                        安装过程中会添加TailScale的安装源地址,同时在非root用户下执行会提示输入sudo密码。
                                                                        notion image
                                                                        通过ps -ef | grep tailscale 可以查看到Tailscale已经正在运行:
                                                                        通过systemctl status tailscaled.service也可以查看当前Tailscale的运行状态。同时在Status提示我们需要执行sudo tailscale up 登入账户并绑定。

                                                                        绑定Tailscale账户

                                                                        输入以下以下登录Tailscale账户,需要添加sudo进行执行,否则会提示Access denied: checkprefs access denied 权限不足。
                                                                        稍等以下,终端中就会返回登录地址,点击之后直接打开流量器进行登录。由于Tailscale在国内的访问并不稳定,所以首次登录可能需要使用代理。
                                                                        notion image
                                                                        点击Connect进行绑定即可。之后在TailScale的控制台也可以看到飞牛OS这台NAS已经完成绑定。现在在外面,开启Tailscale的情况下就可以正常访问家里的NAS。
                                                                        notion image

                                                                        设置Tailscale开机自启

                                                                        通过systemctl status tailscaled.service 查看是否处于开机自启状态:
                                                                        如果Loaded: loaded (/lib/systemd/system/tailscaled.service; enabled; preset: enabled) 均为enable状态,即已经是开机自启状态。

                                                                        🤗 总结归纳

                                                                        目前在飞牛OS系统内的软件包内还没有直接安装Tailscale的功能,所以暂时只能通过SSH的方式进行安装、配置和管理。
                                                                        至于为什么不直接使用IPv6进行访问,主要有下面两个原因:
                                                                        1. 直接暴露端口在公网存在安全隐患,在外使用时IP地址不固定,所以也无法限制登录的IP地址范围,包括IPv6地址范围等等。
                                                                        1. 直接暴露端口在公网可能会被运营商警告,原因在于提供可访问的页面服务。
                                                                        所以我更倾向使用TailScale这种软件进行内网穿透,通过运营商分配的公网IPv6提高直连打洞的成功率,在直连情况下,上行带宽是可以跑满的,这就已经足够。目前测试下来,同运营商情况下打洞成功率100%,跨运营商情况下可能打洞会慢一些(联通 → 电信)。
                                                                        另外,没有想到飞牛OS居然是基于Debian系统做的开发,目前我也只是试用状态,基本上飞牛做的事情,家里的Debian服务器都已经做好了,其实替换的意义不是很大。 但是因为飞牛OS是基于Debian进行开发,所以在可玩性上空间很大,不再局限于使用Docker,如果搭配合适的硬件应该完全可以成为一个All in One的家庭服务器,将旁路网关、DNS服务器等等都搭建在一起(并不推荐)。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关家庭网络安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        ImmoralWRT软件源分享

                                                                        2024年6月6日 08:00
                                                                        😀
                                                                        ImmortalWrt是OpenWrt的一个第三方分支,主要针对国人用户开发,在不对系统进行过度修改的情况下,不仅继承了OpenWRT的灵活性和强大功能,还提供更多的本地化软件包和设备支持,对IPv6的支持也很稳定,应该是国内目前最为纯净的OpenWRT系统。也是支持使用Dae的OpenWRT分支。
                                                                        本文章适用于ImmortalWRT用户,与OpenWRT官方源仓库不一定兼容,如需使用OpenWRT官方源仓库,可参考:🖥️OpenWRT 软件源整理

                                                                        📝 ImmoralWRT软件源

                                                                        ImmoralWRT软件仓库地址

                                                                        ImmoralWRT在国内有镜像加速,目前ImmoralWRT路由系统在安装完成之后默认使用的OPKG软件仓库为下面这个:
                                                                        软件仓库提供版本及架构选择,请根据自身设备所使用的OpenWRT版本及系统架构进行选择。

                                                                        Opkg配置ImmoralWRT软件源

                                                                        以下内容以ImmoralWRT-23.05.3,X86-64架构的软件源为例,其他版本及架构可通过仓库选择之后复制地址替换到下面的代码中。

                                                                        命令行方式

                                                                        1. 编辑/etc/opkg/customfeeds.conf
                                                                        1. 复制以下软件源配置信息至文件中并进行保存
                                                                        1. 更新软件源

                                                                        Luci界面操作方式

                                                                        1. 登入OpenWRT管理页面
                                                                        1. 打开系统 - 软件包 ,点击配置opkg
                                                                        1. /etc/opkg/customfeeds.conf 粘贴以下内容并保存
                                                                        1. 点击更新列表进行软件源更新

                                                                        镜像地址

                                                                        如果默认的镜像地址在你的网络下速度并不理想,可以替换使用其他镜像地址:
                                                                        • CERNET(校园网联合镜像站):
                                                                        • 南开大学开源镜像站
                                                                        • 北京大学开源镜像站
                                                                        • 上海科技大学Geek Pie开源镜像站
                                                                        • 中国科学技术大学开源镜像站
                                                                        • 致远镜像站
                                                                        • 吉林大学开源镜像站
                                                                        • 上海交通大学开源镜像站
                                                                        • 南京大学开源镜像站
                                                                        • Cloudflare镜像站

                                                                        替换方法

                                                                        修改 /etc/opkg/customfeeds.conf 文件,将源地址 https://downloads.immortalwrt.org 或 https://mirrors.vsean.net/openwrt 更改上面的镜像站地址。
                                                                        或者通过命令行方式进行修改,格式为s,[原来的软件源地址],[替换的软件源地址],g
                                                                        替换完成后通过opkg update进行更新。

                                                                        ImmoralWRT固件下载

                                                                        推荐使用官方提供的Firmware固件下载服务。如具备动手能力可自行编译固件。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        Dae安装及配置指南

                                                                        2024年12月1日 08:00
                                                                        😀
                                                                        我使用Dae替代OpenClash已经有一段时间,目前整体的运行情况也已经稳定,该踩的坑也都已经踩过。之前也零零散散写过几篇关于Dae的文章,主要是一些进阶的用法,例如搭配AdGuard Home和MosDNS等其他DNS程序使用,但没有更多的涉及到Dae本身的安装以及配置指南,这篇文章就来填这个坑。

                                                                        📝 什么是Dae

                                                                        Dae是一个高性能的透明代理解决方案,在作用上,与Mihomo、Singbox等相同,均是通过域名、IP、端口、来源地址、目标地址以及规则集等方式,对流量进行分流以及使用代理,从而达到科学上网的目的。但在原理上,Dae通过在Linux内核中使用eBPF实现流量分流与透明代理,允许在网络驱动程序的最早阶段处理数据包。这样可以在将数据包传递给内核协议栈之前进行快速处理,比如丢弃、转发或修改数据包,所以相比其他软件,直连性能更好,同时也更方便实现国内外流量分流。

                                                                        支持功能

                                                                        • 支持通过本地主机的进程名称进行流量分流。
                                                                        • 支持通过局域网中的 MAC 地址进行流量分流。
                                                                        • 支持使用反向匹配规则进行流量分流。
                                                                        • 支持根据策略自动切换节点。
                                                                        • 支持 Shadowsocks、Trojan(-go) 和 Socks5 的全锥 NAT
                                                                        • 支持高级DNS解析策略
                                                                        • 天然支持IPv6,无需额外设置

                                                                        支持协议

                                                                        • HTTP(S), naiveproxy
                                                                        • Socks
                                                                        • VMess(AEAD, alterID=0) / VLESS
                                                                        • Shadowsocks
                                                                        • ShadowsocksR
                                                                        • Trojan
                                                                        • Tuic (v5)
                                                                        • Juicity
                                                                        • Hysteria2
                                                                        • Proxy chain (flexible protocol)

                                                                        支持系统

                                                                        由于软件自身特性,Only Support By Linux Kernel只支持Linux核心的操作系统,并且内核版本不低于5.17 ,如果使用0.9.0-rc以上,内核版本不低于6.10。
                                                                        所以软件更适合部署于路由器或者旁路网关上作为代理网关来使用。常规的Linux发行版均可满足要求,例如Debian(我目前在使用的)、 Ubuntu、 Arch Linux等等。Dae也支持在OpenWRT上进行使用,但需要自行进行固件编译,使用较新的Linux Kernel版本,并开启对应内核选项。
                                                                        个人建议作为科学上网的旁路网关(或者说是旁路由,但是其实并没有使用到路由的功能),还是尽量使用完整版的Linux发行版,现在Youtube上不少UP主也开始推荐主路由器 + Linux发行版作为旁路网关的方案,一方面因为在旁路网关中,OpenWRT提供的很多功能用不到,另外一方面,在Linux Kernel的更新以及完整性上,OpenWRT也阉割了很多,Kernel特性支持较为落后,目前主力版本还在使用5.15的Kernel,这也是为了兼容各种嵌入式设备与多平台架构的结果。

                                                                        📝 Dae安装

                                                                        本篇内容是以我个人网络环境为操作前提进行编写,所以在特殊场景下,可能并不使用于你的网络环境。我所使用的系统环境如下:
                                                                        • PVE环境,未进行网卡直通
                                                                        • Debian 12 (核心版本:6.1.0-26-amd64)
                                                                        • 作为旁路使用,只有一个网口ens18

                                                                        安装脚本

                                                                        Dae提供了脚本直接进行安装,可通过如下命令进行:
                                                                        当前Release版本为0.80.9,最新RC版本为0.9.0rc2,如果希望使用rc版本,可使用如下命令:
                                                                        如果需要卸载Dae,可使用如下命令:
                                                                        安装完成后,二进制执行文件位于/usr/local/bin/dae ,同时会自动添加systemctl执行脚本;
                                                                        配置文件位于/usr/local/etc/dae/config.dae

                                                                        更新GeoIP与GeoSite数据库

                                                                        如果需要更新GeoIP与Geosite数据库,那么可以使用如下命令:
                                                                        更新GEOIP
                                                                        更新GEOSITE
                                                                        更新后的GeoIP与GeoSite文件位于/usr/local/share/dae 文件夹内,Dae会自动使用该位置的GeoIP与GeoSite数据库文件,无需进行移动或复制至新的位置。

                                                                        📝 Dae配置文件

                                                                        Dae的配置文件很简单,而且可读性也很高,不必考虑乱七八糟的防火墙劫持与DNS劫持,在我的网络环境下,对付反诈的劫持也有很好的效果。
                                                                        以我个人网络环境,提供配置文件如下,需要修改的部分为global部分lan_interface的网卡名称、subscription 内的订阅地址,group部分的节点过滤规则。这套配置目前使用于旁路网关上,支持IPv6,同时ipleak 300次检测无DNS泄露。
                                                                         
                                                                        12月27日更新:
                                                                        • 增加了小米部分设备域名。部分反应miwifi.com 域名请求次数太多导致内存泄露。
                                                                        需要注意部分:
                                                                        • Group内节点组名称需要与Routing中规则名称对应,例如修改了节点组Proxy 的名称,那么在Routing 中也需要修改proxy 为新的名称
                                                                        • 如果使用RC版本,DNS可以使用DOH或DOT,以阿里巴巴DNS举例:
                                                                          • DOH:h3://dns.alidns.com:443
                                                                          • DOT:tls://dns.alidns.com:853
                                                                          • DOQ:quic://dns.alidns.com:853
                                                                        • 节点过滤规则:如果使用固定节点,policy: fixed(0) 并且filter: name(节点名称) ,如果节点名称中包括emoji符号,可能无法正常选择提示报错,此时建议使用filter: name(keyword: ‘节点关键字’) 方式进行过滤选择。
                                                                        • Routing 中的规则为顺序匹配,从上至下,所以建议将特定规则放在最上方,将例如Geosite:CN 等较大的规则集放在下方,避免规则冲突无法正常匹配。例如,你可以将自定义规则放置于最上方。

                                                                        启动Dae

                                                                        使用如下命令可以启动Dae。
                                                                        如果需要在前台使用Dae,便于查看Dae运行情况,可以使用:
                                                                        当修改配置文件后,需要重载Dae配置文件时,可以使用:

                                                                        自动更新并存储订阅

                                                                        由于Dae每次启动时均需要重新读取订阅信息,本身并不存取订阅信息,当订阅链接被墙或者无法访问时,就无法正常获取到订阅信息及分组信息,造成访问异常。以下方法可以实现订阅信息存储和自动订阅更新。

                                                                        systemd.timer方法

                                                                        假设你的dae配置文件存储于/usr/local/etc/dae/ ,这也是通过自动安装脚本默认的存储位置。那么新建一个/usr/local/bin/update-dae-subs.sh文件:
                                                                        赋予这个文件可执行权限:
                                                                        配置systemd.timersystemd.service进行自动更新
                                                                        • /etc/systemd/system/update-subs.timer: 以下代码是每12小时,或者每次系统启动后15分钟更新
                                                                        • /etc/systemd/system/update-subs.service:
                                                                        新建订阅链接文件:/usr/local/etc/dae/sublist ,并安装以下模板填写订阅链接,如果只有一个订阅,则保留并填写一个即可。当通过update-subs.timer 拉取订阅信息时,会自动建立sub1sub2sub3 的订阅文件。
                                                                        赋予订阅链接文件600权限
                                                                        修改config.daesubscription 部分内容为订阅文件
                                                                        启动Timer
                                                                         

                                                                        crontab方法

                                                                        如果你的系统没有system.timer ,也可以使用crontab进行替代。区别在于无法实现系统启动后自定义时间进行更新,只能定时更新。
                                                                        编写/usr/local/bin/update-dae-subs.sh 文件
                                                                        通过crontab实现定时更新,以下例子为12小时执行一次。你可以使用crontab计算器查询定时规则。
                                                                        剩余步骤与上面system.timer部分相同。

                                                                        🤗 其他用法

                                                                        如果需要图形界面进行配置,可以选择Daed,配置文件内容大同小异,主要就是DNS和Routing部分,对应截取之后粘贴到控制台里面就好。

                                                                        OpenAI相关规则

                                                                        geosite:openai 规则并不全面,如果遇到无法使用的情况,可以添加以下部分规则,替换ai 代理组为你的代理组名称:
                                                                        以上规则包括Gemini,Openai,Copilot,Apple Intelligence, Claude
                                                                        最后打个广告,我一直在使用的OpenAI是由Dream API提供,相对于合租车来说,使用起来更灵活一些。
                                                                         

                                                                        关于CPU占用率高及内存泄露

                                                                        建议添加如下规则禁止Quic。Daed也建议添加该规则。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关Dae安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        Dae搭配AdGuard Home使用指南

                                                                        2024年11月7日 08:00
                                                                        😀
                                                                        在之前配置好家庭网络环境后,稳定运行了很久,大致上也基本满足日常需要,但是还有一些小的问题需要去解决。之前使用的是Dae + MosDNS配置,由DAE劫持流量进行最后的分流和代理,MosDNS主要用于DNS的并发请求和使用DOH、DOT服务,同时也负责DNS去广告。在使用过程中,由于MosDNS的队列化和无图形界面配置,进行特殊规则配置过于麻烦,最终决定还是在整体的DNS链路中增加AdGuard Home单独负责去广告和相关特殊规则的指定,MosDNS仅作为DNS转发器使用,不再兼顾过滤器的作用。
                                                                        由于Dae的DNS处理方式与OpenClash、Singbox等不同,是通过劫持流量方式实现,无法直接指定端口进行DNS劫持,所以主要的配置部分在于Dae,MosDNS与AdGuard Home的配置部分基本维持原有配置即可。
                                                                        另一个配置前提:由于我在主路由RouterOS上已经使用ospf进行了国内外流量的分流,所以此教程可能不一定适合于完全使用Dae进行分流的用户,如果存在分流错误等问题,可以尝试修改Global配置中的连接选项为domain++模式。

                                                                        📝 Dae配置部分

                                                                        Daed安装

                                                                        其实这部分说明文档里面已经很完善,可以参考Github上的教程。我自己使用的是Daed,目前最新的Daed版本是0.9.0版本。相比于Dae,Daed提供一个可视化的网页管理面板,日常进行自定义配置时候更为方便一些。在资源占用上,Daed相比Dae占用的内存要多一些,大概多出100mb左右。
                                                                        Debian或者Ubuntu安装执行如下命令:
                                                                        其他系统可参考:
                                                                        getting-started.md
                                                                        daeuniverse

                                                                        Global配置

                                                                        连接选项使用domain模式,其他无需修改。不需要使用Dae的domain+domain++ 模式。

                                                                        DNS

                                                                        由于处理DNS分流和解析不再由Dae负责,所以DNS部分的配置非常简单:
                                                                        其中adg即AdGuard Home,配置为AdGuard Home监听的地址和端口。此处我使用的默认53端口,如果53端口已经被占用或者存在其他问题,可替换为其他非标端口。

                                                                        路由部分

                                                                        路由部分需要在原有的配置基础上,对AdGuard Home进程、MosDNS进程以及系统默认的NetworkManager进程使用direct(must)规则特殊处理,从而避免产生路由回环。
                                                                        同时,为了在AdGuardHome中可以正确的显示各设备的IP地址,需要对geoip:private 规则进行修改,使用direct(must)规则。如果使用的是direct规则,那么在AdGuard Home中显示的设备信息均为localhost(127.0.0.1)
                                                                         

                                                                        Route整体规则

                                                                        整体规则大致如下,里面有一些自定义的配置,可以根据自己需要进行删减。

                                                                        direct与direct(must)区别

                                                                        must_rules表示不将DNS流量重定向到dae并继续匹配。对于单一规则,directmust_direct的区别在于direct会劫持和处理DNS请求(用于流量分割使用),但must_direct不会。当存在DNS请求的流量循环时,must_direct很有用。must_direct也可以写成direct(must)
                                                                        在上述配置中,以AdGuard Home为例,即进程AdGuardHome匹配的规则不进行DNS流量的劫持和处理且为直连,由AdGuard Home及其上游进行处理,同时由于规则:
                                                                        将通过Google DNS的流量使用代理处理,从而避免DNS污染。

                                                                        📝 AdGuard Home配置部分

                                                                        AdGuard Home部分没有什么需要特别注意配置的,只需要指定上游DNS为Dae所在机器IP地址即可。需要注意的是,如果使用MosDNS作为Dae的DNS解析服务程序,AdGuard Home中不要指向MosDNS的地址,会造成内存泄露以及高CPU占用。公共DNS服务器可以参考:国内外DNS推荐列表 | Dolingou
                                                                        我所使用的MosDNS配置文件可以参考:mosdns-config-with-no-leak
                                                                        notion image

                                                                        🤗 总结归纳

                                                                        目前情况良好,暂时没有出现错误问题,且能够更方便的对特定客户端、域名进行放行。
                                                                         

                                                                        后续

                                                                        由于AdGuard Home与Dae处于同一台机器,在使用must_direct规则时会造成DNS泄露问题,但如果使用direct规则,在AdGuard Home中又无法正常识别发出DNS请求的客户端,所以我最终还是选择在PVE中新建一个CT容器(LXC),单独负责AdGuard Home和Tailscale。AdGuard Home的上游DNS指向Dae所在的内网IP地址,同时在Dae中,对private部分规则使用direct规则,既满足避免DNS泄露的需要,又满足对各客户端DNS请求的管理。
                                                                        这也是我第一次使用LXC,CT模板使用的是alpine,目前对效能感到满意,在未开启AdGuard Home时,CPU占用几乎没有,内存占用13MB左右,开启AdGuard Home的情况下,单核CPU占用0.4%,内存占用不到50MB。
                                                                        在使用局域网其他机器作为DNS入口时,需要在Dae的Routing中增加以下配置,避免DNS请求环路,将下面的10.0.0.20 替换为你的DNS服务入口IP地址。
                                                                         
                                                                        同时由于内存泄露问题,建议使用Dae而非Daed,同样配置文件,在Dae下内存占用不到500M,但是Daed基本要奔着1G去了,长时间使用情况下,Daed的内存泄露问题更为严重。在Dae的版本上,目前我在使用Dae 0.9rc2情况下,存在CPU占用虚高问题,0.8版本未出现问题。
                                                                        我自身配置问题,与Daed无关,配置正确情况下,未发现Daed出现内存泄露情况。同时初始内存占用也没有1G。
                                                                        另外,如果使用其他机器作为DNS入口,那么其指向的DNS应为Dae所在机器的IP,不要直接指向MosDNS,由Dae再指向MosDNS,避免DNS重复劫持,造成内存泄露与CPU高占用,配置文件大致如下:
                                                                        AdGuard Home中的上游DNS指向Dae所在机器IP,同时Dae的DNS部分配置指向MosDNS端口

                                                                        关于AdGuard Home的卸载

                                                                        由于已经在LXC容器中单独部署了AdGuard Home,所以原来Debian机器上的AdGuard Home就可以卸载了,首先找到AdGuard Home二进制文件的位置,Debian/Ubuntu系统的位置一般位于/opt/AdGuardHome
                                                                        执行以下命令注销AdGuard Home相关服务
                                                                        删除AdGuard Home工作文件夹

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关AdGuard Home安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        实验性:不使用Dnsmasq绕过中国大陆IP

                                                                        2024年9月6日 08:00
                                                                        ⛏️
                                                                        OpenClash的“实验性:绕过中国大陆IP“功能是通过Dnsmasq进行实现,旨在将国内IP通过防火墙转发规则,国内IPv4和IPv6的流量不经过Clash(Mihomo)内核处理,增强直连性能,降低OpenWRT软路由的资源占用。对于进阶使用用户来说,在使用上存在诸多不便,例如无法与MosDNS、Adguard Home完美配合。我作为一个只能看懂一部分代码,完全不会写的选手,在ChatGPT和Cursor的帮助下,尝试找到一个不依赖于Dnsmasq,也可以使中国大陆IP流量不经过Clash(Mihomo)内核的方法。
                                                                         
                                                                        本篇的配置项目前还未经过长时间生产环境使用,可能存在不稳定、规则冲突、未知问题等可能。在操作之前,请进行备份,避免无法恢复的网络宕机。

                                                                        实验环境

                                                                        • 旁路由(旁路网关):OpenWRTImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
                                                                          • 接口为br-lan,网关为主路由IP地址
                                                                          • 运行OpenClash作为科学服务
                                                                          • 内核版本为5.15.167(stable)
                                                                          • 架构X86_64

                                                                        📝 实验性:绕过中国大陆IP的原理

                                                                        OpenClash的大部分核心外功能实现基本都是通过/etc/init.d/openclash这个启动文件实现。在文件中,涉及实验性:绕过中国大陆IP的主要功能部分包括:
                                                                        • ip set/nft set 管理,也就是IP集合管理
                                                                        • China_ip_route规则匹配及重定向
                                                                        • 利用Dnsmasq进行国内域名列表(/etc/openclash/accelerated-domains.china.conf)内的域名解析

                                                                        IP集合

                                                                        OpenClash内置了两个IP集合,分别为China_ip_route集合和China_ip_route_pass集合,通过插件设置 - 大陆白名单订阅 进行维护,没有使用GeoIP:CN进行维护。

                                                                        China_ip_route规则匹配

                                                                        在Openclash选择绕过大陆IP时,通过fw4进行进行流量检测,当检测到目标IP地址属于中国大陆时,通过openclash链、openclash_mangle链、以及openclash_mangle_out链进行return操作,使流量按原链继续进行,不再经由clash内核进行处理。

                                                                        openclash_mangle链

                                                                        openclash_mangle链的作用是用于修改流量的特性,通常用于更改数据包的标记、TTL(生存时间)等,对流量进行细颗粒度控制,标记流量进行后续处理等。
                                                                        • 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
                                                                        • 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。
                                                                          • 如果不等于2,即不使用防火墙劫持:nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return’
                                                                          • 如果等于2:nft 'add rule inet fw4 openclash_mangle ip daddr @china_ip_route counter return’

                                                                        openclash链

                                                                        openclash链主要用于处理进入的流量。这个链通常用于根据特定的规则对流量进行分类和处理。
                                                                        • 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
                                                                        • 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。
                                                                          • 如果不等于2,即不使用防火墙劫持:nft 'add rule inet fw4 openclash ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return'
                                                                          • 如果等于2:nft 'add rule inet fw4 openclash ip daddr @china_ip_route counter return'

                                                                        openclash_mangle_output链

                                                                        openclash_mangle_output链专门用于处理输出流量,即从本地系统发出的流量(路由器本机流量)。之前我只配置了mangle链和openclash链,没有对openclash_mangle_output链进行防火墙配置,导致mosdns的还是会经过clash(mihomo)核心,也造成在多并发进行DNS请求时,upstream errorexchange failed等错误,同时由于本来应该直连的DNS公众服务器,绕到Clash(Mihomo)核心走了一圈,所以解析速度也有所下降。
                                                                        • 条件判断:检查变量 china_ip_route 是否等于 1。如果是,表示启用了绕过中国大陆IP。
                                                                        • 嵌套条件判断:检查变量 enable_redirect_dns 是否不等于 2。这里0是不劫持DNS,1是通过dnsmasq劫持,2是通过防火墙劫持。其中,skuid≠65534为非特权用户,即nobody用户
                                                                          • 如果不等于2,即不使用防火墙劫持:nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route ip daddr != @china_ip_route_pass counter return'
                                                                          • 如果等于2:nft 'add rule inet fw4 openclash_mangle_output skuid != 65534 ip daddr @china_ip_route counter return'

                                                                        China_ip_route_pass规则匹配

                                                                        China_ip_route_pass这个IP集是通过劫持Dnsmasq,使用设定的dns对国内常见域名(也就是/etc/openclash/accelerated-domains.china.conf 文件内域名)进行解析并生成的IP集。这部分非常依赖于Dnsmasq,但在我们这里由于已经有MosDNS进行分流,所以不用过于关注。

                                                                        📝 配置流程

                                                                        China_ip_route的nft规则配置

                                                                        通过对上面fw4表内openclash链、openclash_mangle链以及openclash_mangle_output链的分析,可以基本明确我们要进行带操作。
                                                                        • 首先我们需要处于fake-ip模式
                                                                        • 关闭实验性绕过中国大陆IP选项,因为我们要手动添加防火墙规则进行绕过
                                                                        • 关闭DNS劫持
                                                                        在关闭DNS劫持的同时,我们符合enable_redirect_dns 选项,即没有使用防火墙劫持DNS,所以我们采用if下的第一条判断结果。

                                                                        添加防火墙规则

                                                                        由于防火墙规则采用顺序匹配,如果我们采用add的方式,无论如何只会附加规则至每条防火墙规则链的底部,所以这里采用insert方式。

                                                                        openclash链

                                                                        openclash_mangle链

                                                                        openclash_mangle_output链

                                                                         
                                                                        添加完成之后,在Openclash的页面进行重置所有链接,同时观察是否有匹配国内IP的流量进入列表,如果没有即表示成功。同时在OpenWRT的防火墙页面,应该可以找到我们添加的规则以及对应规则匹配的计数,通过这个也可以观察是否绕过成功。
                                                                        notion image

                                                                        配置OpenClash自定义防火墙规则

                                                                        为了避免每次OpenClash重启或者路由器重启后需要手动重复执行nft命令,我们可以将上述三条规则写入到openclash的自定义规则里面。配置位置位于:插件设置 - 开发者选项
                                                                        notion image

                                                                        关于IPV6

                                                                        由于openclash的实验性:绕过中国大陆IPv6不完全依赖于dnsmasq,所以可以放心开启,不用做特别的配置。

                                                                        关于规则更新

                                                                        由于目前使用的是大陆白名单提供的IP地址集,所以可以通过OpenClash提供的Web端页面进行更新,也可以在页面配置定时更新,不必过多担心IP地址变化带来的白名单错乱。之后我也会尝试使用GEOIP:CN作为IP集进行研究。

                                                                        已知问题

                                                                        会使之前配置的DNS防泄漏无效,目前还在研究是哪个环节出现的问题。

                                                                        🤗 总结归纳

                                                                        这次主要折腾的原因在于很羡慕Dae的直连性能,但是还没有把Dae放在生产环境真正的使用过,所以想看看有没有什么办法在不使用dnsmasq,仅通过防火墙进行一些修改,让mosdns+openclash这套配置更为完善,同时也能让自己更为熟悉fw4、nftable以及OpenWRT的防火墙配置。
                                                                        通过上面对nft命令以及规则的了解,也可以通过nft进行局域网设备的黑名单配置,使特定设备流量不进入到Clash(Mihomo)内核,避免违反机场的TOS规则,例如BT、PCDN等等。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        IPv6与OpenWRT旁路由共存:代理分流与原生地址的完美平衡

                                                                        2024年8月19日 08:00
                                                                        🚧
                                                                        搬家之后,原来的网络拓扑结构放在新家里总会出现奇奇怪怪的问题,尤其是在IPv6这方面。一方面我非常希望家里可以用上体验良好的IPv6(远程串流、BT、内网穿透等等都不用受制于没有公网IP),同时又不想因为IPv6而在IPv4的外网方面有所妥协,比如无法使用Netflix一类,或者无法使用到IPv6这种无NAT的,可以端到端的特性。目前整体的网络算是调整完毕,也将整体的调整过程写一篇博客进行记录,希望可以帮到面临相同问题的朋友。
                                                                        为什么要使用IPv6? 我只能说,这是一个趋势:《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》。目前国内IPv6基本已经处于可用状态,线路优化相比之前也有了很大提升。不过需要注意的是,目前国内的IPv6是禁止国外IPv6请求入站,至少是禁Ping,部分运营商因为PCDN的缘故,也会直接禁止IPv6入站。

                                                                        📝 付费内容

                                                                        配置前提

                                                                        1. 运营商下发的IPv6 PD前缀应小于64,一般来说都是60-62左右。如果你的运营商没有下发类似的前缀,或者下发的前缀为/64,那么这篇文章的内容可能并不适用于你的网络环境。具体可以在这里查看:调查下各地运营商光纤宽带分配的 IPv6 PD 前缀的长度 - V2EX
                                                                        1. 机场代理支持IPv6(例如我的TAG Internet)。
                                                                        1. 主路由和旁路由均为OpenWRT系统(基于ImmortalWRT),其他系统需要根据需要自行摸索。
                                                                        1. 尽量从纯净系统方案下进行配置,避免软件或规则冲突。同时做好备份。
                                                                        1. Windows下可以通过getmac /v 命令查看本机网卡的mac地址。

                                                                        网络拓扑

                                                                        notion image

                                                                        网络目标

                                                                        整体的网络设计是需要有一个清晰的目标所谓导向,所有的解决方案都是为了实现这个目标。那么我在新家的网络目标如下:
                                                                        1. 旁路网关(旁路由)架构,可以实现对不同客户端的IPv4网关及DNS配置。同时旁路网关不负责任何NAT转换操作。
                                                                        1. 国内IPv4流量可通过旁路网关 - 主路由网关 的路径,特定设备可直接通过主路由网关 ,避免因为BT、PCDN等对旁路网关上的代理机场产生影响。
                                                                        1. 国外IPv4流量通过旁路网关 - OpenClash的Mihomo内核进行分流及代理。
                                                                        1. 所有IPv6流量默认通过旁路网关 - OpenClash的Mihomo内核进行分流及代理,国外IPv6流量可通过机场的IPv6节点进行代理使用相关服务。
                                                                        1. 国内IPv6流量使用运营商分发前缀分配的IPv6地址,且可通过客户端配置绕过旁路IPv6网关,实现使用原生IPv6地址使用BT功能。
                                                                        1. 通过旁路静态路由配置实现特定设备直接使用主路由IPv6网关(未实现)
                                                                        针对网络目标的1、2、3点,已经有很多的教程指导如何实现。包括但不限于通过主路由的dnsmasq实现自定义给客户端下发的网关地址、DNS等等。我在之前也写过一篇文章,可以参考:Dnsmasq进阶技巧:为不同设备定制DNS服务器
                                                                        针对文中的4、5点,可以进行拆分,将主路由和旁路网关(旁路由)在网络中的职责进行细化:

                                                                        主路由

                                                                        1. 从运营商获取可分配的IPv6前缀,也就是需要小于64位的前缀。
                                                                        1. 不作为局域网内的RA服务器,原因在于在IPv6的网络环境下,客户端会自动将RA服务器作为其默认的网关,而在我们的网络目标中,整体网络中距离客户端最近的网关应该是旁路网关。
                                                                        1. 以中继方式将DHCPv6-PD过渡给旁路网关(旁路由),将局域网内的IPv6地址分配任务交给旁路网关实现。

                                                                        旁路网关(旁路由)

                                                                        1. 从主路由(上级网关)获得DHCPv6-PD的分配权限
                                                                        1. 作为RA(IPv6 Router Advertisement)服务器,但不作为DHCPv6的服务器,通过RA向局域网内的客户端提供IPv6地址分配功能,从而使客户端的默认网关及DNS为旁路网关。这样仅需要对特定设备进行特殊化配置,同时在一个局域网中只存在一个DHCPv6服务器,避免多服务器优先级造成分配紊乱,例如存在两个DHCPv6服务器时,客户端IPv6 DNS无法获取这种问题。同时因为主路由通过RA服务器启用SLACC,所以也支持Android设备的地址分配。如果主路由未启用RA服务器和SLACC,只有旁路由开启,我测试下来是Android设备还是获取不到公网的IPv6地址。
                                                                        1. 其实还有一种方法是通过radvd方式强制提高旁路由的RA服务优先级,从而使局域网内设备使用旁路由所提供的RA信息,但由于一方面radvd较老,OpenWRT并没有提供编译好的安装包,自行编译的依赖关系又很乱;另一方面局域网内存在两个RA Server终究是一个潜在的隐患,所以不采用此方案。

                                                                        解决方案

                                                                        主路由:

                                                                        1. 首先在全局网络选项中清空IPv6 ULA 前缀
                                                                        1. 配置WAN_6口:获取运营商IPv6前缀及PD权限。这里有两种方法,都可以:
                                                                          1. 修改原WAN口设置:高级设置中,获取IPv6地址为自动。这种方法可在WAN口PPPoE拨号成功之后,自动生成一个WAN_6的虚拟动态接口,同时获得IPv6地址及PD前缀。
                                                                          2. 新增一个WAN_6接口:协议选择DHCPv6,设备选择接口别名:"@wan" 。防火墙配置选择wan,DHCP选项中的IPv6设置全部选择中继。高级设置中委托IPv6前缀开启,IPv6分配长度64,IPv6后缀填写EUI64 ,便于生成的IPv6地址记忆,在配置防火墙规则时更好用。
                                                                        1. 配置原WAN口:修改DHCP服务器中的IPv6设置全部为中继模式;高级设置中的IPv6源路由勾选,委托IPv6前缀不勾选,分配长度禁用。
                                                                        1. 配置LAN口:不需要新增LAN_6口,使用原LAN口即可完成中继;
                                                                          1. 高级设置:委托IPv6前缀勾选,委托长度60(具体看运营商可以给多少长度的PD),其他默认。
                                                                          2. DHCP服务器 - IPv6设置:指定主接口不勾选;RA服务启用服务器模式,默认路由自动,RA标记其他配置(Stateless无配置);DHCPv6服务选择服务器模式(中继模式无法将PD下发到旁路),通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,本地IPv6 DNS服务器不勾选,通告域名空,NDP代理中继,前缀有效期和遵守IPv4有效期默认。
                                                                        1. 修改/etc/config/dhcp ,在config dhcp lan 下增加配置:option ra_preference ‘medium’ ,配置主路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。

                                                                        旁路网关(旁路由):

                                                                        我的旁路网关只有一个LAN口,没有配置WAN口。
                                                                        1. 首先在全局网络选项中清空IPv6 ULA 前缀
                                                                        1. 配置LAN_6口:
                                                                          1. 新增一个LAN_6口,协议选择DHCPv6,设备选择接口别名:"@lan" 。目的是通过@lan口与主路由的lan口对接,从而获得IPv6地址。
                                                                          2. 请求IPv6地址:选择force,选择try也可以
                                                                          3. 请求指定长度的IPv6前缀:填写你在主路由获取的PD的地址后面的数字+1或2,例如我在主路由的PD地址是240e:3a4:****:****::/60 ,那么我在这里填写的就是62,理论上61也可以获取,但只影响可分配地址的范围,家用环境下区别不大,没有那么多的设备。
                                                                          4. 高级设置:使用默认网关勾选;自动获取dns服务器勾选;IPv6源路由勾选;委托IPv6前缀勾选;IPv6分配长度64;前缀过滤器不选择;IPv6后缀填写EUI64;IPv6优先级默认0
                                                                          5. 防火墙设置:防火墙选与不选区别不大,或者我还没发现有什么区别。
                                                                          6. DHCP服务器:常规设置,忽略此接口;IPv6设置,指定主接口勾选,其他全部禁用(包括RA服务、DHCPv6服务、NDP代理,这些都是需要在LAN口实现,LAN_6口不进行提供)
                                                                        1. 配置LAN口:
                                                                          1. 高级设置:委托IPv6前缀不选;IPv6分配长度禁用;剩下默认
                                                                          2. DHCP服务器:IPv6设置下,指定主接口不勾选,RA服务器为服务器模式,DHCPv6服务为设置为中继模式,因为我们主路由已经配置了DHCPv6服务器,通告的IPv6DNS服务器填写旁路由的本地IPv6 DNS服务器地址,例如我的为fe80::****:****:****:f02d ,这个地址可以通过ssh到旁路由,ifconfig查看到;通告的DNS域名为空;NDP代理中继。
                                                                          3. IPv6RA设置:默认路由器,选择在可用的前缀上;启用SLACC勾选;RA标记,其他配置;其他默认。
                                                                            1. 受管配置:开启后,客户端会请求 DHCPv6 服务器提供完整的网络信息(如 IP 地址、DNS 信息等)。这种模式下,客户端不再自行生成 IPv6 地址(即不通过 SLAAC 自动配置 IP 地址),即IPv6的有模式(Stateful),完全依赖DHCPv6进行地址分配,但在Android下无法使用。
                                                                            2. 移动home配置:移动 Home 标志(H Flag)用于标识一个节点是否可以在移动环境下与 Home Agent 通信。这对家庭用户或一般路由配置通常没有实际意义,除非涉及到特殊的移动 IPv6 配置。
                                                                            3. 其他配置:在启用了 SLAAC(无状态自动配置)时,客户端可以自动生成 IPv6 地址,但需要通过 DHCPv6 获取额外的配置信息(如 DNS)。这个标志位通常用于混合环境,即 IP 地址通过 SLAAC 自动生成,而其他信息通过 DHCPv6 获取。在关闭受管配置,并开启其他配置时,即IPv6的无模式(Stateless),不通过DHCPv6进行地址分配。
                                                                          4. 如果LAN_6和LAN口都开启委托IPv6前缀,那么一个设备大概会生成4个IPv6地址,但我们并不需要那么多,所以可以将LAN口的委托关闭。
                                                                          5. 修改/etc/config/dhcp ,在config dhcp lan 下增加配置:option ra_preference ‘high’ ,提高旁路由RA优先级,从而使客户端设备优先选择旁路由RA服务器所通告的动态网关。
                                                                         
                                                                        通过以上配置之后,主路由大概是这样:
                                                                        notion image
                                                                        旁路由大概是这样:
                                                                        notion image
                                                                        同时,现在旁路由作为整个局域网中唯一的RA服务器,也就成为了唯一的通告网关。

                                                                        Dnsmasq设置:

                                                                        如果你还在使用Dnsmasq作为DNS转发器,那么需要关闭过滤器 - 过滤IPv6 AAAA记录,从而使Dnsmasq可以解析IPv6域名。
                                                                        notion image

                                                                        OpenClash设置:

                                                                        OpenClash这里没什么好说的,我选择的是mihomo内核(clash_meta内核)。废话不多说,直接上图,就是把IPv6配置项这页配置一下。代理模式可以根据需要进行选择,由于我是Fake-IP的混合模式很久了,且需要代理一些UDP流量,所以这里选择的TUN模式,同时在ipv6我也使用的是tun模式。tproxy可能性能会更好一些,但不清楚是否会有其他NAT问题出现。
                                                                        值得一提的是,这里的实验性:绕过中国大陆IPv6并不依赖于Dnsmasq,所以如果使用其他DNS转发服务的话(例如MoDNS或者AdGuard Home),也可以放心勾选。同时,如果已经使用mosdns进行分流,并且dnsmasq监听端口为53之外的端口,也可以开启实验性:绕过中国大陆IP ,开启后会通过nft set或者ipset将大陆IP端添加到防火墙中,不经过clash核心,提高性能,丧失的只是将dnsmasq通过特定dns解析返回的大陆IP地址添加到ipset这一项。 具体可以参考《实验性:不使用Dnsmasq绕过中国大陆IP》这篇文章。
                                                                        notion image

                                                                        路由设置:

                                                                        在以上配置完成之后,可能存在客户端ping外网出现Destination host unreachable的情况,通过查看路由表发现是旁路网关没有将主路由网关配置到路由表中,需要自己自行添加,lan口和lan6口都需要添加。
                                                                        路由类型:unicast
                                                                        目标:::/0
                                                                        网关:主路由的本地IPv6网关地址,fe80::开头,可以通过SSH登录主路由之后ifconfig查看,LAN口的就是。
                                                                        高级设置:表main(254)
                                                                        notion image

                                                                        🤗 总结归纳

                                                                        通过以上设置的话, 现在局域网内设备应该是可以获取到/64位的IPv6地址,且所获得的IPv6地址的默认网关及DNS服务器为旁路网关,达到了整个局域网内的IPv6使用代理。在Test your IPv6. (test-ipv6.com)上也可以检测出IPv6地址为代理的IPv6地址,同时针对不需要代理的服务,我们的IPv6地址还是运营商分发的前缀。
                                                                        notion image
                                                                        notion image
                                                                        其他针对BT客户端这种,我是通过单独虚拟一张网卡给qBitorrent使用,并单独配置这张网卡的网关为主路由网关,避免BT流量经过旁路由,可以正常使用。
                                                                        notion image
                                                                         

                                                                        其他待解决问题:

                                                                        目前网心云可以获取到运营商分发的前缀的IPv6地址,但状态显示IPv6待联通,通过Hyper-V虚拟机内部可以ping通外部IPv6地址,需要再进行观察一下,看看是否需要单独进行配置。目前在尝试通过静态路由或者防火墙的方式进行解决。
                                                                         
                                                                        如果你从主路由无法ping通局域网下设备的link-local ipv6 address ,也就是本地fe80开头的IPv6地址,出现address unreachable 错误,可以尝试为地址增加接口参数,例如:
                                                                        其中%br-lan即指定接口为br-lan,也就是本地网络接口。
                                                                         
                                                                        2024/09/30更新:
                                                                        网心云X86虚拟机默认只会接收一个RA服务器发送的SLACC,所以如果网络中存在多个RA服务器,那么网心云X86即便可以获取到正确的公网IPv6地址,也无法配置正确的网关和DNS,所以在网心云App中会显示IPv6待连通的情况。解决办法只能修改局域网的网络拓扑,变更为局域网只有一个RA服务器,且停用DHCPv6服务器。在OpenWRT下的具体方法我还在研究,目前仅能提供RouterOS作为主路由情况下的解决办法:RouterOS自动分流方案(支持IPv4 & IPv6)

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关OpenWRT IPv6安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        解决OpenWRT中VIM报错‘Failed to source defaults.vim’问题

                                                                        2024年3月30日 08:00
                                                                        通过OpenWRT的包管理器opkg进行vim-9.0安装后,在使用时会报错:
                                                                        即便是安装vim-full没有办法解决,所以应该不是缺少依赖一类的问题。这个错误虽然不影响正常使用,但是每次编辑文件时都需要再按一下回车键,也很烦,所以我找了一下解决办法。

                                                                        📝 解决方法

                                                                        在OpenWRT终端中输入下面命令:
                                                                        返回结果:
                                                                        即可。
                                                                        再次进入Vim就不会有E1187: Failed to source defaults.vim Press ENTER or type command to continue的报错提示了。
                                                                        还有一种方法,通过建立软链接方式:
                                                                        如果是非root用户:
                                                                        也可以解决问题。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关OpenWRT和VIM安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        NieR Automata Ver 1.1a 【第八集已更新】

                                                                        2023年5月6日 08:00
                                                                        ⚠️
                                                                        《尼尔:自动人形 Ver1.1a》是一部备受期待的动画作品,改编自广受好评的游戏《尼尔:机械纪元》。由A-1 Pictures制作,益山亮司执导。该动画于2023年1月7日开始播出,融合了科幻、哲学、动作元素与二次元,完美呈现了原作游戏的魅力和性癖。本文提供最新的第八集更新信息,包括高清下载链接和字幕资源。无论是游戏粉丝还是动画爱好者,这部2023年的热门作品都值得一看。
                                                                         
                                                                        notion image

                                                                        友情提示!Netflix也可以看的!已经上Netflix了!合租可以看这里:

                                                                        三周没更新啦!!!!想念A2!!!!

                                                                        【NEW】第八集:[ANi] NieRAutomata Ver11a - 尼爾:自動人形 Ver1.1a - 08 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]

                                                                        INFO
                                                                        Torrent Info By: ANi API (Auto Generated)Subtitle: HardSub 中文繁体Mediainfo: Resolution: 1080P Video Format: AVC Audio Format: AAC
                                                                        Magnet

                                                                        第七集:[神楽坂 まひろ] 尼爾:自動人形 Ver1.1a / NieR:Automata Ver1.1a - 07 (CR 1920x1080 AVC AAC MKV)

                                                                        Information:
                                                                        Overall Bit Rate: 8 186 kb/s字幕: Deutsch (Germany), English (US), Español (Latin America), Español (España), Français (France), Italian (Italy), Português (Brasil), Русский (Russia), 中文(简体)| 繁化姬, 中文(繁體)时长: 00:23:41.660CRC32: BACE4467MediaInfo
                                                                        中文字幕需要手动调整,提前5秒钟左右。后续更新字幕组版本。
                                                                        默认屏蔽迅雷客户端。
                                                                        织梦字幕组版本为:[织梦字幕组][尼尔:机械纪元 NieR Automata Ver1.1a][07集][1080P][AVC][简日双语]
                                                                        Magnet

                                                                        第六集:[NanakoRaws] NieR Automata Ver 1.1a - 06 (1080p).mp4

                                                                        阿里云盘中为4K版本
                                                                        Magnet

                                                                        第五集:[NanakoRaws] NieR Automata Ver 1.1a - 05 (1080p).mp4

                                                                        阿里云盘中为4K版本
                                                                        Magnet
                                                                        #尼尔:机械纪元 动画版 尼尔:人工生命
                                                                         
                                                                        💡
                                                                        有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                        DAE搭配MosDNS使用配置

                                                                        2024年10月12日 08:00
                                                                        😀
                                                                        本篇文章并非DAE及DAED的安装配置入门文章。关于DAE与DAED的安装方法之后会单独编写。本篇文章主要内容为在使用DAE或DAED的情况下,如何搭配MosDNS使用,提供一个高兼容性、高可用性的配置方案。以下内容基于Debian系统。

                                                                        📝 DAE的DNS原理

                                                                        DAE的分流原理

                                                                        域名通过劫持 DNS 请求,将 DNS 请求的域名与所查 IP 进行关联来得到。尽管这种方式有一些问题:
                                                                        1. 可能会出现误判。例如需要分流到国内和国外的两个网站拥有同一个 IP,且在短时间内同时被访问,或浏览器有 DNS 缓存。
                                                                        1. 用户的 DNS 请求必须通过 dae。例如将 dae 设为 DNS,或在 dae 作为网关的情况下使用公共 DNS。
                                                                        ———
                                                                        DAE对程序所在网关进行全部流量的处理,且与其他代理程序不同,并不提供DNS的转发端口,而是采用对只有经过该网关的全部DNS请求才会分流,所以无法直接使用原有代理程序那些套娃的DNS行为。
                                                                         
                                                                        更新:
                                                                        需要注意的是,如果上游MosDNS采用并发策略,一段时间后,可能会存在造成Dae内存泄露的情况,内存占用由原来的500M左右,增加至1G左右。目前原因还在排查。
                                                                        MosDNS关系不大,如果手机使用相同订阅代理并连接同网WIFI,在内网会产生环回请求造成泄露。

                                                                        常规代理程序DNS请求及解析

                                                                        notion image
                                                                        在未通过公共DNS或者代理远端DNS请求解析的情况下,常规代理软件是可以进行DNS的无限套娃的,并不会返回给客户端解析的结果。在套娃的过程中可以不断针对不同的DNS请求进行过滤和分流,在日常使用中能够极大的提供便利,例如AdGuard Home的广告过滤与可视化控制面板、MosDNS的并发DNS请求、ECS请求等等。

                                                                        DAE的DNS请求与解析

                                                                        notion image
                                                                        DAE的不同点在于,在流量进入网关开始即进行分流,且基于Domain的分流模式必须将DAE作为唯一的DNS入口,在顺序上相当于将将代理程序前置作为入口,且由于DAE并不提供DNS转发的监听端口,所以无法后置于其他DNS程序。

                                                                        📝 DAE与MosDNS的配合

                                                                        DAE提供了一份使用外置DNS程序的指南:
                                                                        external-dns.md
                                                                        daeuniverse
                                                                        根据这份指南我们可以对整体家庭局域网内的DNS请求链路进行梳理如下:
                                                                        notion image
                                                                        例如我在使用MosDNS的情况下,将GeoSite:CN的域名通过MosDNS并发请求阿里的公共DNS服务器,取得结果。同时对GeoSite:GFW以及Graylist(自定义灰名单)的域名使用Google的公共DNS进行请求,使其回到DAE的分流规则之内,这样既满足使用MosDNS并发请求加快DNS解析速度、ECS提供就近CDN节点的同时,也不会扰乱DAE基于domain的分流配置。

                                                                        DAE DNS配置

                                                                        主要配置为红色字体部分,DAE的DNS部分仅作为流量的监听,所有DNS的解析均发往MosDNS进行解析,无论是否被污染,由MosDNS中的规则进行DNS分流。

                                                                        DAE Routing配置

                                                                        主要部分为红色部分,将MosDNS进程放在must_direct策略内,不将DNS流量重定向到dae并继续匹配,避免产生回环。同时因为可继续匹配,所以MosDNS中使用Google Public DNS规则流量还可以继续进入DAE执行远端请求。

                                                                        MosDNS配置

                                                                        定义Tag

                                                                        主序列配置

                                                                        query_nocn配置

                                                                        主DNS服务由Google Public DNS提供,副DNS服务由NextDNS服务提供,在使用Google Public DNS时流量会重新进入DAE,完成解析,获得无污染结果。

                                                                        🤗 总结归纳

                                                                        目前这套方法是我用下来最为舒服的,在解析速度和识别被污染域名方面均可以满足我的需要,同时对劫持到反诈页面也有很好的规避效果,例如Linux.do等网站打开也不会被劫持了。唯一不太方便的地方在于对于污染域名的配置上,在添加DNS的自定义规则时,需要在MosDNS的自定义文件内添加,例如我的是graylist
                                                                        理论上,在此基础上还可以进行套娃,例如使用AdGuard Home等,但由于DAE作为入口劫持所有的流量,所以AdGuard Home的客户端会仅显示为DAE客户端。所以建议如果使用AdGuard Home,可将AdGuard Home放置于另外的容器或主机上作为DNS入口,同时上游配置DAE所在主机IP。

                                                                        📎 参考文章

                                                                         
                                                                        💡
                                                                        有关DAE安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                                                         

                                                                        Android免拔SIM卡使用官方TikTok

                                                                        2025年1月4日 08:00
                                                                        😀
                                                                        TikTok(抖音国际版或者洋抖)在中国(大陆及香港地区)无法正常使用,原因在于TikTok会检测SIM卡的国家代码,若为中国大陆或香港用户则会直接提示“TikTok 网络错误”或无法使用完整功能,即便已经使用纯净IP的家宽节点。目前常见的解决方法包括拔除SIM卡或修改TikTok应用,即所谓的解锁版,出于账号安全原因,并不建议使用这种Tiktok破解版。今天,我们将介绍一种无需拔卡即可使用官方TikTok的方法。

                                                                        📝 Tiktok检测原理

                                                                        TikTok检测中国大陆及香港地区用户的原理主要基于以下三个方面:
                                                                        1. SIM卡检测
                                                                          • 国家代码检测:TikTok通过读取设备上的SIM卡信息来确定用户所在的国家或地区。中国大陆的SIM卡通常会有特定的国家代码(如CN),当TikTok检测到此代码时,会限制用户的功能或直接显示网络错误。
                                                                          • 运营商识别:TikTok还可能通过识别SIM卡所属的运营商来进一步确认用户的地理位置。
                                                                          1. IP地址检测
                                                                            • 地理定位:TikTok会通过用户的IP地址来判断其所在的地理位置。如果IP地址显示用户位于中国大陆,TikTok会采取相应的限制措施。
                                                                            • 动态IP检测:为了防止用户通过VPN等方式绕过检测,TikTok可能会监控IP地址的动态变化,识别异常的IP行为。
                                                                            • IP地址干净度:TikTok会尝试对BGP机房的IP地址进行阻止访问,原因在于大部分通过机房线路IP所来的请求为代理请求。
                                                                            1. 设备信息检测
                                                                              • 设备标识符:TikTok可能通过读取设备的唯一标识符(如IMEI、MAC地址等)来识别用户的设备,并根据设备的注册地或其他信息进行判断。
                                                                              • 系统语言和时区:TikTok还会检查设备的系统语言和时区设置,如果这些设置与中国的标准一致,也可能触发检测机制。
                                                                              以上检测部分,第二点IP地址检测我们可以通过代理方式进行解决,使用纯净的家宽节点完全可以规避检测。第三点可以通过修改手机语言方式进行解决,时区部分我实测目前没有影响。
                                                                              所以剩下的就是第一点,SIM卡检测。这也是为什么现在大多数的Tiktok使用教程均需要将SIM卡从手机移除。而现在通过Nrfr这个开源软件,即可实现SIM卡国家码的修改,从而完全避开TikTok检测,正常使用TikTok,无需ROOT,而且也不用担心各种Tiktok解锁版、Tiktok破解版的程序后门。在Google Play应用商店也可以同步进行更新Tiktok版本。

                                                                              📝 Nrfr介绍

                                                                              Nrfr是一款强大的 SIM 卡国家码修改工具,无需Root权限即可修改SIM卡国家码。本项目完全基于Android系统原生API实现,不依赖Xposed、Magisk等任何第三方框架,仅通过调用系统级接口实现功能。通过修改国家码,你可以:
                                                                              • 🌏 解锁运营商限制,使用更多本地功能
                                                                              • 📱 优化信号显示和网络选择
                                                                              • 🔓 突破某些区域限制的应用和服务
                                                                              • 🛠️ 解决国际漫游时的兼容性问题
                                                                              • 🌐 帮助使用海外SIM卡获得更好的本地化体验
                                                                              • ⚙️ 解决部分应用识别SIM卡地区错误的问题

                                                                              实现原理

                                                                              Nrfr通过调用Android系统级API(CarrierConfigLoader)修改系统内的运营商配置参数,而不是直接修改SIM卡。这种实现方式:
                                                                              • 完全在系统层面工作,不会对SIM卡本身进行任何修改或造成损坏
                                                                              • 仅改变系统对SIM卡信息的读取方式
                                                                              • 基于Android原生API实现,不依赖任何第三方框架(如Xposed、Magisk等)
                                                                              • 通过Shizuku仅提供必要的权限支持
                                                                              • 所有修改都是可逆的,随时可以还原

                                                                              📝 Nrfr使用教程

                                                                              开启开发者模式

                                                                              这里以我的小米15(澎湃OS2)为例,不同手机品牌与系统可能存在差异。
                                                                              打开设置 ,点击我的设备 ,快速且疯狂的点击OS Version(OS版本?系统版本?),直到提示"You are already a developer" ,即表示开启开发者模式成功。
                                                                              开发者模式选项位于更多设置 - 开发者选项

                                                                              开启USB调试

                                                                              进入开发者选项 ,下滑找到USB调试 ,点击开启。如果是澎湃OS2系统,会进行一些风险提示,选择允许。然后找到USB安装 ,同样点击进行开启。如果你是小米手机,或使用MIUI系统或澎湃OS系统,还需要开启USB调试(安全设置)。

                                                                              安装Shizuku

                                                                              Nrfr的使用需要通过Shizuku获得Android系统的调试权限。所以第一步需要安装Shizuku。你可以通过Google Play进行下载安装,或者通过Shizuku的Github下载最新的Released版本。
                                                                              Google Play:Shizuku
                                                                              Github Released: GitHub Release

                                                                              Shizuku配对

                                                                              首先将手机连入一个无线网络(WIFI),有无互联网连接都无所谓,其他手机的热点也可以。原因在于,在未连接WIFI的情况下,无法启用Android开发者模式的无线调试。
                                                                              同时,小米手机用户(澎湃OS2)需要修改通知样式为Android默认样式,否则无法在通知栏输入配对码。位置在通知管理 - 通知显示设置 - 原生样式
                                                                              打开已经安装的Shizuku,找到通过无线调试启动,点击下面的配对,在第一次使用时,Shizuku会提示开启通知权限。
                                                                              点击Shizuku内的开发者选项 ,找到无线调试 ,点击进入,开启无线调试 ,点击使用配对码配对设备 ,然后在Shiziku的通知内,输入配对码完成配对操作。
                                                                              配对完成后,可以将通知样式改回原来的样式。

                                                                              Nrfr安装

                                                                              从Github下载Nrfr。
                                                                              下载完成后,解压并打开Nrfr 快速启动工具
                                                                              将手机通过USB线连接到电脑,保持开启USB调试权限。此时选择设备中会出现你的手机。
                                                                              notion image
                                                                              点击确认选择 ,在检查应用中会提示Nrfr的手机App没有安装,点击确认并继续 ,进行安装。
                                                                              notion image
                                                                              notion image
                                                                              点击安装必须应用,手机上会弹出通过USB安装的提示,点击继续安装
                                                                              notion image
                                                                              点击继续下一步 ,进行Shizuku的启动与授权。
                                                                              notion image
                                                                              此时会弹出Shizuku未授权的提示,需要我们打开Shizuku,在已授权应用中开启Nrfr的授权选项。
                                                                              notion image
                                                                              然后在Nrfr 快速启动工具中,点击启动Nrfr
                                                                              notion image

                                                                              Nrfr设置SIM卡国家码

                                                                              在手机上打开Nrfr,显示如下界面
                                                                              notion image
                                                                              如果是单卡用户,则直接选择SIM卡,然后选择国家码为美国(US)日本(JP) 。双卡用户,修改SIM1 即可,不需要全部进行修改,Tiktok判定其中有一张手机卡的国家码为允许地区的就可以使用。
                                                                              另外需要提示,修改的国家码尽量与你的代理节点出口地址相同,防止因IP与国家码不同所出现的账号问题。同时,建议在登录账号时使用纯净度较高的落地IP,避免Tiktok使用三方登录出现问题。
                                                                              最后需要注意的是,因为Android开发者权限的原因,每次手机重启之后,需要重新通过打开Android开发者模式中的无线调试功能,启动Shizuku及Nrfr,否则Tiktok还是会提示网络错误。

                                                                              🤗 总结归纳

                                                                              至此已完成全部的配置工作,此时通过Google Play安装Tiktok并打开,所有功能已经可以全部正常使用,包括登录自己的Tiktok账号。最近我也是高强度的刷了几天Tiktok,把原本睡前刷抖音的时间全部用来刷了Tiktok,发现短视频这个东西真的是毒,几乎没有什么语言障碍,画面表达的内容有时候无需语言,难怪全世界的人们都上瘾。
                                                                              不过随着1月19日Tiktok禁令的即将生效,以及大量国外用户涌入小红书(Red Note),估计这篇文章的内容也没有太多的意义了。
                                                                              notion image

                                                                              TikTok代理规则

                                                                              如果你也使用Dae,那么可以增加以下规则用于TikTok分流。请将分流指向JP、SG等出口用于正常使用TikTok,香港出口无法使用TikTok。其他软件根据文件格式可自行修改添加。建议使用国外无污染DNS,避免因为解析结果被判定为国内用户。

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关TikTok安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                                                              版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

                                                                              国内外DNS推荐列表

                                                                              2024年9月5日 08:00
                                                                              😀
                                                                              之前介绍了不少关于MosDNS的内容,里面绕不开的一个部分就是用来解析国外域名的DNS服务器应该选择哪家,或者说有哪些无污染的公共DNS服务器可以选择。

                                                                              📝 主旨内容

                                                                              DNS服务器的主要作用是将域名转换为IP地址,同时支持负载均衡、高可用性、反向解析、缓存加速等功能。DNS是互联网的基础设施之一,几乎所有的网络通信都依赖于DNS服务。所以选择一个稳定、高速且无污染的DNS的重要性不言而喻。在使用DNS分流的情况下,对国内域名与国外域名分别配置DNS可以有效提升解析速度与准确性。

                                                                              国内DNS服务器

                                                                              国内的公共DNS服务选择不多,我认为国内DNS只有三个选择,阿里云公共DNS(阿里巴巴)、DNSPod(腾讯)以及各省市运营商下发的DNS。阿里云公共DNS和DNSPod均支持ECS(edns-client-subnet)协议,在一定程度上可以缓解整体解析速度不如运营商DNS的情况。其他例如114、360、百度等等,均有前科,不太推荐选择。
                                                                              同时在国内DNS的选择及使用上,我个人更推荐使用DOH、DOT方式,避免DNS泄露给运营商,从而产生DNS劫持。在部分省份,运营商DNS劫持会将目标网站的解析结果返回为反诈页面,例如被运营商DNS劫持到www.js96110.com.cn
                                                                              名称
                                                                              标准DNS地址
                                                                              DOH地址
                                                                              DOT地址
                                                                              是否支持H3
                                                                              ECS
                                                                              DNSPod
                                                                              119.29.29.29 / 182.254.116.116
                                                                              https://doh.pub/dns-query
                                                                              dot.pub
                                                                              支持
                                                                              AliDNS
                                                                              223.5.5.5 / 223.6.6.6
                                                                              https://dns.alidns.com/dns-query
                                                                              dns.alidns.com
                                                                              支持

                                                                              国外DNS服务器

                                                                              我个人一般会用Google DNSNextDNS、以及AdGuard DNS作为主要无污染DNS使用,NextDNS的免费额度足够家庭使用,当免费额度用完就切换到AdGuard DNS。在Google DNS存在国内访问问题的时候,会选择Quad9或者OpenDNS。Cloudflare DNS在我这里的稳定性和速度并不好,所以很少选择。大多数的国外公共DNS均可以返回无污染的DNS解析结果,这些公共DNS服务基本都支持DNSSEC。
                                                                              在衡量与选择国外公共DNS服务时,延迟与丢包一般是我首先考虑的因素,其次就是DOH和DOT的支持,如果能够支持H3(http3)或者pipeline的话,那么一般就会是首选的DNS服务。其他次级考虑的因素还包括是否支持ECS,如果可以支持ECS,我会选择代理出口位置附近的IP。通过MosDNS的ECS功能,可以自定义ECS地址,使解析的CDN结果更靠近所配置的IP地址,从而提高解析结果的访问速度,例如我喜欢配置国外的ECS地址为代理的出口地址,这样通过代理访问时,可以获得最佳速度及可用性。
                                                                              同时在使用DOT或DOH使,可使用dial_addr替代域名,可免去每次建立连接时解析服务器域名。dial_addr一般为标准DNS的IPv4和IPv6地址。
                                                                              由于一些公共DNS使用DNSCRYPT,需要使用DNS服务器公钥,存在局限性,所以暂时未列入表单内,也不作为DNS选择与衡量的指标。
                                                                              同时大部分公共解析服务均为IPv4和IPv6双栈,即使用IPv4的DNS公共解析服务也可以解析IPv6地址,所以列表内不再进行IPv4和IPv6的区分。
                                                                              在设备支持的情况下,非常建议选用支持DoH与DoT的DNS服务器。

                                                                              推荐使用的DNS服务器

                                                                              DNS服务名称
                                                                              标准DNS地址
                                                                              DoH地址
                                                                              DoT地址
                                                                              是否支持H3
                                                                              ECS
                                                                              Google DNS
                                                                              8.8.8.8 / 8.8.4.4
                                                                              https://dns.google/dns-query
                                                                              dns.google
                                                                              支持
                                                                              Cloudflare
                                                                              1.1.1.1 / 1.0.0.1
                                                                              https://cloudflare-dns.com/dns-query
                                                                              1dot1dot1dot1.cloudflare-dns.com
                                                                              支持
                                                                              Quad9
                                                                              9.9.9.9 / 149.112.112.112
                                                                              https://dns.quad9.net/dns-query
                                                                              dns.quad9.net
                                                                              支持
                                                                              AdGuard Public DNS
                                                                              94.140.14.14 / 94.140.15.15
                                                                              https://dns.adguard.com/dns-query
                                                                              dns.adguard.com
                                                                              支持
                                                                              NextDNS
                                                                              45.90.28.0 / 45.90.30.0
                                                                              https://dns.nextdns.io
                                                                              45.90.28.0 / 45.90.30.0
                                                                              支持
                                                                              OpenDNS
                                                                              208.67.222.222 / 208.67.220.220
                                                                              https://doh.opendns.com/dns-query
                                                                              208.67.222.222 / 208.67.220.220
                                                                              支持
                                                                              Yandex DNS
                                                                              77.88.8.8 / 77.88.8.1
                                                                              https://doh.yandex.net/dns-query
                                                                              dns.yandex.net
                                                                              不支持
                                                                              CleanBrowsing
                                                                              185.228.168.9 / 185.228.169.9
                                                                              https://doh.cleanbrowsing.org/dns-query
                                                                              security-filter-dns.cleanbrowsing.org
                                                                              不支持
                                                                              jp.tiar.app
                                                                              172.104.93.80
                                                                              https://jp.tiarap.org/dns-query
                                                                              jp.tiar.app
                                                                              不支持
                                                                              Comodo Secure DNS
                                                                              8.26.56.26
                                                                              https://doh.comodo.com/dns-query
                                                                              dns.comodo.com
                                                                              不支持
                                                                              DNS.WATCH
                                                                              84.200.69.80
                                                                              https://dns.watch/dns-query
                                                                              不支持
                                                                              Blahdns(新加坡)
                                                                              46.250.226.242 2407:3640:2205:1668::1
                                                                              https://doh-sg.blahdns.com/dns-query
                                                                              dot-sg.blahdns.com
                                                                              不支持
                                                                              CleanBrowsing
                                                                              185.228.168.9 185.228.169.9
                                                                              https://doh.cleanbrowsing.org/doh/security-filter/
                                                                              security-filter-dns.cleanbrowsing.org
                                                                              不支持
                                                                              Block malware
                                                                              76.76.2.1
                                                                              https://freedns.controld.com/p1
                                                                              tls://p1.freedns.controld.com
                                                                              不支持
                                                                              DeCloudUs 
                                                                              78.47.212.211:9443
                                                                              https://dns.decloudus.com/dns-query
                                                                              tls://dns.decloudus.com
                                                                              不支持
                                                                              Mullvad(新加坡)
                                                                              -
                                                                              https://dns.mullvad.net/dns-query
                                                                              tls://dns.mullvad.net
                                                                              不支持

                                                                              仅作测试使用的DNS服务器

                                                                              仅作测试使用的DNS服务器不建议作为日常主力使用DNS解析服务,仅在测试时进行使用,或作为落地区域的DNS使用。这些DNS服务大多不提供DOH或DOT选项,且在直连情况下存在延迟较高、丢包较多等不稳定因素。
                                                                              DNS服务名称
                                                                              标准DNS地址
                                                                              DoH地址
                                                                              DoT地址
                                                                              是否支持H3
                                                                              ECS
                                                                              HKBN DNS
                                                                              203.80.96.10 / 203.80.96.9
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                              NTT Communications DNS
                                                                              61.213.169.170 / 61.213.169.171
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                              NEC BIGLOBE DNS
                                                                              202.225.96.66 / 202.225.96.68
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                              Yahoo Japan DNS
                                                                              182.22.70.1 / 182.22.70.2
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                              DNS.SB
                                                                              45.11.45.11
                                                                              https://doh.dns.sb/dns-query
                                                                              dot.sb
                                                                              不支持
                                                                              腾讯国际
                                                                              162.14.21.178/ 162.14.21.56
                                                                              不支持,可通过腾讯云套娃DOH
                                                                              不支持,可通过腾讯云套娃DOT
                                                                              不支持
                                                                              Microsoft DNS / Level 3 Communications
                                                                              4.2.2.2 / 4.2.2.1
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                              HiNet/中華電信
                                                                              168.95.1.1 / 168.95.192.1
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                              TWNIC Quad101 Public DNS
                                                                              101.101.101.101 / 101.102.103.104
                                                                              不支持
                                                                              不支持
                                                                              不支持
                                                                               

                                                                              DNS延迟测试脚本

                                                                              需要ping3依赖。保存为*.py文件,通过命令行运行,可替换IP地址为自己想要进行测速的DNS的IP地址,每个DNS的IP地址Ping次数为4,可根据自己需要在脚本中修改。

                                                                              非公共DNS服务(增强型DNS服务

                                                                              这里的非公共DNS是指提供具有用户唯一标识的DNS服务,允许用户自定义DNS过滤与隐私保护,提供访问控制,提供查询日志,提供部分路由优化等。相当于免费的公共DNS服务,这种DNS服务在部分情况下访问速度可能会更好一些。基础的DOH、DOT、DNSSEC、ECS基本都支持。
                                                                              • XNS.One提供非公共DNS使用,属于付费服务,需要邀请码,可以在他们的Telegram频道蹲一下。付费不支持支付宝与微信,只能信用卡付款。
                                                                              • NextDNS,我目前主要使用的DNS服务,免费版每个月提供30万次查询,基本够日常使用。可定制拦截列表。
                                                                              • AdGuard DNS,与NextDNS类似,免费版每个月提供30万次查询,允许配置5个接入点,2个服务器,支持配置100条自定义规则。

                                                                              📝 参考信息

                                                                              enable_pipeline: TCP/DoT 使用 RFC 7766 新的 query pipelining 连接复用模式。
                                                                              • 启用后可大幅提高连接利用率,减少建立连接/握手的次数,进而降低响应延时。
                                                                              • 并非所有服务器都支持。必须确定服务器支持后再启用该选项。
                                                                              • Tips: 已知 Google 和 Cloudflare 的 TCP/DoT 是支持该模式的。知名的公共 DNS 服务商大多数都支持该模式。可以使用 mosdns probe pipeline {tcp|tls}://server_ip[:port] 测试命令测试服务器是否支持。比如 mosdns probe pipeline tls://8.8.8.8

                                                                              什么是ECS?

                                                                              ECS(EDNS Client Subnet)是扩展DNS查询的一种机制,旨在提升内容分发网络(CDN)和地理位置相关的服务的效率。通常DNS服务器只看到客户端的 IP 地址,但通过ECS,DNS请求会包含客户端IP的一部分(子网信息)。这样,内容分发网络可以根据客户端的地理位置,返回更接近用户的服务器,减少延迟,提升性能。ECS主要用于优化网络和加速服务的访问,但也可能带来一定的隐私泄露风险。

                                                                              什么是DOH?

                                                                              DoH(DNS over HTTPS)是一种技术,用来加密你的 DNS 查询。通常情况下,DNS 查询是明文的,容易被别人看到和监控。而 DoH 会通过 HTTPS 协议加密这些查询,确保你的请求内容是安全的,不会被别人偷看。就像你在发送加密的信息一样,DoH 保护了你上网时的隐私,并在一定程度上避免劫持。

                                                                              什么是ECH?

                                                                              ECH(加密客户端你好,Encrypted Client Hello)是一种技术,用来加密你访问网站时的 SNI(服务器名称指示)信息。通常情况下,当你想访问某个网站时,这个请求是明文的,运营商或其他第三方可以轻易看到你在访问什么网站,并可能进行拦截或阻断(例如 SNI 阻断)。这也是为什么有时你在国内访问 GitHub 会遇到问题的原因之一。有了 ECH,这些 SNI 信息就被加密了,外面的人就看不到你要访问哪个网站,从而提高了你的隐私和安全性。简单来说,ECH 就像是在发送加密的信息,让你的浏览行为更加私密。

                                                                              什么是DNSSEC?

                                                                              DNSSEC(Domain Name System Security Extensions)是DNS系统的安全扩展协议,通过数字签名技术来确保DNS记录的真实性和完整性。它通过建立从根域名到下级域名的信任链,使用公私钥对对DNS记录进行签名和验证,能有效防止DNS欺骗和缓存污染。DNSSEC引入了几个关键记录类型:DNSKEY用于存储域名公钥,RRSIG包含数字签名信息,DS记录用于下级域委派签名,以及NSEC/NSEC3用于提供域名不存在的证明。虽然DNSSEC的配置较为复杂,可能增加DNS服务器负载并导致响应包变大,但它在防止DNS劫持和欺骗方面发挥着重要作用,目前已得到Google DNS (8.8.8.8)和Cloudflare (1.1.1.1)等主流公共DNS服务器的支持。

                                                                              关于DNS选择?

                                                                              💡
                                                                              有关DNS上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              RouterOS使用OSPF智能分流国外流量

                                                                              2024年10月3日 08:00
                                                                              😀
                                                                              前一篇文章尝试使用RouterOS Address List配合防火墙Mangle的Prerouting规则进行国内外流量的自动分流,效果还不错,秉承着不把家里网络搞塌就不算完的态度,我又尝试寻找更好(更复杂)的分流方法,原来在2020年就已经有人在使用Ospf进行路由表分流,那我也来尝试配置一下看看。在通过ospf分流后,我的旁路网关这时候才真的称得上是一个旁路由,因为真的在进行路由路径的分流。

                                                                              📝 OSPF介绍

                                                                              OSPF(开放最短路径优先)是一种常用的路由协议,一般用于大型企业和网络服务提供商的网络中,家庭网络使用有点杀鸡用牛刀。它的主要功能是帮助路由器找到通往目标网络的最短路径,并自动更新这些路径信息。OSPF的工作原理是通过收集整个网络的路径信息,然后使用一种算法计算出到每个目的地的最优路径。当网络中的某条线路发生变化时,OSPF可以迅速做出调整,保证数据能够继续以最快的方式传输。

                                                                              📝 配置背景

                                                                              整体是All In One(All in Boom),采用PVE虚拟机方式,以下所有设备均在PVE内。
                                                                              • 主路由器:RouterOS
                                                                                • 光猫桥接,通过PPPoE Client建立pppoe-out1建立拨号
                                                                                • 4个网口,分别为eth1 ~ eth4,其中eth4作为WAN口,pppoe-out1也是这个接口; 其他三个接口建立桥接,为bridge1
                                                                                • 版本为7.16(stable)
                                                                              • 旁路由(旁路网关):Debian
                                                                                • 接口为ens18,网关为主路由bridge1地址
                                                                                • 运行DAED作为科学服务

                                                                              📝 配置指南

                                                                              Debian配置

                                                                              开启IPv4及IPv6转发

                                                                              打开/etc/sysctl.conf 确认包括以下内容,并没有被注释:
                                                                              如果进行了修改,需要通过sysctl -p 命令使其生效。

                                                                              安装Bird及配置

                                                                              在网络中使用OSPF协议时,需要一个路由守护进程来实现其功能,Bird作为轻量且高性能的解决方法,同时支持IPv4及IPv6路由表。Bird是一款支持多种路由协议的软件,广泛使用于Unix类系统,例如Linux和FreeBSD,在大多数常见系统中均可找到安装及使用方法。
                                                                              • 通过apt进行安装:
                                                                              bird2安装完成后默认为运行状态,我们需要先将其关闭:
                                                                              • 编辑配置文件:
                                                                              Deiban系统在安装Bird后,配置文件默认存放位置位于/etc/bird/bird.conf ,需要对其编辑。
                                                                              配置说明如下:
                                                                              1. log syslog all;
                                                                              • 作用:将BIRD的所有日志输出到系统日志(syslog),可以通过journalctl -xeu bird 进行bird日志查看
                                                                              2. router id 10.0.0.10;
                                                                              • 作用:定义了BIRD路由器的标识(Router ID),Router ID是一个唯一的IPv4地址形式,需要自行更改配置为自己旁路由(旁路网关)的IPv4地址
                                                                              3. protocol device { scan time 60; }
                                                                              • 作用device协议的配置,负责发现和监控网络接口的状态。scan time 60;表示BIRD每60秒扫描一次所有网络接口,以更新接口状态信息。
                                                                              4. protocol kernel { ipv4 { import none; export none; }; } 和 protocol kernel { ipv6 { import none; export none; }; }
                                                                              • 作用kernel协议用于在BIRD的路由表和操作系统的内核路由表之间同步路由信息。
                                                                                • import none:不从内核路由表导入路由信息。
                                                                                • export none:不将BIRD中的路由信息导出到内核路由表。
                                                                                • 禁止BIRD与操作系统的内核交换任何路由信息,完全独立管理IPv4和IPv6的路由表,避免将Bird的静态路由信息导入到内核路由表造成本地回环,同时减少内核路由表内路由规则数目,便于进行debug。
                                                                              5. protocol static { ipv4; include "/etc/bird/routes4.conf"; } 和 protocol static { ipv6; include "/etc/bird/routes6.conf"; }
                                                                              • 作用static协议用于定义静态路由。静态路由不会根据网络拓扑的变化自动更新,需要手动配置。
                                                                                • ipv4:该协议块是针对IPv4的静态路由。
                                                                                • ipv6:该协议块是针对IPv6的静态路由。
                                                                                • include "/etc/bird/routes4.conf";:从指定的文件/etc/bird/routes4.conf中导入IPv4静态路由配置。
                                                                                • include "/etc/bird/routes6.conf";:从指定的文件/etc/bird/routes6.conf中导入IPv6静态路由配置。
                                                                              6. protocol ospf v2 { ... }
                                                                              • 作用:这部分配置定义了OSPFv2(用于IPv4)的路由协议。
                                                                                • ipv4 { export all; }:将BIRD中的所有路由信息导出到OSPFv2,供其他OSPF路由器学习。
                                                                                • area 0.0.0.0:配置OSPF的区域,这里是骨干区域0.0.0.0。在OSPF中,所有非骨干区域必须通过骨干区域连接。
                                                                                • interface "ens18" { type pointopoint; }:指定OSPFv2在接口ens18上运行,并且接口类型为点对点(point-to-point)。点对点类型通常用于没有中间广播域的直接链路。
                                                                                • 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。
                                                                              7. protocol ospf v3 { ... }
                                                                              • 作用:这部分配置定义了OSPFv3(用于IPv6)的路由协议。
                                                                                • ipv6 { export all; }:将BIRD中的所有路由信息导出到OSPFv3,供其他OSPF路由器学习。
                                                                                • area 0.0.0.0:配置OSPF的区域,和OSPFv2一样,这里也是骨干区域0.0.0.0
                                                                                • interface "ens18" { type pointopoint; }:指定OSPFv3在接口ens18上运行,类型为点对点,和OSPFv2的配置类似。
                                                                                • 需要根据自己实际情况修改为旁路由(旁路网关)接口名称。

                                                                              生成静态路由规则

                                                                              与上一篇文章RouterOS自动分流方案(支持IPv4 & IPv6)所使用的方式不同,这次我们需要生成所有非中国大陆地区的IPv4和IPv6地址信息,在Github上有dndx/nchnroutes: !chnroutes - chnroutes negated可以使用。
                                                                              • 克隆仓库
                                                                              • 编辑Produc.py
                                                                              在第10行附近,修改—next后的default参数wg0为自己的旁路由(旁路网关)接口名称, 例如我的是ens18,就改成ens18。
                                                                              2024年12月28日更新:
                                                                              删除48行IPv4Network('172.16.0.0/12')的保留地址,或者替换为172.24.0.0/13,避免影响Cloudflare访问。原因在于Cloudflare IP Range中包括:172.64.0.0/13 这个地址范围,如果将IPv4Network('172.16.0.0/12') 配置为保留地址,那么Cloudflare所使用的172.64.0.0/13 也会被标记为直接从主网关出去,不需要经过旁路网关,所以会出现部分使用Cloudlfare CDN的网站无法访问的情况,例如Linux.do
                                                                              • 编辑Makefile
                                                                              取消5、6、7行的注释。因为使用的是Bird2,没有Birdc6命令,所以不做修改。
                                                                              2024年12月28日更新:
                                                                              更换china_ip_list上游地址,原来的17mon的国内ip地址表太久未更新,存在地址范围错误,无法应对墙中墙(各种反诈劫持)的情况。
                                                                              delegated-apnic-latest是一个37M左右的大文件,下载速度会有点慢,需要耐心等待。
                                                                              如果在你的旁路网关上访问raw.githubusercontent.com 存在问题(例如本机无法被代理等情况),可以将raw.githubusercontent.com 更换为镜像raw.staticdn.net
                                                                              • 生成静态路由表
                                                                              需要确保你已经安装make,如果没有安装可以通过apt install make进行安装,然后执行:
                                                                              返回结果:
                                                                              即表示Bird2生成OSPF动态路由表成功。
                                                                              • 确认Bird2状态
                                                                              执行systemctl status bird.service来查看bird2的运行状态:
                                                                              如果Active处于inactive状态,需要手动执行systemctl start bird.service
                                                                              • 确认Bird2路由表状态
                                                                              执行命令birdc show route protocol static1查看IPv4路由表,返回结果太多,大概是如图:
                                                                              notion image
                                                                              执行命令birdc show route protocol static2查看IPv6路由表:
                                                                              notion image
                                                                              到这里Debian(旁路网关)的Bird2配置完成,下面可以开始进行RouterOS配置

                                                                              RouterOS配置

                                                                              在WinBox中点击左侧菜单Routing进行配置

                                                                              Router ID配置

                                                                              点击RoutingRouter ID进行配置。 Name自己喜欢填什么就填什么,ID填写RouterOS的地址,Dynamic ID选择only vrfSelect From VRF选择main,点击OK提交。
                                                                              notion image

                                                                              OSPF配置

                                                                              点击RoutingOSFP进行配置
                                                                              Instances配置
                                                                              点击New新建,填入Name(自己根据喜好填),也可以默认根据我的来。Version版本选择2,VRF使用main表,Router ID选择刚刚创建的main,或者直接输入RouterOS的IP地址。其他不动。
                                                                              notion image
                                                                              如果你使用IPv6,那么需要再新建一个Instances,Version选择为3,其他的一样。
                                                                              notion image
                                                                               
                                                                              Areas配置
                                                                              点击Areas,点击New新增一个AreaName随便,Instance选择刚刚创建IPv4的Instance(Version版本为2),Area ID为0.0.0.0 ,Type为default ,其他不用填写。
                                                                              notion image
                                                                              同样,如果你需要使用IPv6,那么也需要新建一个Area,并在Instance中选择刚刚创建的Version版本为3的Instance。
                                                                              notion image
                                                                               
                                                                              Interface Templates配置
                                                                              点击Interface Templates,点击New新增一个模板。Area选择刚刚创建的IPv4的区域,Network Typeptp(点对点,因为我们只有两个点),Cost10Priority32,其他的不用管。
                                                                              notion image
                                                                              同样,如果使用IPv6再新建一个Templates,Area选择IPv6的区域
                                                                              notion image
                                                                               
                                                                              查看结果
                                                                              上述配置完成后,点击Neighbors进行节点匹配查看,如果正常的话,应该可以发现Debian(旁路网关)上配置Bird2的节点:
                                                                              notion image
                                                                              同时在IPRoutes中应该可以看到Debian(旁路网关)上Bird2发送过来的状态为DAo的路由表(D代表动态,A是活动状态,o为ospf)
                                                                              notion image
                                                                               

                                                                              避免路由环路配置

                                                                              在以上配置完成后,在我们访问国外流量时会发生环路,即客户端 → RouterOS → Debian旁路网关 → RouterOS → Debian旁路网关… 不断的循环,所以需要对来源为Debian(旁路网关) 的流量进行特殊处理,这里又要用到我们的老朋友Mangle。
                                                                              1. 首先在Routing - Tables新建一个路由表,名为bypass,并勾选FIB:
                                                                              notion image
                                                                              1. IP → Firewall → Managle新建规则,并将规则移动到最上方,处于高优先级:
                                                                              • General
                                                                                • Chain: prerouting
                                                                                • In.Interface: bridge1
                                                                              • Advanced
                                                                                • Src.MAC Address: Debian旁路由(旁路网关)的网卡MAC地址
                                                                              • Action
                                                                                • Action: Mark Routing
                                                                                • New Route Mark: 选择刚刚新建的Bypass
                                                                               
                                                                              notion image
                                                                              1. 如果你需要使用IPv6的话,在IPv6 → Firewall → Mangle也新建一条一样的规则,同时将规则移动到最上方,处于高优先级。目前已知规则如果位于MSS钳制规则后,会导致mark routing标记无效。
                                                                              1. 配置Bypass路由表内路由规则
                                                                              1. 如果发现配置后从旁路由(旁路网关)Ping不通主路由RouterOS或者无法访问,提示Destination Host Unreachable或者Redirect Host(New nexthop: 10.0.0.1),可以在Dst.Address添加一项局域网地址范围,例如我的10.0.0.0/24 ,并点击前面空白方块出现“”,即目标地址不为局域网地址的流量。这样旁路由在使用Tailscale时候也可以正确的访问局域网内其他设备。
                                                                              通过以上规则,在来源为Debian旁路由(旁路网关)的流量进入到RouterOS后,使用bypass路由表进行路由,默认这个表是空的,也就是无法对流量进行路由,所以会断网,我们需要添加一些默认的规则进去,基本照抄main表的默认规则就行:
                                                                               
                                                                              • 新建IPv4局域网路由规则
                                                                                • Dst.Address: 局域网IP地址范围,如果你是主路由是192.168.1.1 ,那么这里写192.168.1.0/24
                                                                                • Gateway: 填写网桥地址,例如我的是bridge1 ,也是RouterOS建立网桥时默认名字
                                                                                • Distance: 1
                                                                                • Routing Table: bypass
                                                                                • notion image
                                                                               
                                                                              • 新建IPv4广域网路由规则
                                                                                • Dst.Address: 0.0.0.0/0
                                                                                • Gateway: 填写PPPoE拨号接口名称,例如我的是pppoe-out1
                                                                                • Distance: 1
                                                                                • Routing Table: bypass
                                                                              notion image
                                                                               
                                                                              如果你没有公网IP,运营商分配给你的是一个大内网的IP地址(100.x.x.x),可能需要手动添加一条指向大内网网关的路由规则。 由于每次拨号后IP地址会变,运营商内网的网关也会变,所以需要使用RouterOS的脚本进行定时检查和修改:
                                                                              • 新建IPv6局域网路由规则
                                                                                • Dst.Address: fe80::/64%bridge1
                                                                                • Gateway: 填写网桥接口名称,例如我的是bridge1
                                                                                • Distance: 1
                                                                                • Routing Table: bypass
                                                                              notion image
                                                                              然后依葫芦画瓢,把其他相关的fe:: f*:: 的内网路由规则添加进去
                                                                              • 新建IPv6广域网路由规则
                                                                                • Dst.Address: ::/0
                                                                                • Gateway: 填写PPPoE接口名称,例如我的pppoe-out1
                                                                                • Distance: 1
                                                                                • Routing Table: bypass
                                                                              notion image
                                                                              但是这样配置完成后,我们的IPv6还是没有办法访问互联网,通过与main表比对发现,因为缺少一条上级网关的地址:
                                                                              notion image
                                                                              但是这个地址是动态的,所以我们需要通过一个RouterOS脚本来进行动态处理:
                                                                              至此,RouterOS部分的全部配置完成,同时整体的基于OSPF动态路由的国内外分流也已经完成。但分流的基础还是基于IP地址,所以需要使用无污染的DNS公共服务器,同时尽量使用DOH、DOT等方式进行查询,避免运营商的DNS劫持。

                                                                              🤗 总结归纳

                                                                              相比上一篇使用的Address List方式,因为是直接查询路由表,不用对目标IP进行取反匹配,而且不用对所有流量进行mangle标记,仅需要对来源旁路由的流量进行标记处理,在系统性能占用上会少一些,同时也可以开启RouterOS的fast forward功能、fast track功能以及fast path,进一步降低CPU对流量处理所需资源,N4100在Fast.com300M跑满时CPU占用30%左右,内网2.5G跑满CPU占用不到10%。而且避免了旁路由(旁路网关)挂断之后国外网站完全无法访问的情况。
                                                                              我认为即便是在使用Dae这种直连效率非常高的透明代理解决方案的情况下,直连流量尽可能的不经过旁路由(旁路网关)才是最佳的效率选择,所以相比使用Mihomo或者其他的软件,在分流规则的第一层通过路由表方式将国内流量直接发出去才能避免产生更多的问题(例如NAT等等等)并获得最佳的访问速度。
                                                                              至于为什么要实用RouterOS来做,当然是因为RouterOS相对来说配置起来更为顺手,稳定性更好一些。当然,这些通过OpenWRT也可以实现。

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关旁路由(旁路网关)安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              OpenWRT从Hper-V迁移至PVE指引

                                                                              2024年9月28日 08:00
                                                                              😀
                                                                              本篇文章主要介绍如何将Hyper-V的VHDX虚拟磁盘导入到PVE(Proxmox Virtual Environment)下,从而实现将OpenWRT直接从Hyper-V平台迁移到PVE平台,避免重新配置的繁琐过程,最大程序保留原OpenWRT系统的可用性。
                                                                              迁移的原因是原来我的旁路网关所使用的OpenWRT部署在日常使用PC的Hyper-V里。而因为自己买了新的N4100工控机,4个2.5G网口,这样就可以实现全屋2.5G,提升内网的传输速度,同时将软路由(以及附带的旁路网关、旁路由、DNS服务器、Docker等等七七八八)从日常使用的PC中分离出去,减少家里网络因为我电脑问题产生的波动,同时日常使用的PC专注用于工作和使用Moonlihgt + Sunshine串流Steam打游戏。而且换了之后,日常使用的PC也可以休眠或者关机,省点电费(并没有)。另外还有就是软路由数据与系统的分离,可以将PVE的备份数据存放在smb挂载的磁盘上,减少All in Boom之后的工作量和损失。

                                                                              📝 迁移过程

                                                                              导出Hyper-V虚拟机

                                                                              在Hyper-V Manager(Hyper-v管理中心)选择想要导出的虚拟机,我们以OpenWRT为例:右键导出,选择存放位置。
                                                                              notion image
                                                                              导出后的文件夹里包括:SnapshotsVirtual Hard DisksVirtual Machines ,OpenWRT的虚拟机VHDX磁盘位于Virtual Hard Disks 内,例如我的immortalwrt的VHDX为:immortalwrt-23.05.3-x86-64-generic-squashfs-combined-efi.vhdx ,为了便于之后转换和导入操作,可以修改为短一点的名字,例如openwrt.vhdx ,这样在后续输入命令的时候,能够少打点字,同时也减少因为输入名称错误带来的无法导入问题。

                                                                              上传VHDK虚拟磁盘到PVE

                                                                              由于VHDX不属于ISO镜像或者CT模板,所以无法通过PVE Gui(网页管理器)进行上传,需要自己通过sftp或者共享文件夹的方式上传,例如Winscp或者Termius,可以通过SSH账号密码登录并进行文件传输,文件存放位置选择自己能找到的位置,例如用户目录下。
                                                                              notion image

                                                                              在PVE上新建虚拟机

                                                                              这里按照正常的虚拟机创建流程即可,需要注意有三点:
                                                                              1. 如果是EFI镜像,需要在BIOS中选择OVMF (UEFI) ,其他镜像选择默认的SeaBIOS 即可。
                                                                              1. 添加网络设备时,需要修改MAC地址为原来在Hyper-V下OpenWRT所使用的虚拟网卡MAC地址,这样可以避免大多数问题,但是例如Zerotier这种需要完全匹配设备信息的,需要单独进行调整:OpenWRT迁移后Zerotier无法连接的解决方案
                                                                              1. 不需要添加硬盘和磁盘。
                                                                              notion image
                                                                              完成后不需要启动虚拟机。

                                                                              将VHDX磁盘转化为qcow2格式

                                                                              这里需要通过SSH或者PVE Shell进入节点机终端(SSH),并执行磁盘格式转换命令:
                                                                              -O qcow2 :导出格式为qcow2
                                                                              openwrt.vhdx :源磁盘镜像文件名称
                                                                              openwrt.qcow2:导出的磁盘镜像文件名称
                                                                              转换可能需要一点时间,请耐心等待。

                                                                              挂载Hyper-V虚拟磁盘镜像

                                                                              这里需要通过SSH或者PVE Shell进入节点机终端(SSH),并执行导入命令:
                                                                              101 :刚刚新建的PVE虚拟机的VM ID,也就是那个序号。
                                                                              openwrt.qcow2 :刚刚我们转换完的磁盘镜像。
                                                                              nvme:存储卷名称,例如local,或者你所添加的其他存储名称。
                                                                              --format=qcow2 :将磁盘以 qcow2 格式导入 导入完成后,在PVE GUI面板,选择创建的新的OpenWRT虚拟机,选择【硬件】,双击未使用的硬盘,然后点击添加,就实现了磁盘由Hyper-V到PVE的完整迁移。

                                                                              🤗 总结归纳

                                                                              开启OpenWRT虚拟机进行后续测试,目前我的测试结果是:
                                                                              软件
                                                                              情况
                                                                              OpenClash
                                                                              正常
                                                                              MosDns
                                                                              正常
                                                                              AdGuard Home
                                                                              正常
                                                                              DDNS-GO
                                                                              正常
                                                                              Zerotier
                                                                              正常
                                                                              Prometheus Exporters
                                                                              正常
                                                                              Qos Mate
                                                                              正常
                                                                              Docker
                                                                              正常
                                                                              Tailscale
                                                                              正常
                                                                              Zerotier的修复办法也已经同步进行了更新:《OpenWRT迁移后Zerotier无法连接的解决方案

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              OpenClash替换使用Mihomo内核

                                                                              2024年8月29日 08:00
                                                                              🚧
                                                                              OpenClash是我在OpenWRT旁路网关(旁路由)上使用时间最长的科学上网插件,其依赖于Clash的内核文件使用,在功能的完整性和使用顺手程度上,目前还没有可完全替代的选项。目前Clash-meta内核分支已经改名为Mihomo,OpenClash也已经大概2个月没有更新了,插件自带的内核更新功能暂时还不能自动更新使用Mihomo内核,为了使OpenClash支持Mihomo内核所带来的一些新的功能,所以有了这篇文章。
                                                                              notion image

                                                                              📝 付费内容

                                                                              Mihomo内核介绍

                                                                              Mihomo内核并不是一个新的Clash内核,其前身是Clash-Meta内核,但是由于Clash For Windows删库风波问题,所以改名为Mihomo(原神!启动!)Mihomo继承了Clash的核心功能,综合原始Clash及Clash Premium核心功能,并在此基础上根据需要持续更新迭代,是目前Clash最为主流的核心。

                                                                              Mihomo功能介绍

                                                                              代理模块
                                                                              • 实现了基于TCP握手机制的主动健康检测(如urltest/fallback)。
                                                                              • 支持Relay代理链和TCP连接并发。
                                                                              规则模块:
                                                                              • 全面的规则支持,包括GEOSITE、GEOIP、入站类型规则IN-TYPE和规则集RULE-SET。
                                                                              • 支持SRC-PORT和DST-PORT的多条件、TCP/UDP的分别控制、网络类型匹配(TCP/UDP)、PROCESS-NAME匹配等。
                                                                              • 逻辑判断规则(NOT/OR/AND)、子规则集、所有规则的源IPCIDR条件。
                                                                              • GEODATA MODE切换(mmdb/dat)和GEODATA LOADER模式切换(普通/小内存模式),适用于各种设备。
                                                                              DNS模块:
                                                                              • 包括域名嗅探器Sniffer、使用Geosite的Fallback-Filter和Redir-Host远程解析。
                                                                              • 支持使用代理解析IP和DNS over QUIC。
                                                                              TUN模块:
                                                                              • 支持macOS、Linux和Windows平台。
                                                                              • 内置iptables和Wintun驱动程序,无需手动配置。
                                                                              • 支持gVisor/System堆栈以及Mix堆栈(混合堆栈)。

                                                                              Mihomo新增功能

                                                                              除上述功能外,在Clash-Meta更名为Mihomo之后,又增加了如下功能支持:
                                                                              DNS模块:
                                                                              • 增加HTTP/3 DNS支持(H3的速度真的很快),包括是否优先使用DOH的HTTP/3以及指定DOH服务器强制使用HTTP/3
                                                                              • nameserver-policy规则:优先于nameserverfallback的dns进行解析,可以在规则中通过GEOSITE分组进行DNS指定,增加DNS解析规则灵活性。但由于nameserverfallback dns server同时请求的原因,并不能解决DNS泄露问题。
                                                                              • fallback-filter规则:支持GEOIPGEOSITE匹配
                                                                              • proxy-server-nameserver:指定解析节点所使用的DNS服务器
                                                                              策略组模块 - 路由规则:
                                                                              • 增加PROCESS-NAME进程匹配,软路由上可匹配本机进程
                                                                              • 增加PROCESS-NAME-REGEX,使用进程名称正则表达式匹配
                                                                              • 增加PROCESS-PATH-REGEX,使用进程路径正则表达式匹配
                                                                              • 增加SUB-RULE子规则
                                                                               
                                                                              Tun模块:
                                                                              • 支持gVisorSystem的混合堆栈,tcp使用system栈,udp使用gvisor栈,使用体验可能相对更好,同时稳定性也有保证。
                                                                              • 支持流量转发隧道(Tunnel)
                                                                              主要我们所使用到的,还是在DNS模块的部分,可以更为精准的控制DNS的解析,包括IPv6 DNS的解析。

                                                                              OpenClash替换Mihomo内核方法

                                                                              1. 首先确认你使用的是OpenWRT及OpenClash,并对自己将进行的操作目标有所知悉。下述操作的系统为X86-64架构,OpenWRT版本为ImmortalWrt 23.05.4。如果担心出现不可恢复的问题,可以先备份虚拟机或OpenClash整体配置。本篇内容也适用于OpenClash内核更新失败的手动解决方案。
                                                                              1. 通过SSH登入OpenWRT,并进入OpenClash的核心所在文件夹:
                                                                              1. 备份原来的meta核心:
                                                                              1. 下载Mihomo核心,从https://github.com/MetaCubeX/mihomo/releases 选择版本和自己路由器架构的核心包,并复制链接地址,替换下面命令中的地址,X86-64用户选择mihomo-linux-amd64-compatible-go120后缀即可。
                                                                              1. OpenWRT网页端进入OpenClash,点击插件设置 - 版本更新,查看[Meta]当前内核版本是否为v1.18.7,如图所示
                                                                              notion image
                                                                              1. 如果显示为当前下载的内核版本号,即表示替换成功。重启OpenClash即可生效。不要再点击检查并更新了。

                                                                              🤗 总结归纳

                                                                              因为Notion AI到期,所以没有课代表总结。反正就是一个简单的Mihomo内核替换,也没什么难度。
                                                                              Mihomov1.18.8版本更新了,可以更新起来了。但是WireGuard的问题还是没有修复。
                                                                              OpenClash目前已完全支持Mihomo内核,可以直接使用自带的更新功能进行更新。

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关OpenWRT和Mihomo安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              Docker国内加速镜像

                                                                              2024年10月12日 08:00
                                                                              😀
                                                                              最近国内使用Docker不是很顺畅,遭遇DNS污染+SNI阻断,在拉取Docker Hub上的docker时无法正常使用。国内的Docker加速镜像又部分关闭,自己手头还有一台闲置的HK小鸡,拿出来做个Docker加速镜像供网友使用。
                                                                              notion image

                                                                              📝 主旨内容

                                                                              镜像地址

                                                                              镜像地址只允许GET请求,其他请求会返回"invaild method" 的405错误(Method Not Allowed

                                                                              拉取限制

                                                                              拉取限制遵循Docker限制:Usage and rate limits | Docker Docs,目前免费镜像处于匿名用户级别,即6小时100次拉取。
                                                                              用户类型
                                                                              速率限制
                                                                              匿名用户
                                                                              每个IP地址每6小时100次拉取
                                                                              认证用户
                                                                              每6小时200次拉取
                                                                              拥有付费Docker订阅的用户
                                                                              每天最多5000次拉取

                                                                              📝 其他镜像

                                                                              部分Docker加速镜像使用Cloudflare Worker进行部署,仅适用于日常用途,请勿滥用,尊重提供者。
                                                                              DockerHub 镜像仓库
                                                                              是否正常
                                                                              docker.registry.cyou
                                                                              正常
                                                                              docker-cf.registry.cyou
                                                                              正常
                                                                              dockerpull.com
                                                                              正常
                                                                              dockerproxy.cn
                                                                              正常
                                                                              docker.1panel.live
                                                                              正常
                                                                              hub.rat.dev
                                                                              正常
                                                                              dhub.kubesre.xyz
                                                                              正常
                                                                              docker.hlyun.org
                                                                              正常
                                                                              docker.kejilion.pro
                                                                              正常
                                                                              registry.dockermirror.com
                                                                              正常
                                                                              docker.mrxn.net
                                                                              正常
                                                                              docker.chenby.cn
                                                                              正常
                                                                              ccr.ccs.tencentyun.com
                                                                              正常
                                                                              hub.littlediary.cn
                                                                              正常
                                                                              hub.firefly.store
                                                                              正常
                                                                              docker.nat.tf
                                                                              正常
                                                                              hub.yuzuha.cc
                                                                              正常
                                                                              hub.crdz.gq
                                                                              正常
                                                                              noohub.ru
                                                                              正常
                                                                              docker.nastool.de
                                                                              正常
                                                                              hub.docker-ttc.xyz
                                                                              正常
                                                                              freeno.xyz
                                                                              正常
                                                                              docker.hpcloud.cloud
                                                                              不正常,重定向被ADG拦截
                                                                              dislabaiot.xyz
                                                                              正常
                                                                              docker.wget.at
                                                                              正常
                                                                              ginger20240704.asia
                                                                              正常
                                                                              lynn520.xyz
                                                                              正常
                                                                              doublezonline.cloud
                                                                              正常
                                                                              dockerproxy.com
                                                                              正常

                                                                              📝 修改方法

                                                                              为了加速镜像拉取,你可以使用以下命令设置 Registry Mirror:

                                                                              Linux修改位置

                                                                              Windows修改位置

                                                                              打开Docker应用,并右击系统托盘上的Docker图标,选择【Settings】进入设置页面。
                                                                              在设置页面的左侧导航栏中选择【Docker Engine】。
                                                                              在Docker Engine的配置页面中,找到【registry-mirrors】字段,如果没有,直接添加,并在该字段中添加国内免费镜像源的地址

                                                                              飞牛OS(FnOS)修改位置

                                                                              (不知道还能不能赶上飞牛OS这波流量)
                                                                              打开Docker - 镜像仓库
                                                                              notion image
                                                                              点击右上角仓库设置
                                                                              notion image
                                                                              点击添加,并输入仓库名称(输什么都可以),URL填写镜像地址,点击应用
                                                                              notion image
                                                                              选择刚刚创建的镜像,点击启用,状态显示为使用中即添加完成。
                                                                              notion image

                                                                              🤗 总结归纳

                                                                              HK小鸡,不保证长期可用性,大陆访问仅套一层优选IP。

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关Docker安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              OpenWRT限速插件推荐:QoS Mate

                                                                              2024年9月19日 08:00
                                                                              😀
                                                                              OpenWRT上的Qos插件并不算太多,相对知名的有luci-app-sqm和OpenWRT官方的tc,今天为大家介绍一款OpenWRT新的Qos插件:QosMate
                                                                              Qos插件的主要作用是管理局域网与公网之间的网络流量,通过不同的算法,对不同的流量分配优先级,从而提高整体的网络性能。在我这种长期上下行跑满的网络环境下(BT、PCDN等等),如果不想因为上传或下载服务影响到日常的使用,例如打游戏、观看流媒体等等,配置Qos还是有很大的必要。

                                                                              📝 QosMate介绍

                                                                              QosMate是最近在OpenWRT论坛上新发布的一个OpenWRT插件,支持几乎全部OpenWRT架构,不论是X86、mipsel_24kc、arm_cortex-a9还是arm_cortex-a7。同时由于QosMate作者已经提供了二进制的运行文件,所以也不需要预编译或重新编译固件安装,在安装上来说,已经是很方便了。

                                                                              算法支持

                                                                              QoSMate提供了两种队列调度算法供用户选择:HFSC(分层公平服务曲线)和CAKE(Common Applications Kept Enhanced)。
                                                                              • HFSC:适用于需要精细控制不同类型流量的环境。它通过分层调度来确保实时应用(如在线游戏、VoIP)的带宽优先分配。
                                                                              • CAKE:CAKE算法应该是大多数人都熟悉的一种算法,专为简化和优化家庭网络而设计,具有自动调整网络带宽的功能,帮助减少延迟问题,尤其是当多设备同时连接网络时。

                                                                              插件自动配置

                                                                              QoSMate提供了自动设置选项,通过自动速度测试来分析用户的网络情况并根据测试结果进行相应的调整。用户可以简单地点击“自动设置”,QoSMate会自动计算最佳的下载和上传速率,并根据实际网络带宽调整流量分配。同时,还允许用户输入游戏设备的IP地址,以确保游戏流量得到优先处理,这对需要低延迟的应用尤为有利。

                                                                              游戏流量优化

                                                                              除了自动配置功能,QoSMate还专门提供了针对游戏的流量优化选项。通过设置特定的队列调度算法(如pfifo或fq_codel),确保游戏数据包在传输中享有低延迟的优先级,从而提高在线游戏的流畅度,降低延迟和丢包。
                                                                               

                                                                              与SQM对比

                                                                              在讨论QoS管理时,不得不提到另一个常见的OpenWRT插件——SQM(Smart Queue Management)。作为广泛应用的插件,SQM 也能很好地管理家庭网络流量。QoSMate与SQM的功能对比如下:
                                                                              特性
                                                                              QoSMate
                                                                              SQM
                                                                              调度算法
                                                                              支持HFSC和CAKE
                                                                              主要支持CAKE和fq_codel
                                                                              自动配置功能
                                                                              支持,自动测速并根据结果进行限速及优先级配置
                                                                              无自动测速功能,需要手动设置带宽限速
                                                                              游戏优化
                                                                              提供专门的游戏流量优化,支持手动指定设备优先级
                                                                              无专门的游戏优化功能,主要依赖 CAKE 调度
                                                                              灵活性
                                                                              提供更多高级配置选项,适合有网络管理经验的用户
                                                                              配置简单,适合普通用户
                                                                              使用界面
                                                                              配置更复杂,提供更精细的控制
                                                                              界面简洁易用
                                                                              QoSMate提供了比SQM更加灵活的网络流量管理功能,特别是针对游戏流量的优化能力,使其非常适合对网络质量有更高要求的用户。同时QosMate可以进行自动测速及自动配置,降低Qos插件的使用门槛。

                                                                              📝 QosMate安装方法

                                                                              QosMate目前并没有提供*.ipk 的包安装方式,无法通过opkg直接进行安装,需要通过SSH在终端进行安装。

                                                                              安装须知

                                                                              在安装QoSMate之前,请确保:
                                                                              1. 已禁用并停止任何现有的QoS服务或脚本(如SQM、Qosify、DSCPCLASSIFY、SimpleHFSCgamerscript 等),以避免冲突。
                                                                              1. 重新启动路由器,以清除旧设置,确保一个干净的启动环境。
                                                                              1. Qos插件需安装在主路由上,即直接与外网进行连接的拨号路由。在旁路由或旁路网关上安装没有作用,同时如果使用硬件加速情况下,可能存在无法精确控制的情况。
                                                                               

                                                                              后端执行文件安装

                                                                              使用以下命令安装QoSmate后端(其中包含主脚本/初始化脚本/hotplug和配置文件):
                                                                               
                                                                              如果无法正常连接raw.githubusercontent.com ,可使用下面命令安装,或替换为可使用的其他CDN:
                                                                               

                                                                              Luci前端控制页面安装

                                                                              与我们熟悉的其他OpenWRT插件安装方式不同,QosMate的前端UI控制界面安装是通过在/www/luci-static/resources/view文件夹下直接建立目录及页面文件方式安装,没有使用*.ipk的包安装方式,个人猜测可能是作者不想编译OpenWRT各种架构的软件包,但不一定对。
                                                                               
                                                                              如果无法正常连接raw.githubusercontent.com ,可使用下面命令安装:

                                                                              🤗 使用指南

                                                                              安装后,通过下面的命令启动QoSmate服务:
                                                                              或者,通过OpenWRT的Luci控制页面的方式进行使用。
                                                                              • 访问OpenWRT的LuCI控制网页界面,并打开网络 - QoSmate
                                                                              notion image
                                                                              • 配置基本设置。对于基础配置,调整以下关键参数:
                                                                                • WAN接口:选择你的 WAN接口,一般为wan
                                                                                • 下载速度 (kbps):设置为实际下载速度的80%-90%
                                                                                • 上传速度 (kbps):设置为实际上传速度的80%-90%
                                                                                • 根队列调度算法:选择HFSC(默认)或CAKE
                                                                              • 应用更改。
                                                                               

                                                                              自动配置

                                                                              如果你更倾向于自动配置,QoSmate提供了自动设置功能:
                                                                              1. 在QoSmate设置页面,点击Start Auto Setup
                                                                              1. (可选)输入游戏设备的IP地址以优先处理其流量,地址支持IPv4和IPv6。
                                                                              1. 等待测速和配置完成。
                                                                              注意:基于路由器的测速可能会低估你的实际网速。为了获得更准确的设置,可以从局域网设备运行测速,例如使用fast.com或者speedtest,并手动输入结果。自动设置为初步配置提供了方便,但为了获得最佳性能,可能需要手动微调。
                                                                               

                                                                              已知问题

                                                                              如果通过/etc/init.d/qosmate 命令无法启动QosMate,或者通过Luci控制页面无法启动QosMate,并提示XHR错误,一般是因为raw.githubusercontent.com 在国内无法访问的原因,所以导致连接超时,需要修改/etc/init.d/qosmate 文件:
                                                                              通过vim 打开/etc/init.d/qosmate ,修改SCRIPT_URLHOTPLUG_SCRIPT_URL 所对应的地址,替换为镜像CDN地址:
                                                                               

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              使用Pipedream同步RSS至Twitter(X.com)

                                                                              2024年12月30日 08:00
                                                                              😀
                                                                              之前使用过IFTTTDlvr.it进行RSS到Twitter的同步,现在这两个平台都已经收费,无法继续白嫖。在尝试同步RSS到BlueSky的时候发现了PipeDream这个网站,允许用户使用Python或者NodeJS搭建简单的工作流,所以理论上也是可以将RSS同步到Twitter,例如个人博客、豆瓣在看在读等等支持通过RSS Feed输出的信息流。在完成实践并测试成功之后,有了这篇指南,希望可以帮助到需要的朋友。

                                                                              📝 搭建前提

                                                                              • 一个Twitter开发者平台账号,申请入口为:Developer Platform,个人使用免费Plan即可,每个月允许500条POSTS。对于同步豆瓣或者个人博客来说,足够使用。注册时会要求填写申请理由,例如:
                                                                              notion image
                                                                              我这里提供一份范本,可根据自己需要修改:
                                                                              🛠
                                                                              Synchronize RSS to my personal X account for recording movies I have watched, music I have listened to, or content I have posted on my blog, etc. This functionality allows me to maintain a comprehensive and organized record of my personal experiences, preferences, and creative outputs. By integrating RSS feeds with my X account, I can easily keep track of the various forms of media I engage with, whether it's a captivating film that I watched over the weekend, a new album that I discovered and fell in love with, or an insightful blog post that I crafted and shared with my audience.
                                                                              This synchronization process not only enhances my personal organization but also serves as a digital diary of sorts, capturing my evolving tastes and interests over time. It provides a convenient way to look back at my past activities and reflect on how my preferences have changed or remained consistent. Moreover, this feature can be a valuable tool for personal branding, allowing me to showcase my diverse interests and creative endeavors to my network.
                                                                              Totally personal applications, this system is designed to cater to my individual needs and privacy preferences. It ensures that all the data being synchronized is managed within the confines of my personal X account, offering a secure and private space where I can store and access my records without any external interference. This level of personalization and control is crucial for maintaining the integrity of my digital identity and ensuring that my personal data remains protected and accessible only to me.
                                                                              In summary, this RSS synchronization feature transforms my X account into a multifunctional hub where I can document, organize, and reflect upon my personal and creative experiences. It's a tool that not only simplifies my daily interactions with various forms of media but also enriches my digital presence by offering a detailed and dynamic representation of my personal journey.
                                                                               
                                                                              • 一个PipeDream账号,申请入口为:pipedream,可以使用Google或者Github账号登录。同样免费计划即可,可以创建3个工作流,足够使用。

                                                                              📝 主旨内容

                                                                              获取Twitter Key And Tokens

                                                                              打开https://developer.x.com/en/portal/projects-and-apps,在左侧菜单点击Projects & AppsOverview ,然后系统已经自动生成了一个App,我们需要的是获取这个App的Api以及认证所需的Token。
                                                                              点击User authentication settings 下的Set Up 按钮,进入配置页面:
                                                                              notion image
                                                                              • App Permissions选择Read and write ,因为我们要发布推文;
                                                                              • Type of App选择Web App, Automated App or Bot
                                                                              • App InfoCallback URLWebsite URL 填写自己的域名,如果没有就填写pipedream的。
                                                                              • 点击Save 会输出一个Client ID和Token,但是这个不是我们需要的,没有什么用。
                                                                              返回Overview页面,点击PROJECT APP后面的小钥匙图标:
                                                                              notion image
                                                                              点击Access Token and Secret 后面的Generate 按钮,会生成Access Token和Access Token Secret,一定要复制保存下来,等下会用到。
                                                                              点击API Key and Secret 后面的Regenerate ,会生成API KeyAPI Key Secret,同样保存下来,等下在PipeDream中会用到。

                                                                              配置Pipedream环境变量

                                                                              现在假设你已经完成了Pipedream的注册,进入后管理后台,点击左侧菜单的Settings ,然后选择Environment Variables
                                                                              notion image
                                                                              点击右上的+ New Variable 添加新的变量,总计需要添加4条,对应关系如下:
                                                                              • TWITTER_ACCESS_SECRET : 获取的Access Token Secret
                                                                              • TWITTER_ACCESS_TOKEN : 获取的Access Token
                                                                              • TWITTER_API_SECRET : 获取的API Key Secret
                                                                              • TWITTER_API_KEY : 获取的API Key Secret
                                                                              对应关系不要搞乱,变量名称也不要有错误。

                                                                              配置Pipedream Project和Workflow

                                                                              点击左侧菜单的Projects ,然后点击右上角的+ New Project ,填写项目名称,建议填写英文,字数不要太多,因为如果想要删除项目,要重新输入一遍项目名称,很麻烦。例如我就填写Twitter,然后点击Create Project ,完成项目的创建。
                                                                              在列表中点击刚刚创建的项目名称,然后点击页面中硕大的一个+New 按钮,选择Workflow ,修改一下Workflow的名称,同样名称写的简单点,不然删除很麻烦,其他内容不用动,直接Create Workflow

                                                                              添加RSS Trigger触发器

                                                                              notion image
                                                                              点击Add Trigger ,先添加一个触发器。因为我们是想在RSS有新的条目时,自动发送一条推文,所以这里的触发器就是RSS Feed。
                                                                              notion image
                                                                              My Sources中选择New Item in RSS Feed
                                                                              notion image
                                                                              Timer :建议选择8小时查询一次,降低请求。UTC懒得选择的话,维持默认也可以。
                                                                              Feed URL :填写你要读取的RSS Feed地址。
                                                                              Published After:维持默认不用管。如果想避免发送重复内容或者一次发送太多,可以选择当前时间较前一点点的时间。
                                                                              点击Save and continue 完成Trigger触发器的配置。Pipedream会尝试读取你填写的RSS Feed地址,并返回读取结果。

                                                                              添加触发动作

                                                                              完成上面RSS Trigger的创建之后,我们就需要配置当RSS有新的内容时,所要触发的动作,也就是在Twitter上发送一条推文。
                                                                              点击画板上,Trigger下面的+号来添加Action。
                                                                              notion image
                                                                              选择NodeRun Node Code
                                                                              notion image
                                                                              在右侧的代码编辑器中,复制下面的代码内容:
                                                                              然后点击Test 进行代码测试,如果没有问题的话,这时候你的Twitter中就会有一条自动发送消息。然后点击Deploy完成这个通过Pipedream推送RSS内容到Twitter的工作流部署。

                                                                              Twitter推文效果

                                                                              notion image
                                                                              效果大概如图所示(有点丑,但可以用),可根据自己需要对以下代码部分进行修改:
                                                                              之后如果我有新的代码调整,也会同步更新到这篇文章内。

                                                                              🤗 总结归纳

                                                                              整个教程整体来说没有太多的技术难度,主要就是一些复制与粘贴的工作。不过因为之前已经在Pipedream中使用了2个Workflow用于BlueSky的RSS同步,所以一共3个的Workflow限制目前刚刚好,如果再多的话,免费版的账号就不支持了。后续会尝试将BlueSky和Twitter的同步尝试写在一个Workflow里。
                                                                              如无意外,这应该是2024年的最后一篇正式文章。提前祝大家新年快乐,2025年一切顺利。
                                                                               

                                                                              2025/01/02 更新

                                                                              代码目前存在一个问题,当URL含有中文字符时,在Twitter会产生截断,我想想办法怎么修一下。

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关Workflow安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              NotionNext博客精简优化

                                                                              2024年12月25日 08:00
                                                                              😀
                                                                              最近几天一直在尝试对博客进行优化。博客是使用NotionNext,部署在Vercel上。NotionNext是我用过最舒服的博客程序之一,大部分情况下可以让我在Notion专注写东西,同时如果有新的想法,也可以通过Notion及时的进行更新,即便是出门在外使用手机的情况下。但NotionNext为了满足更普遍插件及主题需求,默认情况下需要加载很多的JS,这篇文章主要就是将我的优化过程进行记录。同时也记录一下我这一年写博客的一些感想。

                                                                              📝 NotionNext优化

                                                                              NotionNext是一个使用Next.js框架和Notion API的博客程序,使用Notion作为数据库,将写作与博客展示分开。对于我来说,NotionNext提供了一个良好的写作体验,同时也不用担心因为服务器到期或者网站遭受攻击导致的文章数据丢失问题,而且又能部署在Vercel上,节省了一笔服务器费用。
                                                                              我使用的NotionNext是通过yarn export生成SSG静态页面方式部署在Vercel。在首次通过Page Speed Insights测试时,Performance分数只有70分出头,这还是在之前已经通过《🔧用Cursor帮我优化博客SEO》这篇文章所提及的优化之后。之前在Google Search Console中,Core Web Vitals也提示我的大部分页面需要进行LCP优化,原因是LCP时长超过了2.5秒。这也是促成我再次对博客进行优化的一个原因。
                                                                              以后后的结果如下,终于偶尔可以在移动端达到全绿的结果,就算Performance无法到达90分以上,大部分时候也是在80-90之间,之后需要解决的就是继续压缩FCP延迟的问题。
                                                                              notion image
                                                                              文章只是提供一种修改的思路,在根据文章内容进行删减时,建议做好备份操作,避免产生不可逆影响。目前我使用的是NotionNext 4.7.11版本。在修改的过程中,请善用下面两条git命令用于回滚版本。同时不建议向我一样直接提交到GitHub并同步到Vercel部署,可以通过yarn dev 在本地u使用测试环境查看结果。
                                                                              这次优化的另一个重点就是完善一下博客的SEO。尽管NotionNext已经默认配置好了一些SEO的部分,但是还是存在一些问题,需要自己手动调整和优化。

                                                                              JS加载分析

                                                                              在Vercel每次部署的时候,Build Log中均会生成+ First Load JS shared by all ,这是每次需要加载的总JS大小。在未经优化之前,整体加载大小为214KB,其中主要部分均为_app-*.js 这个文件。所以我们的首要目标就是缩小_app-*.js 这个文件的大小。在优化完成后,我成功的将_app-*.js 从112kb大小缩小到了63kb大小,将近50%,页面加载速度也所有提升。

                                                                              _app.js分析及优化

                                                                              _app-*.js 文件是通过NotionNext中pages/_app.js 文件生成,_app.js 是Next.js用于自定义App组件进行全局初始化页面的js文件。NotionNext默认的_app.js 包括如下内容:
                                                                              从各种扩展插件部分开始,这里分别是:
                                                                              • BLOG:blog.config.js的各种配置信息。_app.js会把blog.config.js中的各项配置信息读取并在生成_app-*.js时包括在内。
                                                                              • ExternalPlugins:读取/components/ExternalPlugins.js 内的配置信息,主要是外部第三方的插件调用。会写入到_app-*.js中。
                                                                              • SEO:读取/components/SEO.js 内的配置信息。主要为SEO相关的配置,影响位置在<head></head>标签内。
                                                                              • Clerk:包括zhCNClerkProvider等部分,主要是登录、注册部分功能,同时与openwrtite插件有关联。
                                                                              那么核心需要优化的部分就是如下这些:
                                                                              • 精简blog.config.js 内的配置信息,不使用的功能部分配置进行注释或者删除。
                                                                              • 精简ExternalPlugins.js 内的插件调用,不使用的插件功能删除或者注释掉。
                                                                              • 精简SEO.js 内的插件调用,以及对部分SEO配置项进行优化。
                                                                              • 由于我不需要登录、注册以及OpenWrite插件进行微信公众号导流,所以将Clerk部分功能删除。

                                                                              去除Clerk部分

                                                                              Clerk是一个serverless登录鉴权服务,支持大量第三方的OAuth登录,很方便就能搭建起登录体系。但是我并不需要这个登录体系,并且Clerk会引用一个较大的JS包,并合并到_app-*.js 中,这应该是最大的引入内容。我直接选择删除。
                                                                              在直接全部删除之后,部署之后会出现错误,无法正常显示网站内容,需要添加如下代码,使NotionNext可以返回正常内容:
                                                                              另外,Clerk在lib/global.js 文件中也有植入,所以需要一并清除:

                                                                              blog.config.js 优化

                                                                              blog.config.js内的配置信息太多。且由于在Github上fork的NotionNext项目无法修改为私有模式。存在部分配置泄露的可能。所以我尽可能的将配置信息放在Notion中的配置中心和Vercel的环境变量中。以下列出部分可安全注释或删除的配置:

                                                                              基本信息部分

                                                                              以上配置项可将内容部分删除。减少写入到_app-*.js 内的字符

                                                                              社交链接部分

                                                                              以上各种社会化媒体的配置部分,可将不需要的配置删除。我只保留了邮箱。其他均删除。

                                                                              路径和组件映射

                                                                              由于我不需要登录注册相关的功能,所以对应的页面也就不需要进行渲染。这里将验证页面、登录页面、注册页面以及管理台的页面路径和组件映射删除。你也可以选择注释掉,避免之后可能会用到相关的功能。

                                                                              Facebook Fan Page组件配置部分

                                                                              Facebook Fan Page主要是用来在Widget进行展示使用。我没有Facebook,所以也不需要这部分的功能及配置。

                                                                              ALGOLIA搜索

                                                                              Algolia搜索目前我使用的Medium主题还不支持。所以我选择暂时先注释掉。如果之后研究明白怎么在Medium主题内使用Algolia搜索,再取消注释。

                                                                              各种特效、AI文章摘要、机器人以及音乐播放插件

                                                                              我不喜欢各种特效,降低页面性能的同时,还会干扰浏览者。同时我也暂时不需要各种机器人帮助总结文章内容。我会尝试在每篇文章的底部总结去自己手写一些要点。音乐播放器对于我来说更是用不到的部分。以上这些我都是直接选择删除。

                                                                              评论插件

                                                                              NotionNext内置了包括twikoo、utterance、gitscus、gitalk、valine、webmention等评论插件,但是我实际使用到的只有twikoo,且没有选择更其他评论插件的想法。所以除了twikoo之外的插件部分全部删除。

                                                                              站点数据统计

                                                                              NotionNext在站点数据统计部分插件也内置了挺多的,包括Vercel、Busuanzi、Baidu、CNZZ、Google Analytics、51la、Matomo、Ackee、Clarity等等。目前我都用不到,只保留了一个SEO_GOOGLE_SITE_VERIFICATION 用于Google Search Console的站点认证使用。同时对于网站的数据统计,我通过使用Cloudflare Zaraz来使用Google Analytics,也就不在NotionNext启用并配置相关内容了。

                                                                              广告营收部分

                                                                              因为我之后可能还是会想尝试一下Google Adsense,所以这部分配置项进行了保留,仅将数值内容删除。
                                                                              万维广告及对应的广告屏蔽插件检测我均不需要,所以删除。

                                                                              订阅部分

                                                                              我没有也不提供邮件订阅。访客群体大多数也是国内浏览者,没有太多使用邮件的习惯,所以我甚至邮件服务器都懒得去弄。这里只保留一个RSS就可以了。

                                                                              作废配置部分

                                                                              这里虽说是作废配置,但是经过我测试不可以直接删除,所以我将部分配置项的值进行了修改,能缩短一字节也是有意义的。

                                                                              seo.js 优化

                                                                              seo.js这个文件,名字虽然是seo,但是其实他是一个NotionNext的<head></head> 管理js文件。如果需要修改meta信息,或者添加网站认证代码,均可以在这个文件进行配置。

                                                                              去除重复的favicon

                                                                              在seo.js中有重复的<link rel=’icon’ />标签,可以移除一个。我移除的是下面这个:

                                                                              修改Meta Charset位置

                                                                              Charset位置建议放在<head></head> 标签中的第一个位置

                                                                              删除Baidu站点管理相关部分

                                                                              我不使用Baidu站点统计及站点管理功能,百度的抓取与收录对于我来说也没有什么意义。这个博客没有任何的备案,也未部署在国内的云服务器。

                                                                              删除Busuanzi数据统计部分

                                                                              删除WebMention部分头信息

                                                                              Webmention需要通过xmlrpc使用pingback功能,所以会在<head>标签中添加link引用。我不适用Webmention,这部分删除,减少<head>标签体积。

                                                                              添加canonical标签

                                                                              默认的NotionNext没有添加canonical标签,在SEO中存在一点点缺憾,为了能让搜索引擎更好的理解站点结构和唯一性结果,所以在<head>中添加canonical标签。关于canonical是什么,可以参考这里:《如何使用 rel="canonical" 及其他方法指定规范网址
                                                                              <head></head>之间添加上述canonical代码,href即链接为当前页面的链接。

                                                                              Facebook Page相关

                                                                              由于我不需要Facebook Page,同时在blog.config.js中也删除了相关的配置信息,所以在seo.js文件中也移除相关的代码。

                                                                              DNS-Prefetch相关

                                                                              因为我的博客有使用外部CDN提供的JS文件,所以添加了dns-prefetch<heaad> 标签中。在浏览者访问网站的时候,可以预解析外部引入的JS文件域名,从而加快一些网站的访问速度。涉及到的域名包括https://cdnjs.cloudflare.comhttps://cdn.jsdelivr.net 以及https://npm.elemecdn.com

                                                                              ExternalPlugins.js 优化

                                                                              ExternalPlugins.js 这个文件相当于引用外部插件的一个入口,在NotionNext的初始默认情况下,调用了太多的插件,包括:主题切换(THEME_SWITCH)、调试(DEBUG)、ACKEE数据统计、Vercel数据统计、Busuanzi数据统计、Facebook Page、烟花特效(FIREWORKS)、樱花特效(SAKURA)、星空特效(STARRY_SKY)、音乐播放器(MUSIC_PLAYER)、彩带(FLUTTERINGRIBBON)、自定义右键菜单(CUSTOM_RIGHT_CLICK_CONTEXT_MENU)、禁止复制(CAN_COPY)、WHIZ数据统计(WEB_WHIZ_ENABLED)、Chatbase、DAO_VOICE、万维广告(AD_WWADS_ID)、百度数据统计、CNZZ数据统计、ARTALK评论插件、Gitter评论插件、Matomo评论插件、51la数据统计插件、Tianli机器人、DIFY机器人、Clarity数据统计、鼠标跟随插件、COZE机器人、Vconsole调试插件等等插件。
                                                                              在默认情况下,这些插件及外部引入的js文件均会加载并合并至_app-*.js文件中,这也是造成_app-*.js 文件过大的一个原因。我所删除的部分包括:

                                                                              主题部分优化

                                                                              除去上面_app.js 这些部分。在主题中,也有不少的插件直接植入。例如busuanzi、备案信息等等,这部分对于不同的主题并不通用,所以需要自己酌情修改。我所使用的是NotionNext主题是medium,在medium主题中,这些基本都是在footer.js文件或者articleinfo.js文件内。所以直接进行修改即可:

                                                                              ArticleInfo.js

                                                                              Footer.js

                                                                              多语言引入JS优化

                                                                              NotionNext提供了多语言,包括中文简体、中文繁体、英文、土耳其语、日语等,但由于博客主要使用中文,且没有多语言计划,所以只保留中文简体与英文。其他部分去掉。编辑lib/lang.js ,去除除中文简体与英文外其他部分:

                                                                              CSS优化

                                                                              NotionNext部分插件CSS写入了全局配置,在global.css 中可以找到。因为我的评论系统使用的是Twikoo,没有使用Waline和WebMention,所以相关CSS样式可以移除,在133行附近。同时因为我未使用ChatBox,所以相关代码也进行了移除。同时也对Fontawesome所使用的图标进行了优化,默认配置中是引用了Cloudflare CDN上的all.min.css ,包括全部可使用的FontAwesome图标,我使用不到那么多。

                                                                              其他优化

                                                                              这次对博客的整体瘦身优化过程中,也对以下部分进行了修改与调整:
                                                                              • 添加了DNSSEC认证,避免中间人攻击及域名污染问题。由于目前为了提高国内的访问速度,使用的是SaaS回源优选Cloudflare IP,所以只在回源域名增加了DNSSEC认证。
                                                                              • 关闭了Cloudflare提供的Crawler Hints功能,因为我怀疑我被Bing Excluded就是因为Cloudflare利用IndexNow推送一些不重要的页面、字体文件、图片等等。
                                                                              • 关闭了Github Action中NotionNext提供的PushUrl功能。我经常会调整博客,所以每次Push之后都会触发,这也可能是Bing认为我滥用IndexNow的一个原因。
                                                                              • 不再使用Cloudflare优选IP,尽量少白嫖一点赛博菩萨。同时在考虑是否关掉小黄云,这样国内的浏览者访问速度会更快些。
                                                                              • 精简了列表页面的展示文章数量,从12减少到10。因为我认为从搜索引擎而来的访客都具有明确的目的,并且到达的也是明确的落地页,所以列表页的重要性没有那么高。而较少文章数量的列表页,能够提供更好的加载速度,尤其是首页(首页也是一个列表页)。
                                                                              • 优化了标签页面和文章分类页面的meta description ,使他们具有和首页不同的meta描述信息。
                                                                              • 去除了首页和全站搜索页面的输入框。因为我是通过yarn export方式的SSG部署,所以搜索功能其实并不可用,反而会跳转到404页面。
                                                                              • 添加了部分页面的内链及锚文本,尽可能的做好SEO。
                                                                              • 更换Prism Autoloader的CDN为cdnjs.cloudflare.com,通过IT DOG查了一下cdnjs在国内的访问速度并不差,原来的elemecdn会多一次请求,同时在使用Pagespeed Insights测试时候偶尔会timeout

                                                                              🤗 总结归纳

                                                                              首先特别感谢tangly1024所开发的NotionNext,让我又重新开始写博客,这是一个我认为很棒的开始。
                                                                              在过去的这一年时间里,慢慢的将博客从0收录,到现在日访客200多将近300,看着访问曲线上升以及评论区的反馈,真的感到很有成就感,也真的为自己所分享的内容帮助到别人而开心。简中互联网现在可查阅的内容太少了,我也真的希望自己可以记录下一些能够解决别人问题的内容。
                                                                              在过去的这一年中,通过写博客这件事情,我也慢慢开始上手进行写一些代码,尽管大部分都是在AI(Cursor、Cline等等)的帮助下,但是也感觉自己是在进步,有在学会找解决问题的方式。昨天还和朋友在聊现在AI的势头,会不会大部分工作都变得没有意义。我想,在AI普及之后,只是我们找答案的方式变了,但是提出问题与寻找答案,还是要靠我们人类自己。
                                                                              我不太是一个善于描述内容的人,写博客对于我来说也是一种讲述内容的锻炼:如何将一件事的过程讲给浏览者听,让他们明白与理解。所以我也需要对访问博客的浏览者表示感谢,你们在帮助我锻炼这种能力。
                                                                              最后,祝各位圣诞节、元旦新年快乐。

                                                                              📎 参考文章

                                                                              💡
                                                                              有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              在OpenWRT旁路网关上通过Caddy实现Homelab反向代理

                                                                              2024年9月8日 08:00
                                                                              🚧
                                                                              OpenWRT默认是使用uhttpd作为web服务器提供网页访问服务,uhttpd作为一个轻量的web服务器日常提供OpenWRT Luci相关的页面服务确实是已经足够。但是我有一个想法,家里的配置的服务实在是太多了,分散在不同的主机上,使用没有规则的端口,经常会忘记哪个服务应该访问哪个地址,使用哪个端口,所以我想通过域名的方式将这些服务统一管理起来。既然是IP+端口的方式,那么最方便的解决办法之一当然就是使用反向代理,而目前配置反向代理最方便的是Caddy,这也就是为什么会有这篇文章的原因。

                                                                              📝 什么是Caddy

                                                                              Caddy是一个现代的开源Web服务器,基于Go语言实现,具有内置的自动HTTPS功能,支持反向代理、负载均衡、静态文件托管等功能。Caddy以其简单易用的配置和自动化特性著称,尤其适用于需要快速搭建和管理HTTPS网站的场景。它的配置文件格式是人性化的Caddyfile,并且支持JSON格式的API配置。同时,Caddy的反向代理配置也很简单,只需要在Caddyfile中添加类似如下的代码片段即可:
                                                                              这就很方便我们进行家庭网络内各种服务的反向代理配置,不用写很多行的配置项。

                                                                              📝 OpenWRT如何使用Caddy

                                                                              在为家庭网络内的各种服务配置反向代理前,我们先要让OpenWRT使用Caddy,因为默认uhttpd在占用OpenWRT的:80端口,如果直接使用Caddy,那么就不能使用:80端口,需要使用未被占用的端口,例如:8080,最终形成的反向代理地址会变成example.lan:8080 ,不美观,而且也没有实现我们希望完全使用域名进行管理的初衷。所以我们先需要使用Caddy替代掉OpenWRT原有的web服务器uhttpd。

                                                                              安装Caddy

                                                                              下载Caddy

                                                                              首先安装Caddy,Caddy无法通过OpenWRT自带的包管理器opkg直接进行安装,但是由于其本质是基于Go语言编写的一个二进制的执行文件,所以我们可以通过Caddy的官网进行下载。
                                                                              Platform:选择Linux amd64,我是在旁路由(旁路网关)上进行安装,架构为X86-64,所以选择这个。如果你是其他的架构,根据自己的架构进行选择。
                                                                              Standard Feature:默认勾选
                                                                              Extra Feature:我们点击filter package and modules,输入cgi,选择aksdb/caddy-cgi/v2
                                                                              然后点击下载按钮。
                                                                              或者你也可以直接在OpenWRT的终端中执行:
                                                                              重命名Caddy:
                                                                              赋予Caddy执行权限,并移动到/usr/bin执行目录:

                                                                              配置Caddy配置文件Caddyfile

                                                                              使用你喜欢的编辑器打开/etc/caddy/Caddyfile
                                                                              删除原有配置文件内的内容,并添加如下内容:
                                                                              代码逻辑:
                                                                              1. 配置顺序控制
                                                                                1. order cgi before respond:指定 Caddy 处理请求时的顺序。这里表示 CGI 处理器的优先级比默认的 respond 指令更高。
                                                                                2. order file_server last:指示 file_server(静态文件服务器)的处理顺序应排在最后,即在其他处理器之后才执行。
                                                                                3. skip_install_trust(注释掉的部分):表示跳过安装可信的 HTTPS 证书。这可能是为了防止将 Caddy 生成的证书添加到系统的信任存储中。
                                                                                4. auto_https disable_redirects(注释掉的部分):禁用自动从 HTTP 重定向到 HTTPS 的行为。Caddy 默认会启用 HTTPS,并自动从 HTTP 重定向到 HTTPS,此处被关闭。
                                                                                5. default_sni openwrt.local(注释掉的部分):指定默认的 SNI(Server Name Indication),用于在 HTTPS 请求中无法匹配到特定主机名时使用的主机名。
                                                                              1. luci 站点块定义
                                                                                1. (luci):这是一个命名块,定义了一组共享的配置,可以在其他站点块中通过 import 引用。
                                                                                2. root * /www:设置静态文件的根目录为 /www,即请求文件时,会从 /www 文件夹中查找文件。
                                                                                3. route /cgi-bin*:定义一条处理以 /cgi-bin 开头的路径的路由。这通常用于处理 CGI(Common Gateway Interface)脚本请求。
                                                                                  1. @exists:这是一个请求匹配条件,检查是否在 /www/cgi-bin 下存在对应的文件。
                                                                                  2. handle @exists:如果找到了这个文件,Caddy 会执行以下处理逻辑:
                                                                                    1. uri strip_prefix {file_match.relative}:从请求 URI 中去掉前缀,简化路径。{file_match.relative} 是捕获的相对路径。
                                                                                    2. cgi * /www/{file_match.relative}:将匹配的文件作为 CGI 脚本执行。/www/{file_match.relative} 指定了文件位置。
                                                                                    3. script_name {file_match.relative}:指定 CGI 脚本的名称。
                                                                                  3. cgi /ubus ubus.sh*:设置 /ubus 路径为调用 ubus.sh 脚本,script_name /ubus 指定了 CGI 脚本名为 /ubus
                                                                                  4. file_server:启用文件服务功能,允许从 /www 目录中提供静态文件。
                                                                                  5. redir / /cgi-bin/luci:如果访问的是 /,重定向到 /cgi-bin/luci,这是 LUCI Web 界面的默认入口。
                                                                              3. HTTP 站点配置
                                                                              1. http://:这一部分表示处理所有 HTTP 请求。通过 import luci,Caddy 会引入之前定义的 (luci) 配置块,这样 HTTP 请求会按照该块的配置来处理。
                                                                              1. HTTPS 站点配置(注释掉的部分)
                                                                                1. tls internal:表示使用 Caddy 内置的自签名证书来启用 HTTPS,而不是获取外部的 SSL 证书。
                                                                                2. on_demand:按需启用 HTTPS,也就是说,只有当客户端发起 HTTPS 请求时,Caddy 才会生成证书。
                                                                                3. import luci:引入 (luci) 块的配置,用于处理 HTTPS 请求。
                                                                               
                                                                              默认使用http协议,如果你需要使用https协议,那么将代码中注释掉的部分取消注释即可。

                                                                              下载ubus.sh并进行配置

                                                                              从github下载ubus.sh并放入和Caddyfile相同的目录,同时在/www/cgi-bin也复制一份,用于提供ubus的基础API功能。

                                                                              关闭uhttpd

                                                                              通过/etc/init.d/uhttpd关闭uhttpd提供的web服务

                                                                              配置caddy启动脚本

                                                                              /etc/init.d中新建一个名为caddy的文件,并填充以下代码:
                                                                              赋予执行权限,并允许开机自动启动
                                                                              然后重启路由器,即可完成Caddy替换uhttp的操作。

                                                                              配置Caddy反向代理

                                                                              编辑/etc/caddy/Caddyfile ,在文件底部新增:
                                                                              第一行的域名是你希望使用的域名,建议局域网服务使用*.lan或者*.local
                                                                              reverse_proxy是被反向代理服务器的地址和端口,根据自己实际情况进行修改。
                                                                              如果有多个服务,就添加类似这种多个代码块。
                                                                              编辑完成后保存,然后通过重新加载caddy配置文件。

                                                                              配置DNS解析

                                                                              如果你和我一样使用的是Adguard Home,那么可以在过滤器 - DNS重写 添加规则:*.lan重定向到Caddy服务器所在IP。
                                                                              如果你使用的是Dnsmasq那么在DHCP/DNS - 转发中进行配置:/*.lan/Caddy所在IP

                                                                              🤗 总结归纳

                                                                              目前替换后使用效果很好,达到了预期,例如我将jellyfin配置为media.lan, sunshine的远程串流管理页面配置为game.lan,Adguard Home配置为adg.lan,还有其他七七八八的docker服务均进行了配置,同时通过uptime kuma进行可用性监控,比原来需要自己手动输入端口号的方式方便了不少,不用再记乱七八糟的端口和IP。
                                                                              Caddy替代uhttpd也工作的很好,除了在Homepage中监控OpenWRT的状态目前无法获取,调用接口提示500错误,这个我在寻找解决的办法。

                                                                              📎 参考文章

                                                                               
                                                                              💡
                                                                              有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                              使用Caddy反向代理加速NotionNext博客图片访问

                                                                              2025年1月2日 08:00
                                                                              😀
                                                                              NotionNext默认使用的是Notion图床。Notion在国内没有服务器,所以通过Notion.so域名请求的图片资源文件在国内的访问速度不是很好,我们可以通过使用Caddy反向代理的方式加快Notion.so的图片访问,从而提高使用NotionNext的博客在国内的访问速度与用户体验。
                                                                              这个问题也是昨天突然博客国内用户的访问量增加,我在Cloudlfare Web Analytics里面发现的。因为Notion在国内没有服务器,访问速度不算很好,所以大部分图片的LCP延迟都在5秒左右,在一篇包含很多张图片的文章里,整体的加载速度更堪称灾难级,为了优化国内的访问体验,所以尝试寻找解决方案,在《Nginx设置Notion反代加速NotionNext图片资源访问》这篇文章中,作者提到可以通过使用Nginx反向代理方式进行解决。我没有使用Nginx作为Web服务器,而是使用的Caddy这个更轻量化的解决方案,所以就在这篇文章的基础上,提供一份基于Caddy的反向代理解决方案。
                                                                              目前Notion.so在国内的访问情况如下:
                                                                              notion image

                                                                              📝 配置前提

                                                                              你需要一台云服务器,境内境外均可,我所使用的小鸡是在香港,国内访问速度在ITDOG上查询还不错。平常只作为RSS服务和Docker加速使用。如果不使用Cloudflare的话,需要自行在云服务器为用于反向代理的域名申请证书。
                                                                              我没有使用Cloudflare Worker进行反向代理的原因是担心会被Ban。

                                                                              📝 安装Caddy

                                                                              Caddy的安装很简单,由于不使用其他第三方插件,所以可以直接通过系统的包管理器进行安装,例如我使用的是Debian系统:

                                                                              📝 修改Caddy配置文件

                                                                              这里我所使用的域名是notion.dolingou.com ,即通过notion.dolingou.com域名替代notion.so域名从而实现反向代理。安装完Caddy之后,配置文件位于/etc/caddy/Caddyfile ,你可以使用你喜欢的编辑器进行编辑,例如我使用的是Vim ,添加如下内容:

                                                                              配置要点

                                                                              拒绝所有非博客域名请求

                                                                              涉及代码段:
                                                                              这部分主要是避免这个反向代理被恶意使用,造成反向代理服务器的负载过高出现问题。所有非博客域名的请求均会返回403错误。你可以将*.dolingou.com 替换为你的域名

                                                                              处理根目录请求

                                                                              涉及代码段:
                                                                              这部分主要用于当用户直接访问根目录及根目录下/image时,返回200 请求,并设置响应头的Content-Typetext/plain ;一方面为特定路径提供简单的占位符响应,另一方面可以快速测试服务器的响应。

                                                                              代理转发配置

                                                                              涉及代码段:
                                                                              用于将匹配特定路径的请求代理转发到目标服务器https://www.notion.so,并在转发过程中设置一些请求头和SSL/TLS配置。
                                                                              具体如下:
                                                                              1. 定义匹配器 @imagePath
                                                                                • @imagePath 是一个匹配器(matcher),用于匹配特定的请求路径。
                                                                                • path_regexp image ^/image.*$:使用正则表达式匹配路径。
                                                                                  • ^/image.*$:匹配以 /image 开头的所有路径,例如 /image/image/123/image/test.jpg 等。
                                                                                • 这个匹配器会捕获所有路径符合正则表达式 ^/image.*$ 的请求。
                                                                                1. 反向代理配置:
                                                                                  • reverse_proxy 是一个指令,用于将请求代理转发到指定的后端服务器。
                                                                                  • @imagePath:指定匹配器,表示仅对匹配 @imagePath 的请求生效。
                                                                                  • https://www.notion.so:目标服务器的地址,所有匹配的请求都会被转发到这里。
                                                                                  1. 设置请求头:
                                                                                    • header_up 是一个指令,用于设置转发到后端服务器的请求头。
                                                                                    • Host www.notion.so:将 Host 头设置为 www.notion.so,确保后端服务器知道请求的目标主机。
                                                                                    • Referer https://www.notion.so:将 Referer 头设置为 https://www.notion.so,模拟请求来源。
                                                                                    • User-Agent {http.request.header.User-Agent}:将 User-Agent 头设置为客户端原始请求的 User-Agent,确保后端服务器能够识别客户端类型。
                                                                                    • X-Real-IP {http.request.remote.host}:将 X-Real-IP 头设置为客户端的真实 IP 地址,用于后端服务器记录或处理。
                                                                                    • Accept-Encoding "":清空 Accept-Encoding 头,防止后端服务器返回压缩内容(如果需要)。
                                                                                    • Accept-Language {http.request.header.Accept-Language}:将 Accept-Language 头设置为客户端原始请求的 Accept-Language,确保后端服务器返回正确的语言内容。
                                                                                    • X-Cache {http.reverse_proxy.header.X-Cache-Status}:将 X-Cache 头设置为反向代理的缓存状态(如果有)。
                                                                                    1. SSL/TLS配置:
                                                                                      • transport http:定义 HTTP 传输配置。
                                                                                      • tls:启用 TLS(HTTPS)加密,确保与后端服务器的通信是安全的。
                                                                                      • tls_server_name www.notion.so:设置 TLS 的服务器名称为 www.notion.so,用于 SNI(Server Name Indication)验证。
                                                                                      完成以上配置后,直接访问反代域名,这时候浏览器应该会显示一个200 OK! ,即表示配置成功。

                                                                                      📝 配置Vercel环境变量

                                                                                      完成以上配置后,在Vercel中的NotionNext项目下添加环境变量,用于替换默认的Notion Host(https://notion.so),位置位于SettingsEnvironment Variables 中,新增环境变量:
                                                                                      注意需要携带https,否则无法正常使用。添加完成后,对NotionNext进行重新部署即可生效。

                                                                                      🤗 总结归纳

                                                                                      因为我最终还是将反代域名使用Cloudflare CDN服务,也就是开启小黄云,所以为反代域名配置了SaaS回源使用Cloudflare优选IP,优化国内的访问速度。同时由Cloudflare提供缓存,故未在反代服务器的Caddy配置中添加缓存配置。目前的国内访问情况如下:
                                                                                      notion image
                                                                                       

                                                                                      📎 参考文章

                                                                                      💡
                                                                                      有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                                      OpenWRT配置Bird使用OSPF国内外动态路由分流

                                                                                      2024年12月29日 08:00
                                                                                      🛠
                                                                                      之前写过一篇关于RouterOS上使用OSPF("Open Shortest Path First",翻译为中文是“开放式最短路径优先”)进行国内外动态路由分流的文章,当时就在想,国内使用RouterOS作为主路由的人群应该不是很多,大多数的人有这个需要的人,使用的主路由系统应该都是OpenWRT或者其衍生版本。今天的文章就把之前的坑补上,将在OpenWRT系统中,使用Bird实现OSPF动态路由的国内外分流。

                                                                                      📝 配置背景

                                                                                      • 主路由器:OpenWRTImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
                                                                                        • 光猫桥接,接口为wan
                                                                                        • 内核版本为5.15.167(stable)
                                                                                        • 架构X86_64
                                                                                      • 旁路由(旁路网关):OpenWRT(ImmortalWrt 23.05.4 r28061-399f9a1db3 / LuCI openwrt-23.05 branch git-24.265.44782-0ff45d8
                                                                                        • 接口为br-lan,网关为主路由IP地址
                                                                                        • 运行OpenClash作为科学服务
                                                                                        • 内核版本为5.15.167(stable)
                                                                                        • 架构X86_64

                                                                                      📝 为什么要使用OSPF进行分流

                                                                                      在目前大多数网友使用OpenWRT路由系统的场景中,旁路由(旁路网关)应该是很大一部分,从而决定有一定基数的用户还保留着使用代理需要使用旁路由(旁路网关)这种习惯,从最初的各种盒子,到后来的Hyper-V虚拟机,再进阶到All in One的PVE,将Clash、SingBox、Dae等代理软件放在旁路由(旁路网关)应该已经称为很多使用者的一种习惯。而在使用过程中所配置的网络拓扑结构,随着不断的修改、缝补、优化,迁移起来的工作量也相对较大,从而在另一方面也继续维持这种习惯的惯性。
                                                                                      以上都是我个人作为使用者的一些猜测。对于我来说,在使用旁路由(旁路网关)这种拓扑结构,并在主路由进行分流的原因主要有以下两点:

                                                                                      增加直连效率

                                                                                      不管是Clash系列还是Singbox系列,或者直连性能非常恐怖的Dae,最终都需要由程序根据规则进行国内外的流量分流,不管是用Geosite还是GeoIP,数据均需要由代理程序进行一次处理,在对国内直连网站的效率上,或多或少都会产生影响。而由于这多出来的一层处理,对于国内的直连流量来说,也增加的不确定性。所以我选择在主路由使用路由表功能对国内与国外的流量进行拆分分流,国内流量直接通过主路由的网关出去,国外的流量再交给旁路由(旁路网关)根据规则进行处理,最大化直连性能。
                                                                                      至于为什么使用路由表而不是防火墙转发:路由表的查询发生在网络层(L3),是数据包转发的第一步,防火墙规则在路由决策之后处理,会增加额外的处理开销,更占用CPU,效率也没有路由表更高,当规则很多时,防火墙的性能会受到很明显的影响。路由器的主要工作就是根据目的地址,为数据包选择最优路由路径,这是路由器最为基础也是最为核心的功能。

                                                                                      增加网络容错性

                                                                                      代理这个东西,不是一直都很稳的。如果在主路由上使用,如果代理程序出现问题(尤其是喜欢劫持防火墙规则的一些程序),那么就意味着家里的网络直接出现问题,无法正常使用。如果自己一个人还好,但是如果家里有其他人使用,例如老人、孩子、夫人等等,那么就可能会因为网络出现问题而耽误使用,或者造成更多家庭问题。OSPF的动态路由可以很好的解决这一点,收敛速度与接收速度都很快,即便是旁路出现问题,那么也能在5秒之内完成路由表的收敛工作,将主路由的路由表恢复至默认状态,不耽误日常的使用。
                                                                                      综上两点,这也是我为什么使用旁路由(旁路网关)这种拓扑结构,并在主路由进行分流的原因。

                                                                                      📝 OpenWRT配置接收Bird的OSPF动态路由

                                                                                      此教程配置需要在主路由和旁路由进行操作。操作前建议备份或镜像,避免出现不可逆的网络问题。

                                                                                      OpenWRT旁路由(旁路网关)配置

                                                                                      旁路网关的配置可以参考《🔀RouterOS使用OSPF智能分流国外流量》中的具体说明,这里只列出步骤与相关的代码。
                                                                                      确认/etc/sysctl.d/10-default.conf开启以下选项:

                                                                                      安装Bird2

                                                                                      当使用OSPF协议时,通常需要一个路由守护进程来实现其功能。Bird是一种轻量且高性能的解决方案,能够同时支持IPv4和IPv6路由表。作为一款支持多种路由协议的软件,Bird同时也支持OpenWRT系统及其大部分衍生版本。
                                                                                      • 通过opkg安装所需软件包
                                                                                      • 编辑配置文件
                                                                                      创建bird的route路由表文件目录,用于存放生成的route4.confroute6.conf路由表文件。
                                                                                      bird的基础配置文件位于/etc/bird.conf ,使用你喜欢的编辑器进行编辑。其中router id 为旁路由的局域网IP地址,interface 为网络接口名称,例如我的是eth0 ,是与主路由连接的接口的名称。

                                                                                      生成动态路由规则

                                                                                      使用dndx/nchnroutes: !chnroutes - chnroutes negated的框架进行动态路由规则生成,原理是根据获取到的国内IPv4地址范围和APNIC内的国内IPv6地址范围取反。
                                                                                      • 编辑Produc.py
                                                                                      在第10行附近,修改—next后的default参数wg0为自己的旁路由(旁路网关)接口名称, 例如我的是eth0,就改成eth0
                                                                                      替换48IPv4Network('172.16.0.0/12')的保留地址,替换为IPv4Network('172.24.0.0/13'),避免影响Cloudflare访问。
                                                                                      原因在于Cloudflare IP Range中包括:172.64.0.0/13 这个地址范围,如果将IPv4Network('172.16.0.0/12') 配置为保留地址,那么Cloudflare所使用的172.64.0.0/13 也会被标记为直接从主网关出去,不需要经过旁路网关,所以会出现部分使用Cloudlfare CDN的网站无法访问的情况,例如Linux.do
                                                                                      • 编辑Makefile
                                                                                      取消567行的注释。并修改china_ip_list上游地址为mayaxcn 提供的china-ip-list
                                                                                      • 生成路由表
                                                                                      需要确保你已经安装make,如果没有安装可以通过opkg install make 进行安装。执行:
                                                                                      返回结果:
                                                                                      • 确认Bird2路由表状态
                                                                                      执行命令birdc show route protocol static1查看IPv4路由表
                                                                                      notion image
                                                                                      执行命令birdc show route protocol static2查看IPv6路由表:
                                                                                      notion image
                                                                                      • 添加定时任务

                                                                                      OpenWRT主路由配置

                                                                                      安装Bird2

                                                                                      配置Bird2

                                                                                      配置文件同样位于/etc/bird.conf ,文件内容如下,包括IPv4地址的路由表以及IPv6地址的路由表。
                                                                                      其中router id为主路由的局域网IP地址,interface为网桥名称,例如br-lan ,是提供DHCP服务的接口名称。
                                                                                      保存后执行以下命令重启bird并配置bird为开启自动启动:

                                                                                      查看bird获取OSPF邻居信息

                                                                                      返回结果:
                                                                                      其中10.0.0.10 为我的旁路网关地址,State显示为Full即表示已经完成与OSFP邻居的连接建立完成。

                                                                                      查看bird获取OSPF动态路由信息

                                                                                      返回结果大概类似于以下这种,数量太多就截取一部分:

                                                                                      主路由OpenWRT防环回处理

                                                                                      处理OpenWRT的环回思路也是通过新建一个路由表bypass,将从旁路由来的流量,通过防火墙打标记的方式,使用这个新建的路由表bypass,从而避免产生环路。
                                                                                      • 为旁路由添加默认路由规则
                                                                                      添加路由表:
                                                                                      假设旁路由的ip地址为10.0.0.2
                                                                                      • 新建IPv4局域网路由规则
                                                                                      通过luci管理界面,进入网络路由IPv4规则 ,添加一条IPv4路由规则:
                                                                                      notion image
                                                                                      优先级: 默认30000
                                                                                      规则类型: unicast
                                                                                      传入接口: lan
                                                                                      源地址: 局域网IP地址范围,如果你是主路由是192.168.1.1 ,那么这里写192.168.1.0/24
                                                                                      传出接口:不填写
                                                                                      目标地址:不填写
                                                                                      :添加一个bypass
                                                                                      高级设置-防火墙标志0x1
                                                                                      • 新建IPv4广域网路由规则
                                                                                      notion image
                                                                                      优先级: 默认30000
                                                                                      规则类型: unicast
                                                                                      传入接口: 不填写
                                                                                      源地址: 不填写
                                                                                      传出接口wan
                                                                                      目标地址0.0.0.0/0
                                                                                      bypass
                                                                                      高级设置-防火墙标志0x1
                                                                                       
                                                                                      • 配置防火墙规则
                                                                                      OpenWRT的根据所使用的不同OpenWRT版本,防火墙程序也不同:iptablesnftables。但是我们可以通过luci的网页管理进行操作。
                                                                                      网络防火墙通信规则 ,新建一条通信规则:
                                                                                      notion image
                                                                                      名称: bypass
                                                                                      协议: TCP + UDP,或者全选
                                                                                      源区域: Lan
                                                                                      源地址: 旁路由IP地址
                                                                                      源端口
                                                                                      目标区域任意区域
                                                                                      目标地址
                                                                                      目标端口任意
                                                                                      操作应用防火墙标记
                                                                                      设置标记 :0x1

                                                                                      🤗 总结归纳

                                                                                      需要注意的是,通过OSPF输出到OpenWRT内核的路由表并不会在Luci界面的的路由信息中进行展示。如果需要查看,可以通过ip route show命令。
                                                                                      本篇文章基本是在之前文章的基础上,完善了一下OpenWRT路由系统下使用Bird建立OSPF动态路由分流的操作指南,大部分内容都是以前已经写过的。
                                                                                      今天在进行环境测试的时候,也发现了一些有趣的问题,例如:
                                                                                      Bird中的type pointopoint 其实只允许两台主机建立动态路由的邻居关系,当第三台机器想要加入的时候,通过syslog会发现提示:
                                                                                      同时neighbor state会显示ExStart
                                                                                      这时候需要修改typebroadcast才可以。

                                                                                      📎 参考文章

                                                                                       
                                                                                      💡
                                                                                      有关OpenWRT安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                                      卸载Xbox Game Bar

                                                                                      2024年12月27日 08:00
                                                                                      😀
                                                                                      这个月的NextDNS免费额度居然用超了,在有AdGuard Home做过滤,并且已经做DNS分流的情况下,30万次请求25天被用完,这确实有点超过我的意料。查看NextDNS的数据统计,发现请求最多的是catalog.gamepass.com 。查询之后发现这个是一部分是Windows里Xbox Game Bar发出的请求,我又不玩Xbox,而且每次串流时候,按到手柄Xbox键都会呼出Xbox Game Bar,真的好烦。行,今天就卸载了你Xbox Game Bar。
                                                                                      notion image

                                                                                      📝 Xbox Game Bar卸载教程

                                                                                      关闭Xbox Game Bar游戏栏选项

                                                                                      打开Windows设置 - Gaming - Game Bar,关闭使用此按钮切换按钮单击打开 Xbox 游戏栏
                                                                                      notion image

                                                                                      禁止Xbox Game Bar后台运行

                                                                                      通过Windows设置,打开已安装的应用程序页面:
                                                                                      notion image
                                                                                      搜索Xbox Game Bar,然后点击高级设置(Advanced Options),将后台运行许可部分设置为永不(Never)。然后在点击下面终止 按钮,关闭Xbox Game Bar的进程。这样确保Xbox Game Bar不会继续在Windows系统后台继续运行。

                                                                                      使用PowerShell彻底删除XboxGamingOverlay

                                                                                      使用管理员模式打开PowerShell,不要使用CMD。输入以下代码:
                                                                                      代码的意思是找到Microsoft.XboxGamingOverlay 这个程序,并进行移除。
                                                                                      至此,Xbox Game Bar就完全删除了。Xbox Game Bar的删除不会影响到Windows游戏模式(Game Mode)的使用,所以无需担心。

                                                                                      修改注册表解决ms-gamingoverlay-link报错

                                                                                      在使用PowerShell卸载XboxGaminOverlay后,打开Xbox手柄时会提示you'll need a new app to open this ms-gamingoverlay-link ,我们可以通过修改注册表解决。复制下面的代码,并保存在一个*.bat文件中,双击执行,并选择No

                                                                                      📎 参考文章

                                                                                       
                                                                                      💡
                                                                                      有关DNS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                                      流放之路2读图卡死解决方案

                                                                                      2024年12月18日 08:00
                                                                                      😀
                                                                                      流放之路2的Early Access发售已经一周的时间。游戏很好,Bug也不少。其中最为让人头疼的就是Windows 11 24H2版本下,在读图时游戏CPU占用100%造成的系统假死(或者说是读图卡死问题),无法中止进程,只能手动重启电脑的问题。目前也有解决方案,比如用BES限制流流放之路2(POE2)的游戏进程CPU占用率,或者通过Windows任务管理器减少流放之路2(POE2)进程所使用的CPU核心数量。这些方法目前均不完美,一方面降低了游戏的表现,无法使电脑硬件效能最大化,尤其是在后期进入异界之后,同屏怪物数量多的情况下,会造成卡顿;另外一方面,每次打开游戏均需要手动进行设置,很麻烦。目前我在Github上找到了一个开源软件PoEUncrasher,在Grinding Gear Games进行修复之前,暂时可以完美的解决这个问题,一边刷异界一边直播的时候,也不用担心需要死机重启这些问题了。
                                                                                      notion image

                                                                                      📝 PoEUncrasher

                                                                                      软件介绍

                                                                                      This is a simple, light-weight, tool to fix PoE 2 causing Windows to freeze completely (or only be able to move your mouse) during a loading screen. This seems to only affect AMD X3D CPUs from what I can tell.
                                                                                      这是一个很简单,也很轻量的开源软件(大小只有3.6M,开启时内存占用26M),专门为修复流放之路2(POE2)在加载时造成Windows完全冻结(卡死),最终不得不重启Windows系统的问题而编写。程序本体使用C#语言编写,并打包为.exe可执行程序。
                                                                                      作者提到似乎这个Bug只会影响到AMD的X3D类型CPU(例如5700X3D、5800X3D、7800X3D等),但是据我实际测试,非X3D的AMD CPU也会出现这个问题(例如我的Ryzen 5600),原因可能与Windows 11 24H2更新了若干关于AMD CPU的更新有关,所以除非回滚到Windows 23H2版本,否则目前暂时没有很好的解决办法。而回滚系统版本对于我来说工程量实在太大,同时因为距离更新已经过去超过一周的时间,无法直接回滚,而是需要彻底重新安装Windows 11 23H2版本。我也尝试过修改DX12至Vulkan,但是没什么作用。另外我也已经安装了KB5048162的Windows 11 24H2可选更新,也没有效果。

                                                                                      工作原理

                                                                                      这个工具的作用是在自动检测流放之路2(POE2)的进程(PathOfExile.exe),并且通过读取client.txt 进行读图和加载检测。当检测到你正在进入流放之路2(POE2)加载屏幕时,改变进程关联的CPU核心,不使用CPU0/CPU1 ,避免因为使用全部核心造成CPU满载,无法关闭客户端进程造成的Windows系统冻结假死。一旦加载屏幕完成(同样通过读取client.txt来实现检测),它会更新关联并重新允许流放之路2的进程使用全部CPU核心。只在进行地图加载时减少CPU核心的使用,在完成加载之后恢复完整的CPU全核心使用,避免因为减少CPU核心使用数量对游戏性能的影响。

                                                                                      使用方法

                                                                                      https://github.com/Kapps/PoEUncrasher/releases 下载最新版本的PoEUncrasher.-.Non.NET.zip ,目前最新版本为1.4.0,并进行解压。作者提供了两个版本:
                                                                                      • PoE.Uncrasher.zip : 需要提前安装.NET 9依赖,否则无法运行。不会被防火墙提示未知来源。
                                                                                      • PoEUncrasher.-.Non.NET.zip : 不需要安装.NET 9 依赖,但可能会被防火墙提示未知来源软件。
                                                                                      因为作者已经修复了关于Windows Defender的提示问题,所以不再需要.NET 依赖,同时在1.4.0 版本,也不再需要使用管理员启动软件。
                                                                                      如果国内访问Github存在问题,也可以从我分享的夸克网盘下载,分享版本为PoEUncrasher 1.3.0
                                                                                      📌
                                                                                      我用夸克网盘分享了「PoEUncrasher.zip」 链接:https://pan.quark.cn/s/cf9ceb087b99 提取码:G9GA
                                                                                       
                                                                                      右键使用管理员模式运行运行PoEUncrasher.exe ,如果Windows防火墙提示未知来源软件警告,选择仍要运行。这个提示不是因为病毒或者木马,放心使用。如果使用非管理员模式直接运行,可能会提示Detected loading screen, but could not find any process to park.
                                                                                      notion image
                                                                                       
                                                                                      软件运行可以在打开流放之路2游戏之前,或者之后也可以,这个无所谓。首次打开如下图所示:
                                                                                      notion image
                                                                                       
                                                                                      当打开游戏时,会提示找到游戏进程:
                                                                                      notion image
                                                                                       
                                                                                      当进行地图加载时,会提示已经关闭CPU0CPU1的使用(图中的两个00);在地图加载完成之后,会提示已经恢复全部CPU核心的使用,因为我这里是6核心12线程,所以显示1111111111111111
                                                                                      notion image
                                                                                      因为我偶尔会在客厅使用Moonlight串流,所以这个小程序我一直保持常驻开启的状态,通过Moonlight启动游戏之后可以自动识别进程,也不用过多的操作,很方便。
                                                                                      需要注意的是,我在查看软件源代码的时候,发现流放之路2进程的位置似乎是固定写死的默认安装位置,即C:\Program Files (x86)\Grinding Gear Games\Path of Exile 2\PathOfExile.exe ,所以存在如果你的流放之路2游戏安装在别的磁盘位置,无法正常识别进程的问题。

                                                                                      🤗 关于后门

                                                                                      软件的源代码位于:https://github.com/Kapps/PoEUncrasher/blob/master/PoEUncrasher/Program.cs,我丢给Claude分析了以下,没有发现后门。如果不放心已经编译好的版本,也可以自行下载源代码进行编译使用。
                                                                                      目前我使用下来,暂时没有再遇到因为读图或者过图加载而造成的Windows系统冻结假死的问题。马上要圣诞假期了,Grinding Gear Games也发布了假期前最后一个版本0.1.0e,暂时还没有修复现在这个读图加载卡住死机问题。圣诞假期已经开始,后面又是元旦,估计GGG可能要2025年才会改。
                                                                                      最近都在沉迷这个游戏,开荒期魂味十足,BOSS战设计的很好,End Game部分做的也很好,每次刷图都是开奖,整体感觉比暗黑破坏神4香,直接治愈了我的游戏ED。刷刷刷就是不停的刷,博客都不怎么写了,又开始荒废了。
                                                                                      另外就是关于游戏的购买,Steam锁区,港区、国区都不行,需要美区。个人建议在流放之路2官网购买,而且官网支持银联支付,很方便。
                                                                                      截至2025年1月14日,GGG发布流放之路2游戏更新0.1.0f版本,依旧没有修复POE2在读图loading时在Windows 11 24H2上的高CPU占用及负载导致的冻结死机问题。

                                                                                      PoEUncrasher 1.4.0更新内容

                                                                                      • 默认使用暂停4个CPU线程,而不是2个。因为在某些情况下,2个CPU线程有时已经不够用了。
                                                                                      • 更积极地尝试将优先级设置为实时。
                                                                                      • 添加对PoE 1的支持。

                                                                                      📎 参考文章

                                                                                       
                                                                                      💡
                                                                                      有关流放之路2(POE2)安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                                      用Cursor帮我优化博客SEO

                                                                                      2024年9月1日 08:00
                                                                                      😀
                                                                                      之前的博客域名和服务器双双到期,同时自己也不太喜欢继续在WordPress平台上写博客,通过搜索发现了Notion Next这个项目,可以通过NextJS将Notion里的写作内容部署发布到Vercel上,省了一笔服务器的费用,而且还便于管理和编写,就把博客的内容迁移了过来。
                                                                                      notion image
                                                                                      Notion Next是我用过最为惊艳的博客系统,但是依旧有一些不满意的地方,尤其在SEO的方面还存在一些问题。我对NextJS一窍不通,自己直接修改代码更是天方夜谭,正巧在V2EX、LINUXDO上看到最近Cursor火的不行,也就尝试了一下AI编写代码,开始也以为只是Visual Studio Code套壳,但是没想到效果有点出乎预料的好。
                                                                                      Cursor是一款基于人工智能的代码编辑器,它结合了传统代码编辑器的功能和AI辅助编程的能力。支持AI代码补全、自然语言编程、代码解释和重构、错误检测和修复等等。Cursor主要使用了以下几种大型语言模型:GPT-4o、Codex、Claude以及Llama 2等。

                                                                                      📝 付费内容

                                                                                      基础背景:为了减少Vercel的资源配额使用,也因为静态内容更容易做CDN缓存,所以我的Notion Next采用的是yarn export的方式。所以在一些功能的使用上,与正常的build方式有所不同,而cursor成功的帮我解决了这种不同所带来的问题。

                                                                                      去掉不存在内容的翻页

                                                                                      发现这个问题是因为在Search Console和Ahref的抓取时,发现yarn export 会生成页码为0的列表页,同时,即便下一页没有任何内容,也会生成页码。这两种生成的页面点击进去会提示404错误,这肯定是不利于SEO的。

                                                                                      问题定位

                                                                                      通过在Cursor中搜索翻页找到了PaginationSimple.js 这个负责翻页的插件,简单看了一下代码,发现是因为原来的代码中将第0页和没有内容的下一页通过invisable方式进行了隐藏,尽管在页面中展示不出,但爬虫还是会抓取到。
                                                                                      直接询问Cursor“如何去掉序号为0的页面和内容为空的下一页”,Cursor很快就给出了答案,对代码修改进行了标记。
                                                                                      notion image
                                                                                      我自己能看懂一个大概意思,但是具体的修改我又追问Cursor,让它解释一下修改的逻辑,Cursor的回答是:
                                                                                      尝试部署,没有报错,且不再生成page/0 和大于总页数的page/$ ,完美!
                                                                                      这是我第一次尝试通过AI进行代码的编辑,效果有点出乎意料的好,同时也给了我很大的信心。

                                                                                      通过Ahref查找更多的问题

                                                                                      在第一次Curor给了我完善的解决方案之后,我开始对自己动手修改博客这件事有了很大的信心。修改问题的前提是发现问题,表面的问题我们直接可以看到,但是SEO和整体博客结构性的问题我们很难通过浏览看到,所以借助了ahref这个工具进行网站的SEO性能评估。
                                                                                      notion image
                                                                                      这是我第一次运行Crawl之后的结果,健康评分只有40分,分析原因有以下几种:
                                                                                      1. 404和4XX的页面太多:这个大部分都是因为各种列表页都生成的page/0page/$ 造成的,通过刚刚上面的方法已经解决。
                                                                                      1. 找不到Sitemap:没有正常生成sitemap,无法为爬虫提供指引
                                                                                      1. 重复的H1标签:在文章详情页会产生2个H1标签,会对爬虫以及用户产生干扰,无法明确正确内容。
                                                                                      1. 标题太短:归档、分类、标签、关于、链接这几个页面的<title></title>字数太少
                                                                                      实际在解决的过程中,一个问题总是随着另一个问题的解决而出现,下面是一些详细的过程。
                                                                                       

                                                                                      Sitemap问题解决

                                                                                      正常的sitemap输出是通过/pages/sitemap.xml.js进行。但是yarn export这种静态模式会忽略/pages/sitemap.xml.js ,采用next-sitemap 进行输出,也就是/lib/sitemap.xm.js,避免与getServerSideProps这个动态文件冲突。
                                                                                      选中上面这三个文件之后,通过询问Cursor为什么没有如期生成sitemap,Cursor告诉我/lib/sitemap.xml.js并没有被使用,并给出了修改的意见,部署发布成功,生成了Sitemap.xml。之后作者也在Github修复了这个问题。
                                                                                      生成后的Sitemap.xml依旧存在问题,它会将外链也作为站内链接,并通过与域名进行拼凑的方式纳入到Sitemap.xml中,例如https://www.dolingou.com/https://github.com/tangly1024/NotionNext ,点击之后会跳转到404页面。
                                                                                      🚧
                                                                                      询问Cursor:
                                                                                      如何避免sitemap将外链当作本站链接收录进来
                                                                                       
                                                                                      Cursor:
                                                                                      为了避免将外链收录进站点地图,您可以在生成站点地图时对链接进行过滤。以下是修改后的代码建议:
                                                                                      sitemap.xml.js
                                                                                      这里的主要改动是:
                                                                                      添加了一个 isInternalLink 函数来检查链接是否为内部链接。
                                                                                      在添加链接到 urls 数组之前,使用 isInternalLink 函数进行检查。
                                                                                      这个函数的逻辑是:
                                                                                      如果链接以 http:// 或 https:// 开头,则检查它是否包含本站的域名。
                                                                                      如果链接不以 http:// 或 https:// 开头,则认为它是内部链接。
                                                                                      这样可以有效地过滤掉外部链接,只将内部链接添加到站点地图中。
                                                                                      代码示例:
                                                                                      部署、发布、测试,问题解决

                                                                                      重复的H1标签问题解决

                                                                                      通过检查页面,发现Medium主题会在全部页面都对footer.js的博客标题添加<h1></h1> ,我在手动删除掉这个<h1></h1>标签后,问题可以解决,但是又会出现一个新的问题,即除了文章详情页之外的其他页面,都没有<h1></h1>标签。既然如此,那就重新规划一下H1标签的使用。
                                                                                      • 首页及首页文章列表的翻页,使用站点名称作为H1标签
                                                                                      • 文章标签页面使用对应标签的名称作为H1标签
                                                                                      • 文章分类页面使用文章分类的名称作为H1标签
                                                                                      • 归档页面使用“归档Archives”作为H1标签
                                                                                      首页及首页文章列表的翻页
                                                                                      在不影响首页布局的情况下,我想到的方法是直接在导航栏上进行修改,给予判定条件当且仅当位于首页及首页文章列表的翻页时,为博客名称添加H1标签。导航栏的文件位于NotionNext\themes\medium\components\LogoBar.js
                                                                                      🚧
                                                                                      询问Cursor:
                                                                                      我想在首页和首页的翻页为TITLE增加h1标签
                                                                                       
                                                                                      Cursor:
                                                                                      1. 根据您提供的代码,要在首页和首页的翻页中为 TITLE 添加 H1 标签,我们需要修改 LogoBar.js 组件。这个组件似乎是负责显示网站标题的。
                                                                                      1. 这个修改做了以下几点:
                                                                                        1. 导入了 useRouter 钩子,用于获取当前路由信息。
                                                                                        2. 使用 router.pathname 来判断当前是否在首页或首页的翻页。我们假设首页的路径是 '/',翻页的路径以 '/page/' 开头。
                                                                                      3. 根据 isHomePage 的值,决定是否使用 <h1> 标签包裹网站标题。
                                                                                      在首页和翻页时,使用 <h1> 标签;在其他页面,直接显示文本。
                                                                                      5. 为了保持样式一致,我们将原有的类名应用到了 <h1> 标签上。
                                                                                      这样修改后,首页和首页的翻页会使用 <h1> 标签包裹网站标题,而其他页面则不会。这有助于 SEO,同时保持了网站在视觉上的一致性。
                                                                                      请注意,这个修改假设 LogoBar 组件在所有页面中都被使用。如果不是这样,您可能需要在负责渲染首页和翻页的组件中进行类似的修改。
                                                                                      代码示例:
                                                                                      部署、发布、测试,问题解决。
                                                                                      文章标签页面和文章分类页面
                                                                                      文章标签页面和文章分类页面位于NotionNext\themes\medium\components\BlogPostBar.js ,直接对Cursor提问:
                                                                                      🚧
                                                                                      询问Cursor:
                                                                                      我想为Tag和Category标题添加H1标签,我应该怎么修改当前页面的代码
                                                                                       
                                                                                      Cursor:
                                                                                      好的,我理解您想为标签(tag)和分类(category)页面的标题添加H1标签。我们可以修改BlogPostBar.js组件来实现这一点。以下是修改后的代码:
                                                                                      这个修改做了以下几点改变:
                                                                                      1. 将原来的<div>标签改为<h1>标签,这样可以为标签和分类页面的标题添加H1标签。
                                                                                      1. 保留了原有的类名和样式,以确保视觉效果不变。
                                                                                      1. 为了更好的语义化,我在标签和分类名称外面添加了一个<span>标签,并给它添加了一个小的左边距(ml-2)。
                                                                                      1. 这样修改后,标签和分类页面的标题将会被H1标签包裹,有利于SEO优化,同时保持了原有的视觉效果。
                                                                                      请注意,如果在同一个页面上还有其他H1标签(比如在LogoBar组件中),您可能需要考虑调整整体的标题层级结构,以确保每个页面只有一个H1标签。如果需要,您可以考虑将这里的H1改为H2,或者调整LogoBar组件中的标题标签。
                                                                                      代码:
                                                                                      部署、发布、测试,问题解决。
                                                                                      归档页面、分类汇总页面、标签汇总页面
                                                                                      这三个页面均由NotionNext\themes\medium\index.js 控制,直接修改代码即可(我也是可以手搓代码的)

                                                                                      标题太短问题

                                                                                      通过搜索功能检索关键字“标签”、“归档”、“分类”等,最终确定是由NotionNext\lib\lang\zh-CN.js 控制,直接修改里面对应的中文即可。

                                                                                      删除不必要的插件和JS

                                                                                      Notion Next里提供了很多我用不上的JS插件,尽管设置为禁用,但是在渲染时依旧会有漏网之鱼包含至.js 文件中,影响Pagespeed Insights的评分。但这些插件和主题以及Notion Next的主程序之间的各种引用和依赖关系实在很乱,所以这部分我在找到对应的插件.js文件后,直接询问Cursor哪些文件的哪些地方使用了这些插件,然后逐一删除。删除的插件包括:
                                                                                      • Live2D
                                                                                      • MouseFollow
                                                                                      • Ribbon
                                                                                      • Sakura
                                                                                      • StarrySky
                                                                                      • Fireworks
                                                                                      • RevolverMaps(位于主题文件夹内)

                                                                                      翻译代码内容

                                                                                      当我有看不懂的代码时,会直接询问Cursor,让其帮我将代码翻译成文字语言,然后可以了解这是不是我需要修改的功能所在文件。
                                                                                      🚧
                                                                                      询问Curor:
                                                                                      这个文件的代码是什么意思?
                                                                                       
                                                                                      Cursor:
                                                                                      当然,我来为您解释这些文件的代码:
                                                                                      NotionNext/lib/notion/getAllCategories.js:
                                                                                      这个文件定义了一个函数getAllCategories,用于获取所有文章的分类信息。主要功能包括:
                                                                                      过滤出已发布的文章
                                                                                      统计每个分类的文章数量
                                                                                      根据预设的分类选项(categoryOptions)生成分类列表
                                                                                      可以限制返回的分类数量
                                                                                       
                                                                                      NotionNext/lib/sitemap.xml.js:
                                                                                      这个文件负责生成网站的sitemap.xml。主要功能包括:
                                                                                      添加网站的主要页面(首页、归档、分类、标签页)到sitemap
                                                                                      遍历所有文章页面,添加到sitemap
                                                                                      过滤外部链接,只包含内部链接
                                                                                      生成符合标准的XML格式的sitemap
                                                                                       
                                                                                      NotionNext/themes/medium/components/LogoBar.js:
                                                                                      这是网站顶部的Logo栏组件。主要功能:
                                                                                      显示网站标题
                                                                                      在首页和分页页面使用H1标签包裹标题(有利于SEO)
                                                                                      在其他页面正常显示标题文本
                                                                                       
                                                                                      NotionNext/themes/medium/components/BlogPostBar.js:
                                                                                      这是博客文章列表上方的标题栏组件。主要功能:
                                                                                      根据是否有标签或分类来显示相应的标题
                                                                                      使用H1标签包裹标题(有利于SEO)
                                                                                      显示标签或分类的图标和名称

                                                                                      🤗 最终效果

                                                                                      根据昨天晚上ahref的抓取评分结果:
                                                                                      notion image
                                                                                       
                                                                                      PageSpeed Insights结果:
                                                                                      notion image
                                                                                       
                                                                                      目前Cursor还在试用期,收费的话,之后要每个月$20,为什么每个AI产品的定价都是$20?
                                                                                      更新:
                                                                                      目前已经过了试用期,也不想用白嫖大法,所以用VsCode + Cline的组合,也基本可以满足需求。
                                                                                      我又通过使用Cline对博客做了优化,可以参见《✍🏼NotionNext博客精简优化

                                                                                      📎 参考文章

                                                                                       
                                                                                      💡
                                                                                      有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~

                                                                                      借助Cloudflare为网站开启HTTP/3

                                                                                      2024年8月28日 08:00
                                                                                      😀
                                                                                      现在大多数的DNS都已经开始支持HTTP/3了(例如Alibaba、Google、Cloudflare等等),H3在优化网络资源传输,加载多资源场景等等领域的表现也有目共睹,相比HTTP/2,速度是真的确实快了很多。所以趁着博客正好最近刚刚迁移完,也准备给这个博客用上HTTP/3,体验一下新技术带来的快乐。
                                                                                      notion image

                                                                                      📝 付费内容

                                                                                      什么是HTTP/3

                                                                                      HTTP/3是超文本传输协议(HTTP)的第三个主要版本,它是HTTP/2的继任者,旨在提高网络通信的速度和可靠性。与前两个版本相比,HTTP/3最显著的变化在于它基于QUIC协议,而不是TCP。以下是HTTP/3的一些关键特点和相关背景:

                                                                                      1. 基于QUIC协议

                                                                                      • QUIC 协议:HTTP/3构建在QUIC之上,而QUIC是由Google开发的一种新的传输层协议。QUIC结合了TCP、TLS和HTTP/2中的许多功能,提供了类似TCP的可靠传输,但具有更低的延迟和更快的连接建立时间。
                                                                                      • 连接建立:与TCP不同,QUIC采用了 0-RTT(零往返时间)连接建立,这意味着在大多数情况下,客户端和服务器之间的通信可以在第一次数据包传输时开始,不需要像TCP那样经过多次握手过程。

                                                                                      2. 多路复用和无队头阻塞

                                                                                      • 多路复用:类似 HTTP/2,HTTP/3允许多个请求在单一连接中并发进行。这意味着浏览器可以在同一个连接中请求多个资源(如图片、脚本、样式表等),而无需为每个请求建立单独的连接。
                                                                                      • 无队头阻塞:HTTP/3通过QUIC协议解决了HTTP/2中的队头阻塞问题。在HTTP/2中,如果某个数据包丢失,所有后续的数据包都必须等待重新传输。而在HTTP/3中,每个数据流是独立的,即使某个数据包丢失也不会阻塞其他数据的传输。

                                                                                      3. 内置安全性

                                                                                      • 集成加密QUIC协议将TLS集成到传输协议中,这意味着所有HTTP/3的通信都是加密的,从而提高了安全性。此外,QUIC的加密和握手过程比传统的 TLS/SSL更高效。
                                                                                      • 更好的隐私保护:由于QUIC的设计,某些元数据暴露的情况得到了改善,如源IP地址和端口号,这些数据在网络中传输时更加私密。

                                                                                      4. 优化移动网络性能

                                                                                      • 快速恢复连接:QUIC允许设备在网络环境变化时快速恢复连接,这对于移动设备在切换Wi-Fi和蜂窝网络时尤为重要。传统的TCP连接在网络环境改变时往往需要重新建立,而QUIC则可以在无需重新连接的情况下继续传输数据。

                                                                                      5. 更好的拥塞控制

                                                                                      • 改进的拥塞控制算法:QUIC支持多种拥塞控制算法,允许更好地适应不同网络条件,提高数据传输的效率。

                                                                                      HTTP/3对比HTTP/2的优势

                                                                                       
                                                                                      比较项目
                                                                                      HTTP/2
                                                                                      HTTP/3
                                                                                      数据上的提升
                                                                                      基础传输协议
                                                                                      基于TCP(传输控制协议)
                                                                                      基于QUIC(快速 UDP 互联网连接)
                                                                                      在高丢包率条件下,HTTP/3的数据传输速度提升可达 10%-20%
                                                                                      连接建立时间
                                                                                      TCP连接通常需要1-2次握手,TLS加密需要额外的握手
                                                                                      0-RTT(零往返时间)握手,通常在一次往返中即可开始传输数据
                                                                                      初次连接延迟降低30%-50%,可将连接时间缩短100-200毫秒
                                                                                      队头阻塞
                                                                                      存在队头阻塞问题,丢失一个数据包会阻塞整个连接
                                                                                      无队头阻塞问题,每个数据流独立处理,丢包不会影响其他数据流
                                                                                      在丢包率为2%的情况下,HTTP/3 数据传输速度提升约 50%
                                                                                      多路复用
                                                                                      支持多路复用,多个流在同一连接上传输
                                                                                      支持多路复用,但由于无队头阻塞,性能更高
                                                                                      在实际场景中,HTTP/3的网页加载时间可比 HTTP/2快20%-30%
                                                                                      加密方式
                                                                                      通过TLS(通常为TLS 1.2或TLS 1.3)加密
                                                                                      QUIC内置加密,通常使用TLS1.3,提升了安全性和效率
                                                                                      加密握手时间缩短约50-100毫秒,数据传输启动更快
                                                                                      数据包重传
                                                                                      依赖于TCP进行数据包的重传
                                                                                      QUIC提供更灵活的数据包重传机制,只重传丢失的数据包,无需重新排序
                                                                                      在高丢包率(如5%)的网络中,HTTP/3数据传输效率提升约30%-50%
                                                                                      拥塞控制
                                                                                      使用TCP的拥塞控制算法,较为固定
                                                                                      QUIC支持多种拥塞控制算法,适应性更强,且可以优化网络性能
                                                                                      在拥塞网络环境下,HTTP/3的带宽利用率提升可达10%-15%
                                                                                      网络切换恢复
                                                                                      连接在网络切换(如 Wi-Fi 到蜂窝)时容易中断
                                                                                      QUIC支持快速恢复连接,网络切换时连接不中断
                                                                                      网络切换时的连接恢复时间缩短 80%-90%,几乎无数据传输中断
                                                                                      实现复杂性
                                                                                      需要单独处理TCP和TLS协议,复杂度较高
                                                                                      QUIC将传输和加密整合在一起,简化了实现
                                                                                      实现复杂度减少,但具体数值难以量化
                                                                                      延迟
                                                                                      因TCP的握手过程,初次连接延迟较大
                                                                                      因0-RTT握手,初次连接延迟显著降低
                                                                                      在典型网络条件下,HTTP/3的延迟减少约50-100毫秒
                                                                                      数据传输可靠性
                                                                                      高度可靠,但在高丢包率网络下性能不佳
                                                                                      提供类似TCP的可靠性,同时在高丢包网络下性能更好
                                                                                      在丢包率10%的情况下,HTTP/3的数据丢失率降低75%以上
                                                                                      服务器部署成本
                                                                                      通常需要单独的负载均衡器和防火墙配置
                                                                                      因为QUIC基于UDP,需要新的负载均衡器和防火墙配置
                                                                                      长期部署后,服务器端的数据传输效率提升,带宽利用率提高约10%
                                                                                      隐私保护
                                                                                      部分元数据(如IP地址、端口号)可能暴露在网络中
                                                                                      提供更好的隐私保护,减少了元数据暴露
                                                                                      隐私保护的提升难以直接量化,但数据传输中的安全性增强
                                                                                      应用场景
                                                                                      适用于大多数传统应用场景,尤其是稳定网络环境
                                                                                      适用于移动网络和高延迟、高丢包环境,尤其适合现代互联网应用
                                                                                      在不稳定网络环境下,HTTP/3 数据传输效率提升20%-30%
                                                                                       

                                                                                      如何使网站开启HTTP/3(H3)

                                                                                      由于我的博客托管于Vercel,同时域名和CDN均由赛博大善人Cloudflare进行提供,所以并不需要复杂的服务器环境配置等等。只需要在Cloudflare进行对应操作即可使博客支持HTTP/3(H3)
                                                                                      目前Google能够检索到的开启教程大部分都是2021年左右的版本,H3的开启功能还位于Network下,目前已经变动了位置,最新的开启方法可以以本篇为准。
                                                                                      基于赛博大善人Cloudflare的HTTP/3开启方法非常简单,只需要下面三步。

                                                                                      1. 登录Cloudflare

                                                                                      登录后选择左侧Websites,并在中央区域选择需要开启HTTP/3的域名

                                                                                      2. Speed配置

                                                                                      在左侧功能菜单栏找到Speed功能模块,选择Optimization并下拉找到Protocol 栏目,HTTP/3的开关就在这里。
                                                                                      notion image
                                                                                      如果HTTP/3后面的按钮为disabled,需要点击进去HTTP/3旁边的链接符号,进入配置页面,将其中的HTTP/3(With Quic)开启。
                                                                                      notion image

                                                                                      3. 验证结果

                                                                                      打开你的网站或博客,打开开发者模式,选择NetWork,刷新你的网站或者博客,然后找到你域名的那一条,点击查看Header详细信息。如果你和我一样,在Alt-svc后面看到h3=”:443”,即表示开启成功,可以通过HTTP/3提供给访问者更好的速度和效率服务。
                                                                                      notion image

                                                                                      🤗 总结归纳

                                                                                      国内环境下可能开启HTTP/3效果并不会很好,网络运营商大部分会对UDP流量(QUIC基于UDP)进行不同程度的限制或过滤,同时UDP包可能被频繁丢弃或延迟,导致HTTP/3的连接性能下降或者无法稳定工作。而且在国内大部分运营商的策略角度,可能优先处理传统的TCP流量,这可能使得HTTP/3的优势无法充分发挥。
                                                                                      💡
                                                                                      有关博客SEO安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                                                                      ❌
                                                                                      ❌