普通视图

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

优化macOS Dock栏的显示与隐藏

作者 LanYun
2025年7月27日 10:10

前言

我在全新macOS Tahoe 26系统并在外接显示器体验过程中,dock栏(中文名:程序坞,后续不再解释)中的应用保留比较少,同时dock栏大小调整的比较大,虽然看着很舒服了,但是所占的空间可不小,我希望dock栏能智能显示或隐藏,比如在使用非全屏大窗口应用(比如:系统设置,访达等)时(即窗口未与dock栏区域接触{只要窗口底边>=dock栏最上边的纵坐标就算接触})dock栏能自动显示,否则自动隐藏。在互联网中发现有个应用(intellidock)能基本满足我的需求,但它在我这个系统中不能正常工作(能自动隐藏,但不能自动显示),故本人写一个swift二进制程序来实现需求。

已知bug/macOS特性:

  1. (这其实并非我编写程序的bug,而是macOS特性,我有一些方法可以解决/完善,但都不够优雅(主要是有点复杂+懒),没想好怎么修算比较好)
    在 Dock 显示状态下,当点击一个最小化的全覆盖屏幕窗口(minimized to Dock),macOS 会尝试让窗口不遮挡 Dock,所以系统会自动调整窗口位置,把它“挤”在 Dock 上方,下边界会被强制上移。

目前不足:

  1. (✅已优化,采用池管理)当前程序性能开销总体来说非常低了,但依然还有改进的空间,比如:避免频繁注册/卸载事件。
  2. (✅已优化,采用私有API)采用AppleScript来控制 Dock 自动隐藏控制开销还是有点高
  3. (目前没能力做.)无GUI可视化
  4. (懒的搞.)目前只对单屏幕有优化模式
  5. 单屏幕时,程序会缓存dock栏高度,这会导致当dock栏高度变化时不能及时处理
  6. 程序被kill时应该发出通知并启动一个新进程fork

本程序优点:

  1. 速度非常快,性能开销非常低
  2. 命令行运行,支持不同的参数
  3. 兼容性极好,支持不同macOS

部署

建议懒人(比如我😂)使用此方式(自定义用户可作为参考).

将下面命令在 终端 中运行.

1
2
3
4
5
6
7
8
9
user=$(whoami);
eval savepath="/Users/${user}/Documents/SmartDock";mkdir -p $savepath;
download_path='https://lanyun.pages.dev/download_file/SmartDock';
urls=("${download_path}/SmartDock" "${download_path}/SmartDock运行状态切换.command");
for url in "${urls[@]}"; do
wget -P "${savepath}" "${url}" || curl -L -o "${savepath}/$(basename "${url}")" "${url}"
done
sed -i '' "s/user=\$(whoami)/user='${user}'/g" "${savepath}/SmartDock运行状态切换.command";chmod -R 777 "${savepath}";
open "${savepath}"

启动或停止双击 SmartDock运行状态切换.command 文件即可.

备注:

你需要在 系统设置 中 隐私与安全性 中 辅助功能 中添加 终端 应用(需要给权限)

默认使用参数 --fast-pid :同一进程的不同窗口跳过聚焦切换处理,如果不需要请自行修改 SmartDock运行状态切换.command 脚本

如果下载失败,你可以选择通过代理下载或者将 lanyun.pages.dev 替换为 lanyundev.com 并在浏览器的无痕模式中进行下载。

手动在无痕模式文件下载链接:SmartDock SmartDock运行状态切换.command

可以手动验证一下一些文件的完整性,避免因网络缓存等原因导致与预期不符。

1
2
3
sha512sum *
32b444b5e8c055c7904961cc04a84e4858bf11b3b0be78f61a51cb82372b0a751fbe79fe7658ecf86cd0980f2258fef2bd47babb1c57460128f64a15cac75548 SmartDock
cb79465313d4bfd41e28c8515d8368360caa8621f0b5b2e102f6fa81fb7ae6779fb6b6b1403dadb199d781f73ed76c497220989bafdc60b8410f962de49dea3c SmartDock运行状态切换.command

更新说明

优化不足1和2.

解决macOS全屏模式下某些情况显示原始鼠标指针的问题

作者 LanYun
2025年6月12日 17:57

前前言

本人技术又提高了一丢丢,已经会用更优雅更好地方式(通过 System Events 接口)来控制dock栏状态(而不是用defaults这种方式),可惜的是菜单栏依然不支持通过 System Events 接口来控制.目前代码有优化的空间(操作也能更优雅一些,还可以考虑写个GUI),但我懒+没空(先搁置),以后再优化.

前言

在macOS玩全屏(16:10比例,不是无边框)非纯原生游戏过程中遇到一个(其实后面更新说明还遇到一个)很难受的问题,在游戏将鼠标指针移动到屏幕上方菜单栏区域并点击后,鼠标指针会立刻出现并显示为macOS系统的鼠标指针,严重影响游戏体验。例如在通过CrossOver运行的Palworld(幻兽帕鲁),部分原生的League of Legends(英雄联盟)等游戏。本文主要通过一些曲线办法来解决。

曲线办法解释:通过脚本将 自动隐藏和显示菜单栏 状态设置为始终,由于macOS在这种状态下,你向上移动鼠标指针并停留依然会显示菜单栏并影响游戏,故我通过编写程序来阻止鼠标指针移动到屏幕顶端/处理鼠标指针触顶后的一些操作。

本人环境: macOS 15.5(文章发布时的macOS最新正式版,请看更新说明来支持macOS 26),M1 MAX(arm架构)

注:由于技术力有限(源代码写的过于丑陋),就不贴源代码了,仅提供可在Apple silicon(ARM架构)下运行的二进制文件(技术力提高,提高二进制兼容性,适配不同的macOS)。

关于程序实现方式,我是通过CGEventTap来处理鼠标的移动事件,这种实现方式在用户态实现且过程中开销有点大,我无力解决(IOHIDManager等更底层的实现的方式我不会),但要比我最开始用Hammerspoon写的lua脚本性能高多了(后面可以贴贴我这个lua脚本,写的很简洁)

关于菜单栏状态切换.scpt脚本,如果 自动隐藏和显示菜单栏 状态如果不为 永不,那么切换为 永不,否则切换为 始终(这是符合我的使用习惯的,如果需要请自行修改)。

另外,这个脚本和macOS其他版本大概率不兼容,我只在我当前版本测试通过,其他版本请自行修改代码。

注:非中文用户如果需要使用 简易版,则需要修改菜单栏状态切换.scpt文件(修改起来很简单,你只需要将文件中第23到26行中的中文替换为你本机上对应按钮的语言即可),因为我这个脚本是以我中文界面编写的。

为了方便想要自定义某些操作的用户,下面我将提供2种方式来介绍。

简易版

建议懒人(比如我😂)使用此方式(自定义用户也可作为参考).

将下面命令在终端中运行.

1
2
3
4
5
6
7
8
9
user=$(whoami);echo -n "${user}" | pbcopy
eval savepath="/Users/${user}/Documents/MouseWall";mkdir -p $savepath;
download_path='https://lanyun.pages.dev/download_file/MouseWall';
urls=("${download_path}/MouseWall" "${download_path}/MouseClick" "${download_path}/菜单栏状态切换.scpt" "${download_path}/游戏模式切换.sh" "${download_path}/游戏模式切换.shortcut");
for url in "${urls[@]}"; do
wget -P "${savepath}" "${url}" || curl -L -o "${savepath}/$(basename "${url}")" "${url}"
done
sed -i '' "s/user=\$(whoami)/user='${user}'/g" "${savepath}/游戏模式切换.sh";chmod -R 777 "${savepath}";
open "${savepath}/游戏模式切换.shortcut"

点击 添加快捷指令 ,然后选中 游戏模式切换 右键选择编辑,然后选中这段文字 这里填你的用户名 ,然后右键点击粘贴,然后关闭窗口。

你需要在 系统设置 中 隐私与安全性 中 辅助功能 中添加 快捷指令 应用(需要给权限)

之后要运行,点击对应快捷指令右上角的运行即可。

注:如果你需要程序有高优先级(保证程序在游戏过程中能优先处理鼠标指针位置,我是建议这样做的),则需要在 快捷指令 中勾选 以管理员身份运行 ,同时还需要在 辅助功能 中添加 XPCServices/ShortcutsMacHelper.xpc ,如何添加?通过终端运行这个命令 open /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices 打开文件夹并选中 XPCServices/ShortcutsMacHelper.xpc 然后拖入 辅助功能 列表中,授权即可(macOS有bug,授权成功后在列表里面看不到),你还要将 MouseWall_Refactored 文件也拖入辅助功能 列表中。

如果下载失败,你可以选择通过代理下载或者将 lanyun.pages.dev 替换为 lanyundev.com 并在浏览器的无痕模式中进行下载。

自定义

懒得写了,简易版讲的很清楚了,会改的人我也不用多说,直接贴可能需要的文件下载链接

菜单栏状态切换.scpt 游戏模式切换.sh 游戏模式切换.shortcut MouseWall MouseClick MouseWall_Refactored MouseWall_Refactored_NoLimit

关于Hammerspoon写的lua文件(init.lua)如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
th = 5

evt = hs.eventtap.event
types = hs.eventtap.event.types
mouse = hs.mouse

blockTap = hs.eventtap.new({ types.mouseMoved }, function(e)
local loc = e:location()
if e:location().y < th then
e:setProperty(evt.properties.kCGMouseEventLocationY, th)
return e
end
return false
end)

blockTap:start()

可以手动验证一下一些文件的完整性,避免因网络缓存等原因导致与预期不符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sha512sum MouseWall
e1261c8f2e5fe2f728cb9886ebb377475ed5e0f5ac2c82bf19a841bc7df864bc714d871322ac9bb808bc8b016138ab6dbbdc2700e3d2887df61a15841f54f097 MouseWall

sha512sum MouseWall_Refactored
# 2538103b01a722094e9ceca101a66faffc3db0eb3fb3b12994203e1ef57e84949ab41347b032dae55ef6de9c6d9702ced9801352855f8c1ae3ab956bf5599424 MouseWall_Refactored
sha512sum 菜单栏状态切换.scpt
# e60d41dbda343cbd70428a9171934d42c0a524dca08aaced9e5693ac06c30f0df0795683037362d8d22b61032a0d037eae07db3d7a2933e3be03fa9925e511be 菜单栏状态切换.scpt
sha512sum 游戏模式切换.sh
# d7a1fd6d1e590bdca792371c4e3d688fdc1042680f49b1a1122f22bd439b8dffd7ab3057cb49502202f772f1326d2dc5563c42a6335936587561f4f2b675f484 游戏模式切换.sh
sha512sum 游戏模式切换.shortcut
# d985644f36f6abb31aaf804c853835444849167f609bda6cd8bd67ec5ea14a5356406a1a8d3dad0e443b6941cdadd6087ba024ded42d8546b7ce17828204a688 游戏模式切换.shortcut
sha512sum MouseWall_Refactored_NoLimit
# c4edec556edaca1656ee6f678cc50ba8245ef3626d2dea2460655982a7078e517aa6ee03cd839b10043235c846a61f7ba6975cd741efdb80be4e07244066f093
sha512sum MouseWall_Refactored_Debug
# ac6e50c606dddd537d77cf9cd82ab56e34ea2d028f2d21ca04463605d0a49817f29afda55646052281691c7410d35e8138d166306176c8974edc42ed6b31e38d MouseWall_Refactored_Debug
sha512sum MouseWall_Refactored.old
# d7ac2e79a0aef99b1b59222bb99b8dc4ddc231ee9f8f5546e3a16d369a588f970a0241eb30c52ab041329b0c54d48017832a9fb86b94847e88498ea63c2fcae9 MouseWall_Refactored.old
sha512sum MouseClick
# 0881853152fcb834de57b9655c1848ec266039b83a7058d530cae3dec23a531fee88524f878c21010daf347aaf75b47162d6be1f71c6d06c9964acbfb8c1e8c4 MouseClick
sha512sum old_MouseWall
# af07bafa639a02ad391b7eb654059890c117f340f6772bff1713a3178789adc8faaecda84efaa1d225bde39d66f026ca47d1e2947ba5b4cf878a5b9aa89004b3 MouseWall

更新说明

目前顺序是由旧->新,如果你想看最新说明请从最后开始看

MouseWall 二进制文件已被弃用,因为存在一个严重问题,即在开放世界中无法将鼠标持续向上移动,因为这个程序会阻止鼠标指针触顶。

我重新编写一套处理方式,MouseClick 程序性能比较优秀,因为只处理鼠标指针点击事件,所以开销很小,逻辑:当发生鼠标指针点击事件时,判断纵坐标是否<=48px,如果是,则鼠标指针位置纵坐标+48px并在新位置发送点击事件,这样可以避免点击菜单栏,否则按照正常流程处理,这样实现也存在一个小问题,当鼠标指针点击位置在<=48px时,画面会立刻下移改变(我尝试过不移动鼠标指针位置,而只在新位置发送鼠标指针点击事件,但macOS系统不认定这种方式,会导致原生鼠标指针显示)。

我原本还有个折中的想法,即在没有触顶时,鼠标指针纵坐标即使<=48px也不进行移动,在触顶后,如果鼠标指针离开了菜单栏区域又重新回到菜单栏区域且鼠标指针没有触顶则不进行移动,但这样需要同时处理点击和移动事件,开销会多一点,而且我不想这样做,因为处理鼠标指针移动事件开销始终会多一些(然后不想去思考逻辑了,懒..)。好吧,我还是去做了,二进制文件名为MouseWall_Refactored,但CPU开销会比MouseClick多一些,建议低性能设备使用MouseClick,并修改游戏模式切换.sh脚本中对应的BINARY_PATHPID_FILE变量值即可。

注:本程序只能缓解问题,并不能真正解决问题,问题是有可能在某些情况复现的,本人水平有限就先这样了吧。睡觉觉去咯~

我注意到当鼠标指针按下后向底部移动再移出也会导致鼠标指针变原始的,故我更新了 游戏模式切换.sh 脚本文件(如果不需要请自行删除相关代码,我发现并不是在未隐藏dock栏的所有情况下都会出现此问题,故我注释掉了相关代码,不再作为默认处理,有需要则自行取消注释相关代码),能实现伪长久隐藏dock栏,通过defaults write com.apple.dock autohide-delay实现,但缺点是需要重启Dock进程,这会导致你最小化的窗口都会在前台显示,需要重新手动最小化(我觉得这是小事,小问题,也没想出好的自动化来处理这个),如果你想要点击Dock栏中某个项,但又不想关闭 游戏模式,那么你可以 control + 上箭头 来调出 调度中心(这个时候就会显示dock栏了)。注:需要在隐藏dock栏之后启动游戏(即需先切换为 游戏模式)

发现一个特性,在离开菜单栏区域后在菜单栏未消失前又再次进去且未触顶,然后鼠标指针的点击事件导致的原始鼠标指针显示。为什么会这样,我发现在 自动隐藏和显示菜单栏 为 始终 下,当前应用未全屏状态下,鼠标指针触顶显示菜单栏后,鼠标指针纵坐标y到达大约48px即可隐藏,但到了全屏应用中发现需要到达大约189px才会隐藏,故需要修改代码逻辑。但似乎并没有影响全屏游戏,故没有修改这方面代码。不过我又优化了一下代码逻辑,在鼠标指针触顶且未离开菜单栏区域中发生点击事件后会移动鼠标指针纵坐标y=49px,并在原位置发送点击事件,在下次手动移动鼠标指针时恢复为原位置移动。

目前程序已知缺陷(/特性): 在往上移动鼠标指针触顶且未离开菜单栏范围进行点击的话,虽然点击位置依然是原位置,但是画面会因为鼠标指针的移动而发生移动,再次移动鼠标指针,画面也会移动。目前只基于原生16英寸主显示器默认分辨率(1728x1117)做适配,未对外接显示器做适配,为避免对x<0或x>1728的外接显示器操作造成影响,已跳过处理。

在macOS 26 beta 2上,我重新分析了布局信息,你只需要将 菜单栏状态切换.scpt 文件中的 group 9 of scroll area 1 of group 1 of group 2 改为 group 1 of scroll area 1 of group 1 of group 3 即可在macOS 26上继续运行.

为满足对外接显示器用户的需求(其实是我😂),现增加二进制文件MouseWall_Refactored_NoLimit,不再对x轴做限制,如果要用管理员权限运行的话,别忘了给这个二进制添加辅助功能权限哦~

提高二进制文件兼容性,性能优化和多显示器处理之后有空再搞,原始 MouseWall 二进制文件重命名为 old_MouseWall ,新版 MouseWall_Refactored_NoLimit 二进制名改为 MouseWall 并作为默认二进制使用.

备注: League of Legends(英雄联盟) 实际上点击不到菜单栏区域(因为游戏分辨率不支持macOS真全屏16:10),但是这游戏bug多的批爆,你需要先切换到无边框模式再切换回全屏才能不会显示原始鼠标指针。

nginx自编译

作者 LanYun
2024年4月19日 01:24

前言

简单记录下,编译用到的一部分代码.

以下代码运行环境: ubuntu x86_64

依赖

1
2
sudo apt update && sudo apt upgrade && sudo apt autoremove
sudo apt install -y build-essential ca-certificates zlib1g-dev libpcre3 libpcre3-dev tar unzip libssl-dev wget curl libtool git cmake ninja-build mercurial libunwind-dev pkg-config golang # 编译工具&依赖库

编译

brotli 压缩

1
2
3
4
5
6
git clone --depth=1 --recurse-submodules -j8 https://github.com/google/ngx_brotli
cd ngx_brotli/deps/brotli
mkdir out && cd out
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS="-Ofast -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_CXX_FLAGS="-Ofast -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_INSTALL_PREFIX=./installed ..
cmake --build . --config Release --target brotlienc
cd ../../../..

openssl

1
2
3
4
5
6
7
git clone -b master --depth=1 https://github.com/openssl/openssl.git
cd openssl
./Configure --prefix=/usr/src/openssl --openssldir=/usr/src/openssl
make install
ldconfig
openssl version -a
cd ../

ngx_security_headers

1
git clone --depth=1 --recurse-submodules https://github.com/GetPageSpeed/ngx_security_headers

nginx

1
2
3
4
5
6
7
8
9
hg clone https://hg.nginx.org/nginx
cd nginx
make clean
./auto/configure --prefix=/etc/nginx --user=www-data --group=www-data --with-pcre --add-module=../ngx_brotli --add-module=../ngx_security_headers --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-compat --with-threads --with-file-aio --with-http_ssl_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_slice_module --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-http_dav_module --with-http_v3_module \
--with-cc-opt="-I /usr/src/openssl/include" \
--with-ld-opt="-L /usr/src/openssl/lib64"
make
make install
cd ../

完成,可以删除这些文件夹,也可以不用删除,方便下次编译(记得git pull)

tips: 如果在make install安装后想要卸载,命令:make uninstall

用santa对二进制进行监控和授权

作者 LanYun
2023年11月8日 03:15

前言

仅限macOS.

本文用到的项目: Santa

介绍:

Santa是macOS的二进制和文件访问授权系统。它由一个系统扩展组成,用于监视执行情况,一个守护程序根据本地数据库的内容做出执行决策,一个图形用户界面代理用于在决策被阻止时通知用户,以及一个用于管理系统和将数据库与服务器同步的命令行实用程序。

它之所以被称为Santa,是因为它跟踪二进制文件的行为,判断它们是好还是坏。

本文会快速部署并演示阻止QQ的ScreenCaptureAgent二进制程序.

如果要了解更多或者看不懂本文,请移步 官方文档

部署

起手先前往 Releases 下载最新版,然后安装,然后打开然后点Dismiss.

然后下载这个 Santa.7z 压缩包再解压出来.

如果要方便控制规则,请排除中央管理配置文件.

已使用 MDM 解决方案

排除中央管理配置文件,一共有4个文件,然后安装4次就行了.

安装方法: 双击mobileconfig文件来安装描述文件.

然后前往 设置 -> 隐私与安全性 -> 描述文件 中,看着操作把它安装了.

未使用/看不懂

安装配置文件和通知设置文件夹中的配置文件,一共2个文件.

然后前往 设置 -> 隐私与安全性 -> 完全磁盘访问权限

勾选 com.google.santa.daemon.然后再打开Santa可看到如图所示

image-20231108034238101

mobileconfig配置文件更多配置项可参考文档

检查状态

终端命令行运行

1
santactl status

输出了 Daemon Info 就没问题.

阻止

1
sudo santactl rule --block --path /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/ScreenCaptureAgent

Tips: 这里演示的是路径阻止,实际还有阻止方式,此处懒的写了.

检验

1
santactl fileinfo /Applications/QQ.app/Contents/Resources/app/ScreenCaptureAgent.framework/Versions/A/ScreenCaptureAgent --key Rule

Tips: fileinfo 参数非常强大,远不止此功能,此处也懒的写了.

杂项

1
2
3
4
5
6
7
8
9
10
11
12
13
ls /var/db/santa # 可以看到规则,日志等文件,建议定时清理🧹避免占用过多磁盘空间
santactl help
Usage: santactl:
fileinfo - Prints information about a file.
metrics - Show Santa metric information.
printlog - Prints the contents of Santa protobuf log files as JSON.
rule - Manually add/remove/check rules.
status - Show Santa status information.
sync - Synchronizes Santa with a configured server.
version - Show Santa component versions.

See 'santactl help <command>' to read about a specific subcommand.
santactl help rule # 查看rule规则用法

命令运行结果示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
santactl help rule
Help for 'rule':
Usage: santactl rule [options]
One of:
--allow: add to allow
--block: add to block
--silent-block: add to silent block
--compiler: allow and mark as a compiler
--remove: remove existing rule
--check: check for an existing rule
--import: import rules from a JSON file
--export: export rules to a JSON file

One of:
--path {path}: path of binary/bundle to add/remove.
Will add the hash of the file currently at that path.
Does not work with --check. Use the fileinfo verb to check.
the rule state of a file.
--identifier {sha256|teamID|signingID}: identifier to add/remove/check
--sha256 {sha256}: hash to add/remove/check [deprecated]
--json {path}: path to a JSON file containing a list of rules to add/remove

Optionally:
--teamid: add or check a team ID rule instead of binary
--signingid: add or check a signing ID rule instead of binary (see notes)
--certificate: add or check a certificate sha256 rule instead of binary
--message {message}: custom message

Notes:
The format of `identifier` when adding/checking a `signingid` rule is:

`TeamID:SigningID`

Because signing IDs are controlled by the binary author, this ensures
that the signing ID is properly scoped to a developer. For the special
case of platform binaries, `TeamID` should be replaced with the string
"platform" (e.g. `platform:SigningID`). This allows for rules
targeting Apple-signed binaries that do not have a team ID.

Importing / Exporting Rules:
If santa is not configured to use a sync server one can export
& import its non-static rules to and from JSON files using the
--export/--import flags. These files have the following form:

{"rules": [{rule-dictionaries}]}
e.g. {"rules": [
{"policy": "BLOCKLIST",
"identifier": "84de9c61777ca36b13228e2446d53e966096e78db7a72c632b5c185b2ffe68a6"
"custom_url" : "",
"custom_msg": "/bin/ls block for demo"}
]}

对于设备网络安全:

我目前是: 系统防火墙,阻止主动探测,Little Snitch 防火墙,阻止未手动添加的规则的流量,Proxifier 做前置代理,进行网络分流,adguard 做内容过滤,surge等工具做代理转发

openwrt编译过程记录

作者 LanYun
2023年10月28日 15:20

前言

本文编译的为openwrt分支lede,本文主要以记录为主,因为中间有时候报错没弄,断断续续1个月左右搞好.

本文以ubuntu x86作为编译机.

编译成品: https://github.com/LanYunDev/lede_compile

安装依赖

1
2
3
4
5
6
7
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \
libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \
vim wget xmlto xxd zlib1g-dev python3-setuptools zstd ninja-build meson

添加用户

如果你有非root用户,可跳过创建,后续都需要用非root用户进行操作.

1
2
3
4
5
6
7
8
9
10
# 添加用户
adduser openwrt
# 设定密码
passwd openwrt
# 添加 sudo 权限
usermod -a -G sudo openwrt
# 进入用户
su openwrt
# 切换目录
cd ~

编译

1
2
3
4
5
6
7
git clone https://github.com/coolsnowwolf/lede.git
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig # 手动配下
make download -j8 || make download || make download V=s
make -j1 || make -j1 V=s

可选:

添加第三方包来源

1
2
3
4
echo >> feeds.conf.default
echo 'src-git istore https://github.com/linkease/istore;main' >> feeds.conf.default
sed -i '$a src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
sed -i '$a src-git small https://github.com/kenzok8/small' feeds.conf.default

更换golang版本

编译新版Sing-box和hysteria,需golang版本1.20或者以上版本.

若自带的版本过低,可用下面命令换成openwrt官方golang版本

1
2
3
pushd feeds/packages/lang
rm -rf golang && svn co https://github.com/openwrt/packages/branches/openwrt-23.05/lang/golang
popd

删除默认的 argon 主题

记得选.

choose LUCI->Theme->Luci-theme-argon

choose LUCI->Application->Luci-app-argon-config

1
2
3
4
5
6
cd ./package/lean
rm -rf luci-theme-argon
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git luci-theme-argon
rm -rf luci-app-argon-config # if have
git clone -b 18.06 https://github.com/jerrykuku/luci-app-argon-config.git luci-app-argon-config
cd ../../

修改默认主题为argone

1
sed -i 's/luci-theme-bootstrap/luci-theme-argone/g' feeds/luci/collections/luci/Makefile

添加ddns-go

1
git clone https://github.com/sirpdboy/luci-app-ddns-go.git package/ddns-go

修改用户名

站内文章: OpenWrt 修改登陆用户名

二次编译

1
2
3
4
5
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make -j1 || make -j1 V=s
# 不怕失败,可以用: make -j$(nproc) || make -j1 || make -j1 V=s

干净编译

编译出现问题且用make clean依然无法解决的情况.

1
2
3
4
5
6
7
8
# 也可以加上删除dl tmp staging_dir build_dir目录的操作
git pull
./scripts/feeds update -a
./scripts/feeds install -a
make dirclean;make dirclean V=s
make -j1 clean; make -j1 clean V=s
make download || make download V=s
make -j1 || make -j1 V=s

杂项

如果是ext4镜像,修改某些文件,提示:Read-only file system

用这个命令将根目录解锁即可.

1
mount -o remount,rw /

默认没有安装Git,自带的ssh没有ssh-agent功能,可以通过如下命令配置:

1
2
3
4
5
6
7
opkg update
# 安装Git
opkg remove git
opkg install git-http
opkg install ca-bundle
# 安装SSH
opkg install openssh-client openssh-keygen openssh-sftp-server

安装并信任根 CA 证书 参考

  1. 获取根 CA 证书 (若已有,可跳过,这里演示生成)
1
2
3
openssl s_client -connect ca.private-domain.tld:443 < /dev/null > /tmp/temporary.out
openssl x509 -outform PEM < /tmp/temporary.out > /tmp/ca.private-domain.tld.cert
rm /tmp/temporary.out
  1. 安装 CA 根证书

受信任的证书安装在/etc/ssl/certs,但是遵循FHS 3并用于/usr/local/share与体系结构无关的文件是一个很好的做法.

1
2
3
mkdir -p /usr/local/share/ca-certificates
mv /tmp/ca.private-domain.tld.cert /usr/local/share/ca-certificates/
ln -s /usr/local/share/ca-certificates/ca.private-domain.tld.cert /etc/ssl/certs/ca.private-domain.tld.cert
  1. 将根 CA 证书添加到系统的信任存储中

证书已安装,但尚未被信任.您需要提供证书的哈希值.

1
2
3
4
5
6
7
8
# 生成哈希值
HASH="$(openssl x509 -hash -noout -in /etc/ssl/certs/ca.private-domain.tld.cert).0"

# 显示哈希值
echo "$HASH"

# 将哈希值链接到证书
ln -s "/ect/ssl/certs/ca.private-domain.tld.cert" "/etc/ssl/certs/$HASH"

注意: 如果其他证书有相同的哈希值,请使用后缀.1.2,而不是.0.

解决配置文件无法保存问题:

临时:

1
mount -o remount rw /

永久:

1
vim /etc/rc.local

exit 0之前添加命令mount -o remount rw /然后保存,并赋权.

1
chmod +x /etc/rc.local

或者编译解决:

1
2
3
4
make menuconfig 中把 block-mount 去掉
# 按顺序取消选中
Extra packages ---> automount
Base system ---> block-mount

或者在luci中 系统 -> 挂载点 -> 挂载点 取消根目录 / 挂载点.

编译修改ssh端口:

1
2
vim ./package/network/services/dropbear/files/dropbear.config
# 将option Port '22'中22修改为想要的端口

修改内核大版本

1
vim ./target/linux/x86/Makefile # 这里以x86为例,其他平台自行参考

修改KERNEL_TESTING_PATCHVER即可.如果没有则修改KERNEL_PATCHVER

编译monero For macOS ARM

作者 LanYun
2023年8月27日 20:28

前言

水💦篇文章.

monero-gui官方没给ARM版.要下个版本应该会给?急急急,转译的应用很不爽.直接上编译.

这个项目里面整的很清楚了,但我还是要水💦.

前提: 你已安装了brew

如果不是非要ARM版本(注:本文发布时是没有arm版的,以后可能直接就是arm版,不用编译),可以直接用brew安装.CLI版:brew install monero GUI版:brew install monero-wallet 后续更新方便.

安装依赖

1
2
3
brew remove qt # 起手卸载,防止和qt@5冲突
brew install cmake pkg-config openssl boost unbound hidapi zmq libpgm libsodium miniupnpc expat libunwind-headers protobuf libgcrypt qt@5
brew reinstall qt@5 # 可选

编译

找个地方放编译文件夹,建议编译完不用删,方便以后编译,如果硬要删又要编译.我建议看我后面关于签名部分.

1
2
3
git clone --recursive https://github.com/monero-project/monero-gui.git
cd monero-gui
make -j$(nproc) || make -j1

编译没问题往后看,有问题自己解决吧(我不会).

如果编译文件夹不删除.那么请看本部分

1
cp -rf ./build/release/bin/monero-wallet-gui.app /Applications/monero-wallet-gui.app

构建应用程序包

用于要删文件夹情况.

1
2
3
4
5
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default ..
make -j$(nproc) || make -j1
make deploy
cd ./build/bin

新建文件entitlements.plist

1
2
3
4
5
6
7
8
9
10
cat << EOF > entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
</dict>
</plist>
EOF

然后运行下面命令,如果你有苹果开发者证书应该知道XXXXXXXXXX填什么.如果没有,别运行下面命令.看后面.

1
2
sudo codesign --deep --force --verify --verbose --options runtime --timestamp --entitlements entitlements.plist --sign 'XXXXXXXXXX' monero-wallet-gui.app
cp -rf ./monero-wallet-gui.app /Applications/monero-wallet-gui.app

没有苹果开发者证书

将上面<true/>改为<false/>

打开钥匙串访问.app,然后在 登录 我的证书 这个界面下.然后看图

image-20230827225123369image-20230827225144374

名称可以自己改.然后运行下面命令.

1
2
3
sudo codesign --deep --force --verify --verbose --options runtime --timestamp --entitlements entitlements.plist --sign 'lanyun' monero-wallet-gui.app
spctl -a -t exec -vv monero-wallet-gui.app # 看一下,是不是accepted,如果是,则继续
cp -rf ./monero-wallet-gui.app /Applications/monero-wallet-gui.app

如果有问题,请自行参考 https://github.com/monero-project/monero-gui/blob/master/DEPLOY.md

如果你遇到 libboost_atomic-mt.dylib (no such file) 这个错误.

显然,出现了问题.有种错误修复方式,因为会导致显示异常.

cp -rf /opt/homebrew/lib/libboost_atomic-mt.dylib ./monero-wallet-gui.app/Contents/Frameworks

本人不会修,可能是macOS版本太高了吧,无所谓,我不用构建应用程序包.

自建busuanzi不蒜子平台统计平台

作者 LanYun
2023年8月19日 16:12

前言

公益统计服务busuanzi官网: https://busuanzi.ibruce.info/

由于速度很慢,故打算自建. 本文用到的项目地址: https://github.com/soxft/busuanzi

本来不想水一篇的,因为项目中的wiki已很清楚了,而且还支持docker部署.

但我还是想简单记录一下搭建过程(省略了某些简单的步骤),各位可以参考参考.

本文不采用docker方式搭建,因为要和cloudflared搭配,组成隧道.

基本前提: 有域名,有linux服务器

本文linux服务器以arch Linux为例.

编译

在你想要的目录下运行命令.(下面示例为root)

1
2
3
4
5
pacman -S git go redis # 如果已安装可以跳过
git clone https://github.com/soxft/busuanzi.git # 可以拉取我fork的仓库
# https://github.com/LanYunDev/busuanzi.git 我合并了yuantuo666和soxft仓库,代码最新且带有web管理功能.
cd busuanzi
go build -o busuanzi main.go

修改配置

修改busuanzi目录下config.yml配置文件.

首先是Web中的Address,由于我们要做隧道,所以没必要公网访问,所以加上127.0.0.1:xxx ,这里xxx代表端口号,建议填高位.

可以用命令 lsof -i -n -P | grep LISTEN 来检查端口使用情况,

Debug测试的时候可以开一下,后面建议关了.

接下来就是Redis部分

首先Address为你redis的地址.例如本机: 127.0.0.1:6379

AddressPassword,如果你是全新安装的,没动过redis配置,那就不用改.

但如果改了,或者想确认一下.可以这样做.

输入命令

1
2
cat /etc/redis/redis.conf | grep '^port' # 端口
cat /etc/redis/redis.conf | grep '^requirepass' # 密码,如果没有结果代表是被#注释了,即为空密码

关于Expire,自用的话,可以设置为0

关于JwtSecret,我推荐用uuid来做签名密钥. 输入命令uuidgen即可得到uuid

修改 dist/busuanzi.js文件中api的地址.例如我改为https://busuanzi.lanyundev.com/api

如果你用带有web管理功能的busuanzi

Admin中Password记得改密码.

添加隧道

关于cloudflared搭建哪些看官方文档就行了,写的非常清楚.

记录一下,添加DNS记录命令: cloudflared tunnel route dns -f xxx busuanzi.lanyundev.com

主要注意一下,cloudflared进行DNS(dig)查询时,别被劫持了.(如果能用,就不用管这个.)

启动服务

1
systemctl enable --now redis.service # 设置为开机启动并启动redis

vim /etc/systemd/system/busuanzi.service添加下面内容(ExecStart根据个人情况修改.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=busuanzi Service
Documentation=https://github.com/soxft/busuanzi
After=network.target nss-lookup.target

[Service]
Type=simple
#DynamicUser=yes
User=root:
Environment=QUIC_GO_ENABLE_GSO=true
ExecStart=/root/busuanzi/busuanzi
WorkingDirectory=/root/busuanzi/
Restart=on-failure
LimitNPROC=512
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

弄成服务,方便管理.

1
2
systemctl daemon-reload
systemctl enable --now busuanzi.service

Web管理

Address + /admin 进入管理界面.可以修改数据.

在没换之前,可以参考这个域名 busuanzi.ibruce.info 的响应,里面有Site PV Site UV Page PV等原来的信息.

其实,这个可有可无,数据而已,真假都无所谓的.看个人吧,我就直接取整数.

关于隐私

啥都看不到,md5加密,不保存源数据.非常安全,其实如果不是需要做身份区别,我觉得弄个数字就行了.

(机翻)Kubo配置文件

作者 LanYun
2023年8月8日 16:58

下面内容来自机翻,仅供参考.

原文档:链接🔗

Kubo 配置文件

Kubo (go-ipfs) 配置文件是一个 JSON 文档,位于“$IPFS_PATH/config”。它
在节点实例化时读取一次,无论是对于离线命令,还是在
启动守护进程。在正在运行的守护进程上执行的命令不会读取
运行时的配置文件。

目录

个人资料

配置配置文件允许快速调整配置。配置文件可以是
使用“–profile”标志应用于“ipfs init”或“ipfs 配置文件”
应用`命令。应用配置文件时,配置文件的备份
将在“$IPFS_PATH”中创建。

下面列出了可用的配置文件。你也可以找到他们
记录在“ipfs 配置文件 –help”中。

  • 服务器

    禁用本地主机发现,建议在以下情况使用
    在具有公共 IPv4 地址的计算机上运行 IPFS。

  • 随机端口

    对传入的集群连接使用随机端口号。

  • 默认数据存储

    将节点配置为使用默认数据存储 (flatfs)。

    有关此数据存储的更多信息,请阅读“flatfs”配置文件说明。

    该配置文件只能在首次初始化节点时应用。

  • 本地发现

    启用本地发现(默认启用)。对于在发现后重新启用本地发现很有用
    被另一个配置文件(例如服务器配置文件)禁用。

  • 测试

    减少IPFS守护进程的外部干扰,这
    在测试环境中使用守护进程时非常有用。

  • 默认网络

    恢复默认网络设置。
    测试轮廓的反向轮廓。

  • Flatfs

    配置节点以使用 flatfs 数据存储。Flatfs 是默认数据存储。

    这是最久经考验且最可靠的数据存储。
    如果出现以下情况,您应该使用此数据存储:

    • 您需要一个非常简单且非常可靠的数据存储,并且您信任您的
      文件系统。该数据存储将每个块存储为单独的文件
      底层文件系统,因此除非出现问题,否则不太可能丢失数据
      与底层文件系统。
    • 您需要以尽快回收可用空间的方式运行垃圾收集。
    • 您想要最小化内存使用。
    • 您可以接受默认的数据导入速度,或者更喜欢使用“–nocopy”。

    该配置文件只能在首次初始化节点时应用。

-

配置节点以使用实验性 badger 数据存储。请记住,这 使用过时的 badger 1.x

如果性能的某些方面,请使用此数据存储,
尤其是添加许多 GB 文件的速度至关重要。但是,请注意:

  • 当您的数据存储被占用时,该数据存储将无法正确回收空间
    小于几千兆字节。如果您使用“–enable-gc”运行 IPFS,您计划在其中存储很少的数据
    您的 IPFS 节点,并且磁盘使用比性能更重要,请考虑使用
    flatfs
  • 此数据存储最多使用几 GB 内存。
  • 适用于中型数据存储,但如果您的数据集大于 1 TB,则可能会遇到性能问题。
  • 当前的实现基于旧的 badger 1.x,上游团队不再支持该版本。

该配置文件只能在首次初始化节点时应用。

  • 低功耗

    减少系统上的守护进程开销。影响节点
    功能 - 内容发现和数据的性能
    抓取可能会降级。本地数据不会在 DHT 等路由系统上公布。

    • Swarm.ConnMgr 设置为一次维持最小数量的 p2p 连接。
    • 禁用 Reprovider 服务 → DHT 和其他路由系统上不会公布 CID(!)
    • 禁用自动NAT。

    请谨慎使用此配置文件。

类型

本文档引用了标准 JSON 类型(例如,“null”、“string”、
number 等),以及一些自定义类型,如下所述。

标志

标志允许启用和禁用功能。然而,与简单的布尔值不同,
它们也可以是“null”(或省略)以指示默认值应该
被选择。这使得 Kubo 更容易更改默认值
未来,除非用户明确地将标志设置为“true”(启用)或
“假”(禁用)。标志具有三种可能的状态:

  • null 或缺失(应用默认值)。
  • true(启用)
    -“假”(禁用)

优先级

优先级允许指定功能/协议的优先级并禁用
功能/协议。优先级可以采用以下值之一:

  • null/missing(应用默认优先级,与标志相同)
    -“假”(禁用)
  • 1 - 2^63(优先级,越低越好)

字符串

字符串是一种特殊类型,可以方便地指定单个字符串、数组
字符串,或 null:

  • “单个字符串”
  • [“an”、“数组”、“of”、“字符串”]

持续时间

Duration 是一种描述时间长度的类型,使用与 go 相同的格式
是(例如“1d2h4m40.01s”)。

可选整数

可选整数允许指定一些数值
配置文件中缺少时的隐式默认值:

  • null/missing 将应用 Kubo 源中定义的默认值 (.WithDefault(value))
  • -2^632^63-1 之间的整数(即 -92233720368547758089223372036854775807

可选字节

可选字节允许指定一些字节数
配置文件中缺少时的隐式默认值:

  • null/missing(应用 Kubo 源代码中定义的默认值)
  • 指示字节数的字符串值,包括人类可读的表示形式:
    • SI 大小(公制单位,1000 的幂),例如 1B2kB3MB4GB5TB ,……)
    • IEC 大小(二进制单位,1024 的幂),例如 1B2KiB3MiB4GiB5TiB ,……)

可选字符串

可选字符串允许指定一些字符串值
配置文件中缺少时的隐式默认值:

  • null/missing 将应用 Kubo 源中定义的默认值 (.WithDefault("value"))
  • 一个字符串

可选持续时间

可选的持续时间允许指定一些持续时间值
配置文件中缺少时的隐式默认值:

  • null/missing 将应用 Kubo 源中定义的默认值 (.WithDefault("1h2m3s"))
  • 具有有效 go 持续时间 的字符串(例如“1d2h4m40.01s”)。

地址

包含有关此节点要使用的各种侦听器地址的信息。

地址.API

Multiaddr 或多地址数组,描述服务本地 HTTP 的地址
API 开启。

支持的运输:

  • tcp/ip{4,6} - /ipN/.../tcp/...
  • unix - /unix/path/to/socket

默认值:/ip4/127.0.0.1/tcp/5001

类型:“字符串”(多地址)

地址.网关

多地址或多地址数组描述服务于本地的地址
网关打开。

支持的运输:

  • tcp/ip{4,6} - /ipN/.../tcp/...
  • unix - /unix/path/to/socket

默认值:/ip4/127.0.0.1/tcp/8080

类型:“字符串”(多地址)

地址.Swarm

描述要侦听 p2p 群的地址的 multiaddrs 数组
连接。

支持的运输:

  • tcp/ip{4,6} - /ipN/.../tcp/...
  • websocket - /ipN/.../tcp/.../ws
  • quic (Draft-29) - /ipN/.../udp/.../quic - 可以与 /quic-v1/quic-v1/webtransport 共享相同的两个元组
  • quicv1 (RFC9000) - /ipN/.../udp/.../quic-v1 - 可以与 /quic/quic-v1/webtransport 共享相同的两个元组
  • webtransport /ipN/.../udp/.../quic-v1/webtransport - 可以与 /quic/quic-v1 共享相同的两个元组

默认:

1
2
3
4
5
6
7
8
9
10
[
“/ip4/0.0.0.0/tcp/4001”,
“/ip6/::/tcp/4001,
“/ip4/0.0.0.0/udp/4001/quic”,
“/ip4/0.0.0.0/udp/4001/quic-v1”,
“/ip4/0.0.0.0/udp/4001/quic-v1/webtransport”,
“/ip6/::/udp/4001/quic”,
“/ip6/::/udp/4001/quic-v1”,
“/ip6/::/udp/4001/quic-v1/webtransport”
]

类型:数组[字符串](多地址)

地址.公告

如果非空,则此数组指定要向
网络。如果为空,守护进程将宣布推断的群地址。

默认值:[]

类型:数组[字符串](多地址)

地址.AppendAnnounce

Addresses.Announce 类似,只是这不
如果非空,则覆盖推断的群地址。

默认值:[]

类型:数组[字符串](多地址)

地址.NoAnnounce

不向网络公布的群地址数组。
优先于“Addresses.Announce”和“Addresses.AppendAnnounce”。

默认值:[]

类型:数组[字符串](多地址)

API

包含 API 网关使用的信息。

API.HTTPHeaders

要在来自 API HTTP 服务器的响应上设置的 HTTP 标头映射。

例子:

1
2
3
{
“Foo”:[“酒吧”]
}

默认值:null

类型:object[string -> array[string]](标头名称 -> 标头值数组)

自动NAT

包含 AutoNAT 服务的配置选项。自动网络地址转换服务
帮助网络上的其他节点确定它们是否可以公开访问
互联网的其余部分。

AutoNAT.ServiceMode

未设置(默认)时,AutoNAT 服务默认为_启用_。否则,这
字段可以采用两个值之一:

*“启用”-启用服务(除非节点确定它本身,
无法通过公共互联网访问)。
*“已禁用”- 禁用该服务。

将来可能会添加其他模式。

类型:string"enabled""disabled" 之一)

AutoNAT.Throttle

设置后,此选项将配置 AutoNAT 服务限制行为。经过
默认情况下,Kubo 将对其他设备执行 NAT 检查的次数进行速率限制
节点数增加到每分钟 30 个,每个对等点 3 个。

AutoNAT.Throttle.GlobalLimit

配置每个“AutoNAT.Throttle.Interval”要服务的 AutoNAT 请求数。

默认值:30

类型:integer(非负数,0表示无限制)

AutoNAT.Throttle.PeerLimit

配置每个“AutoNAT.Throttle.Interval”为每个对等点提供服务的 AutoNAT 请求数。

默认值:3

类型:integer(非负数,0表示无限制)

AutoNAT.Throttle.Interval

配置上述限制的时间间隔。

默认值:1 分钟

类型:duration(当0/未设置时,使用默认值)

引导程序

Bootstrap 是您的节点连接到的受信任节点的多地址数组,用于在启动时获取网络的其他节点。

默认值:ipfs.io 引导节点

类型:数组[字符串](多地址)

数据存储

包含与磁盘上的构建和操作相关的信息
存储系统。

数据存储.StorageMax

ipfs 存储库数据存储大小的软上限。使用“StorageGCWatermark”,
用于计算是否触发 gc 运行(仅当设置了 --enable-gc 标志时)。

默认值:“10GB”

类型:字符串(大小)

数据存储.StorageGCWatermark

垃圾回收将占“StorageMax”值的百分比
如果守护进程在启用自动 gc 的情况下运行(即
当前选项默认为 false)。

默认值:90

类型:整数 (0-100%)

数据存储.GCPeriod

指定运行垃圾收集的频率的持续时间。仅使用过
如果启用自动GC。

默认值:1h

类型:duration(空字符串表示默认值)

数据存储.HashOnRead

一个布尔值。如果设置为 true,则所有从磁盘读取的块都将被散列并
已验证。这将导致 CPU 利用率增加。

默认值:“假”

类型:布尔

数据存储.BloomFilterSize

一个数字,表示块存储的 [bloom] 的大小(以字节为单位)
过滤器](https://en.wikipedia.org/wiki/Bloom_filter)。零值代表
该功能已禁用。

该站点为各种布隆过滤器值生成有用的图表:
https://hur.st/bloomfilter/?n=1e6&p=0.01&m=&k=7 您可以使用它来查找
首选最佳值,其中“m”是以位为单位的“BloomFilterSize”。记得
将值“m”从位转换为字节,以用作中的“BloomFilterSize”
配置文件。例如,对于 1,000,000 个区块,预计误报率为 1%
率,最终过滤器大小为 9592955 位,因此对于“BloomFilterSize”
我们想要使用 1199120 字节。截至撰写本文时,7 哈希
函数

,所以式中常数“k”为7。

默认值:“0”(禁用)

类型:integer(非负,字节)

数据存储.Spec

Spec 定义了 ipfs 数据存储的结构。它是一个可组合的结构,
其中每个数据存储都由一个 json 对象表示。数据存储可以包装其他
数据存储提供额外的功能(例如指标、日志记录或缓存)。

这可以手动更改,但是,如果您进行任何需要更改的更改
不同的磁盘结构,您将需要运行 ipfs-ds-convert
工具
将数据迁移到新的
结构。

有关此配置选项的可能值的更多信息,请参阅
文档/数据存储.md

默认:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
“坐骑”:[
{
“孩子”: {
“路径”:“块”,
"shardFunc": "/repo/flatfs/shard/v1/倒数第二个/2",
“同步”:真,
“类型”:“Flatfs”
},
“挂载点”:“/块”,
"前缀": "flatfs.datastore",
“类型”:“测量”
},
{
“孩子”: {
“压缩”:“无”,
“路径”:“数据存储”,
“类型”:“级别”
},
“挂载点”:“/”,
"prefix": "leveldb.datastore",
“类型”:“测量”
}
],
“类型”:“安装”
}

类型:对象

发现

包含用于配置 IPFS 节点发现机制的选项。

Discovery.MDNS

ZeroConf 多播 DNS-SD 对等发现选项。

Discovery.MDNS.Enabled

一个布尔值,表示多播 DNS-SD 是否应处于活动状态。

默认值:true

类型:布尔

Discovery.MDNS.Interval

已删除: 这不再可配置
新的 mDNS 实现 中。

实验

切换和配置 Kubo 的实验性功能。此处 列出了实验功能。

网关

HTTP 网关的选项。

Gateway.NoFetch

当设置为 true 时,网关将仅提供本地存储库中已有的内容
并且不会从网络获取文件。

默认值:“假”

类型:布尔

网关.NoDNSLink

一个布尔值,用于配置 DNSLink 是否在“Host” HTTP 标头中查找值
应该执行。如果存在 DNSLink,则存储在 DNS TXT 中的内容路径
记录变为“/”,并将相应的有效负载返回给客户端。

默认值:“假”

类型:布尔

Gateway.DeserializedResponses

用于显式配置此网关是否响应反序列化的可选标志
要求,或不要求。默认情况下,它是启用的。禁用此选项时,网关
仅作为无信任网关运行:https://specs.ipfs.tech/http-gateways/trustless-gateway/。

默认值:true

类型:标志

Gateway.HTTPHeaders

在网关响应上设置的标头。

默认值:“{}”+来自“boxo/gateway#AddAccessControlHeaders”和 ipfs/specs#423 的隐式 CORS 标头

类型:对象[字符串 -> 数组[字符串]]

Gateway.RootRedirect

/ 请求重定向到的 url。

默认值:""

类型:字符串(网址)

Gateway.FastDirIndexThreshold

已删除:此选项不再需要。自 Kubo 0.18 起被忽略。

网关.可写

已删除:此选项从 Kubo 0.20 起不再可用。

我们正在努力开发一种现代替代品。为了支持我们的努力,请在 ipfs/specs#375 中留下描述您的用例的评论。

Gateway.PathPrefixes

已删除: 请参阅 go-ipfs#7702

网关.公共网关

PublicGateways 是一个字典,用于定义指定主机名上的网关行为。

可以选择使用一个或多个通配符来定义主机名。

例子:

  • *.example.com 将匹配对 http://foo.example.com/ipfs/*http://{cid}.ipfs.bar.example.com/* 的请求。
  • foo-*.example.com 将匹配对 http://foo-bar.example.com/ipfs/*http://{cid}.ipfs.foo-xyz.example.com 的请求/*

Gateway.PublicGateways:路径

应在主机名上公开的路径数组。

例子:

1
2
3
4
5
6
7
8
9
{
“网关”:{
“公共网关”:{
“example.com”:{
“路径”:[“/ ipfs”,“/ ipns”]
}
}
}
}

上面启用了“http://example.com/ipfs/*”和“http://example.com/ipns/*”,但不启用“http://example.com/api/*”

默认值:[]

类型:数组[字符串]

Gateway.PublicGateways:UseSubdomains

一个布尔值,用于配置主机名处的网关是否提供源隔离
内容根之间。

  • true - 在http://*.{hostname}/启用[子域网关](https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway)

    • 需要白名单: 确保设置相应的“路径”。
      例如,http://{cid}.ipfs.{hostname}http://{foo}.ipns.{hostname} 需要 Paths: [“/ipfs”, “/ipns”] } 工作:
      1
      2
      3
      4
      5
      6
      7
      8
      “网关”:{
      “公共网关”:{
      “dweb.link”:{
      “UseSubdomains”:true
      “路径”:[“/ ipfs”,“/ ipns”]
      }
      }
      }
    • **向后兼容:**对内容路径(例如“http://{hostname}/ipfs/{cid}”)的请求会产生重定向到“http://{cid}.ipfs.{hostname}”
    • API: 如果“/api”位于“Paths”白名单中,则“http://{hostname}/api/{cmd}”会生成重定向到“http://api.{hostname}/api” /{cmd}`
  • false - 在http://{hostname}/*启用路径网关

    • 例子:
      1
      2
      3
      4
      5
      6
      7
      8
      “网关”:{
      “公共网关”:{
      “ipfs.io”:{
      “UseSubdomains”:假,
      “路径”:[“/ ipfs”,“/ ipns”,“/ api”]
      }
      }
      }

默认值:“假”

类型:布尔

Gateway.PublicGateways:NoDNSLink

一个布尔值,用于配置主机名的 DNSLink 是否存在于“Host”中
应解析 HTTP 标头。覆盖全局设置。
如果定义了“Paths”,它们优先于 DNSLink。

默认值:“false”(默认情况下为每个定义的主机名启用 DNSLink 查找)

类型:布尔

Gateway.PublicGateways:InlineDNSLink

用于显式配置子域网关是否重定向的可选标志
(由 UseSubdomains: true 启用)应始终内联 DNSLink 名称 (FQDN)
到单个 DNS 标签中:

1
//example.com/ipns/example.net → HTTP 301 → //example-net.ipns.example.com

DNSLink 名称内联允许在公共子域网关上使用 HTTPS
标签通配符 TLS 证书(在传递 X-Forwarded-Proto: https 时也启用),
当特殊规则如
https://publicsuffix.org,或 Brave 等浏览器中的自定义本地主机逻辑
必须应用。

默认值:“假”

类型:标志

Gateway.PublicGateways:反序列化响应

用于显式配置此网关是否响应反序列化的可选标志
要求,或不要求。默认情况下,它是启用的。禁用此选项时,网关
仅作为无信任网关运行:https://specs.ipfs.tech/http-gateways/trustless-gateway/。

默认值:与全局 Gateway.DeserializedResponses 相同

类型:标志

Gateway.PublicGateways 的隐式默认值

localhost 主机名和环回 IP 的默认条目始终存在。
如果为这些主机名提供了附加配置,它将合并到隐式值之上:

1
2
3
4
5
6
7
8
9
10
{
“网关”:{
“公共网关”:{
“本地主机”:{
“路径”:[“/ ipfs”,“/ ipns”]
“使用子域名”:true
}
}
}
}

也可以通过将默认值设置为“null”来删除默认值。

例如,禁用“localhost”上的子域网关
并使该主机名的行为与“127.0.0.1”相同:

``控制台
$ ipfs config –json Gateway.PublicGateways ‘{“localhost”: null }’

1
2
3
4
5
6
7
8
9
10
11
12
13

### `网关`食谱

以下是最常见的公共网关设置的列表。

* 公共[子域网关](https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway)位于`http://{cid}.ipfs.dweb.link` (每个内容根都有自己的起源)
``控制台
$ ipfs config --json Gateway.PublicGateways '{
“dweb.link”:{
“UseSubdomains”:true,
“路径”:[“/ipfs”,“/ipns”]
}
}'
  • **向后兼容:**此功能可以自动从内容路径重定向到子域:

    http://dweb.link/ipfs/{cid}http://{cid}.ipfs.dweb.link

  • X-Forwarded-Proto: 如果您在提供 TLS 的反向代理后面运行 Kubo,请使其添加“X-Forwarded-Proto:https” HTTP 标头,以确保用户重定向到“https://” ,而不是“http://”。它还将确保 DNSLink 名称内联以适合单个 DNS 标签,因此它们可以与通配符 TLS 证书一起正常工作(详细信息 )。NGINX 指令是 proxy_set_header X-Forwarded-Proto "https";。:

    http://dweb.link/ipfs/{cid}https://{cid}.ipfs.dweb.link

    http://dweb.link/ipns/your-dnslink.site.example.comhttps://your--dnslink-site-example-com.ipfs.dweb.link

  • X-Forwarded-Host: 如果您想覆盖原始请求中的子域网关主机,我们还支持 X-Forwarded-Host: example.com

    http://dweb.link/ipfs/{cid}http://{cid}.ipfs.example.com

  • 公共路径网关位于http://ipfs.io/ipfs/{cid} (无原点分离)
    ``控制台
    $ ipfs config –json Gateway.PublicGateways ‘{
    “ipfs.io”:{
    “UseSubdomains”:假,
    “路径”:[“/ipfs”、“/ipns”、“/api”]
    }
    }’

    1
    2
    3
    4

    * 公共 [DNSLink](https://dnslink.io/) 网关解析“Host”标头中传递的每个主机名。
    ``控制台
    $ ipfs config --json Gateway.NoDNSLink false
    • 请注意,“NoDNSLink: false”是默认值(除非手动设置为“true”,否则它开箱即用)
  • 强化的、特定于站点的 DNSLink 网关

    禁用远程数据获取(“NoFetch: true”)和解析未知主机名的 DNSLink(“NoDNSLink: true”)。
    然后,仅针对特定主机名(其数据
    已经存在于节点上),而不暴露任何内容寻址“路径”:

    ``控制台
    $ ipfs config –json Gateway.NoFetch true
    $ ipfs config –json Gateway.NoDNSLink true
    $ ipfs config –json Gateway.PublicGateways ‘{
    “en.wikipedia-on-ipfs.org”:{
    “NoDNSLink”:假,
    “路径”:[]
    }
    }’

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226

    ## `身份`

    ### `Identity.PeerID`

    此配置对等点的唯一 PKI 身份标签。设置在 init 上并且从不读取,
    在这里只是为了方便。ipfs 将始终从其生成对等点 ID
    运行时的密钥对。

    类型:`string`(对等 ID)

    ### `Identity.PrivKey`

    Base64 编码的 protobuf 描述(并包含)节点的私钥。

    类型:“字符串”(base64 编码)

    ## `内部`

    本部分包括各种子系统的内部旋钮,允许拥有大型或私有基础设施的高级用户微调某些行为,而无需重新编译 Kubo。

    **请注意,在此处进行明智的更改需要深入的知识,大多数用户应保持这些不变。此处列出的所有旋钮在版本之间都会发生重大变化。**

    ### `内部.Bitswap`

    “Internal.Bitswap”包含用于调整 Bitswap 资源利用率的旋钮。
    旋钮(如下)记录了它们的值应如何相互关联。
    应确定是否应提高或降低其值
    基于指标“ipfs_bitswap_active_tasks”、“ipfs_bitswap_pending_tasks”,
    `ipfs_bitswap_pending_block_tasks` 和 `ipfs_bitswap_active_block_tasks`
    由 Bitswap 报道。

    这些指标可以作为 Prometheus 端点在“{Addresses.API}/debug/metrics/prometheus”进行访问(默认值:“http://127.0.0.1:5001/debug/metrics/prometheus”)

    “ipfs_bitswap_active_tasks”的值由“EngineTaskWorkerCount”限制。

    `ipfs_bitswap_pending_tasks` 的值通常由下面的旋钮限制,
    然而,它的确切最大值很难预测,因为它取决于任务大小
    以及发出请求的同行数量。然而,根据经验,
    在健康运行期间,该值应围绕“典型”低值振荡
    (不会连续达到平台期)。

    如果“ipfs_bitswap_pending_tasks”正在增长,而“ipfs_bitswap_active_tasks”达到最大值,则
    该节点已达到其资源限制,新请求进入后无法尽快得到处理。
    假设硬件可以支持新的限制,提高资源限制(使用下面的旋钮)可能会有所帮助。

    “ipfs_bitswap_active_block_tasks”的值由“EngineBlockstoreWorkerCount”限制。

    “ipfs_bitswap_pending_block_tasks”的值间接受到“ipfs_bitswap_active_tasks”的限制,但可能很难
    预测,因为它取决于对等任务中涉及的块的数量,该数量可能会有所不同。

    如果观察到“ipfs_bitswap_pending_block_tasks”的值增长,
    当“ipfs_bitswap_active_block_tasks”达到最大值时,有迹象表明
    可用的块任务正在造成瓶颈(由于高延迟块操作,
    或者由于每个位交换对等任务的块操作数量较多)。
    在这种情况下,请尝试增加“EngineBlockstoreWorkerCount”。
    如果此调整仍然没有增加节点的吞吐量,则可能有
    是 I/O 或 CPU 等硬件限制。

    #### `Internal.Bitswap.TaskWorkerCount`

    发送传出消息的线程(goroutine)数量。
    限制并发发送操作的数量。

    类型:`optionInteger`(线程数,`null` 表示默认为 8)

    #### `Internal.Bitswap.EngineBlockstoreWorkerCount`

    块存储操作的线程数。
    用于限制对块存储的并发请求数量。
    最佳值可以通过指标“ipfs_bitswap_pending_block_tasks”和“ipfs_bitswap_active_block_tasks”得知。
    该数字取决于您的硬件(I/O 和 CPU)。

    类型:`optionInteger`(线程数,`null` 表示默认为 128)

    #### `Internal.Bitswap.EngineTaskWorkerCount`

    用于在发送响应之前准备和打包响应的工作线程数。
    该数字通常应等于“TaskWorkerCount”。

    类型:`optionInteger`(线程数,`null` 表示默认为 8)

    #### `Internal.Bitswap.MaxOutstandingBytesPerPeer`

    等待处理并发送到任何单个对等点的最大字节数(跨所有任务)。
    这个数字控制公平性,可以从 250Kb(非常公平)到 10Mb(不太公平,需要更多工作)变化
    献给有更多要求的同行)。低于 250Kb 的值可能会导致抖动。
    超过 10Mb 的值可能会导致积极想要的对等方消耗所有资源并
    降低向需求不那么积极的同行提供的质量。

    类型:“可选整数”(字节数,“null”表示默认值,即 1MB)

    ### `Internal.Bitswap.ProviderSearchDelay`

    此参数确定在查找 bitswap 之外的提供程序之前等待多长时间。
    其他路由系统(例如 DHT)能够在不到一秒的时间内提供结果,因此降低了
    在某些情况下,这个数字将允许更快的对等点查找。

    类型:“可选持续时间”(“null”表示默认值,即 1 秒)

    ### `Internal.UnixFSShardingSizeThreshold`

    内部使用分片阈值来决定 UnixFS 目录是否应该分片。
    该值与 UnixFS 目录块的大小以及任何增加并不严格相关
    阈值应注意块大小保持在 2MiB 以下,以便它们
    可通过网络堆栈可靠地传输(公共群上的 IPFS 对等点往往会忽略大于 2MiB 的块的请求)。

    将此值减少到 1B 在功能上等同于之前的实验性分片选项
    分片所有目录。

    类型:“可选字节”(“null”表示默认值,即 256KiB)

    ## `IPNS`

    ### `Ipns.RepublishPeriod`

    指定重新发布 ipns 记录的频率的持续时间,以确保
    他们在网络上保持新鲜感。

    默认值:4 小时。

    输入:“interval”或默认为空字符串。

    ### `Ipns.RecordLifetime`

    指定要在 ipns 记录上设置的值以确保其有效性的持续时间
    寿命。

    默认值:24 小时。

    输入:“interval”或默认为空字符串。

    ### `Ipns.ResolveCacheSize`

    存储在已解析 ipns 条目的 LRU 缓存中的条目数。参赛作品
    将被保存在缓存中,直到其生命周期到期。

    默认值:`128`

    类型:`integer`(非负数,0表示默认)

    ### `Ipns.UsePubsub`

    启用 IPFS over pubsub 实验以实时发布 IPNS 记录。

    **实验:** 在 [experimental-features.md#ipns-pubsub](./experimental-features.md#ipns-pubsub) 中了解当前限制。

    默认值:`禁用`

    类型:`标志`

    ## `迁移`

    迁移配置如何下载迁移以及是否将下载添加到本地 IPFS。

    ### `迁移.DownloadSources`

    来源按优先顺序排列,其中“IPFS”表示使用 IPFS,“HTTPS”表示使用默认网关。任何其他值都被解释为自定义网关的主机名。空列表意味着“使用默认源”。

    默认值:`[“HTTPS”,“IPFS”]`

    ### `迁移.保留`

    指定下载后是否保留迁移。选项有“丢弃”、“缓存”、“固定”。默认为空字符串。

    默认值:`缓存`

    ## `坐骑`

    **实验:** 在 [fuse.md](./fuse.md) 中了解当前限制。

    FUSE 安装点配置选项。

    ### `挂载.IPFS`

    `/ipfs/` 的挂载点。

    默认值:`/ipfs`

    类型:`string`(文件系统路径)

    ### `坐骑.IPNS`

    `/ipns/` 的挂载点。

    默认值:`/ipns`

    类型:`string`(文件系统路径)

    ### `Mounts.FuseAllowOther`

    在安装点上设置“FUSE 允许其他”选项。

    ## `固定`

    固定配置可用于固定内容的选项
    (即长期保存内容而不是临时缓存存储)。

    ### `固定.RemoteServices`

    `RemoteServices` 将远程固定服务的名称映射到其配置。

    远程固定服务是公开用于管理的 API 的远程服务
    该服务对长期数据存储的兴趣。

    公开的 API 符合以下定义的规范
    https://ipfs.github.io/pinning-services-api-spec/

    #### `固定.RemoteServices:API`

    包含与使用远程固定服务相关的信息

    例子:
    ```json
    {
    “固定”:{
    “远程服务”:{
    “myPinningService”:{
    “API”:{
    “端点”:“https://pinningservice.tld:1234/my/api/path”,
    “密钥”:“一些不透明密钥”
    }
    }
    }
    }
    }
Pinning.RemoteServices:API.Endpoint

用于访问固定服务的 HTTP(S) 端点

示例:“https://pinningservice.tld:1234/my/api/path”

类型:字符串

固定.RemoteServices:API.Key

授予对固定服务的访问权限的密钥

类型:字符串

Pinning.RemoteServices:策略

包含远程固定服务的附加选择加入策略。

固定.RemoteServices:策略.MFS

启用此策略后,它会遵循 MFS 的更改
并更新已配置的远程服务上 MFS 根的 pin。

仅当 MFS 根 CID 更改时才会向远程服务发送 pin 请求
并且自上次请求以来已经过去了足够的时间(由“RepinInterval”确定)。

人们可以通过“ipfs 日志级别 Remotepinning/mfs debug”启用调试来观察 MFS 固定细节,并在完成后切换回“错误”。

Pinning.RemoteServices:策略.MFS.Enabled

控制此策略是否处于活动状态。

默认值:“假”

类型:布尔

Pinning.RemoteServices:策略.MFS.PinName

用于表示 MFS 根 CID 的远程引脚的可选名称。
当留空时,将生成默认名称。

默认值:"policy/{PeerID}/mfs",例如"policy/12.../mfs"

类型:字符串

Pinning.RemoteServices:Policies.MFS.RepinInterval

定义将 pin 请求发送到远程服务的频率(最多)。
如果留空,将使用默认间隔。低于“1m”的值将被忽略。

默认值:“5m”

类型:持续时间

发布订阅

已弃用:请参阅 #9717

Pubsub 配置“ipfs pubsub”子系统。要使用它,必须通过以下方式启用
--enable-pubsub-experiment 标志传递给守护进程
或通过下面的“Pubsub.Enabled”标志。

Pubsub.Enabled

已弃用:请参阅 #9717

启用 pubsub 系统。

默认值:“假”

类型:标志

Pubsub.Router

已弃用:请参阅 #9717

设置 pubsub 用于将消息路由到对等点的默认路由器。这可以是以下之一:

*“floodsub”-floodsub 是一个基本路由器,它只是将消息_floods_发送给所有
连接的同行。该路由器效率极低,但_非常_可靠。

  • "gossipsub" - [gossipsub][] 是一种更高级的路由算法,它将
    从网络中链接的子集构建覆盖网格。

默认值:“gossipsub”

类型:string"floodsub""gossipsub""" 之一(应用默认值))

[gossipsub]:https://github.com/libp2p/specs/tree/master/pubsub/gossipsub

Pubsub.DisableSigning

已弃用:请参阅 #9717

禁用消息签名和签名验证。启用此选项,如果
您正在一个完全可信的网络中运行。

即使您不关心是谁发送的,禁用签名也是_不_安全的
消息,因为欺骗消息可以用来压制真实消息
故意重复使用真实消息的消息 ID。

默认值:“假”

类型:布尔

Pubsub.SeenMessagesTTL

已弃用:请参阅 #9717

控制重复消息的时间窗口,由 Message 标识
ID,将被识别,不会再次发出。

该参数值较小意味着缓存中的 Pubsub 消息将
更快地进行垃圾收集,这可能会导致缓存更小。同时
时间,如果网络中存在转发较旧消息的较慢节点,
这可能会导致更多的重复项通过网络传播。

相反,该参数的值越大,意味着 Pubsub 消息在
缓存稍后将被垃圾收集,这可能会导致更大的缓存
相同的流量模式。然而,重复的可能性较小
通过网络传播。

默认值:请参阅 go-libp2p-pubsub 中的 TimeCacheDuration

类型:可选持续时间

Pubsub.SeenMessagesStrategy

已弃用:请参阅 #9717

确定 Pubsub 重复数据删除的生存时间 (TTL) 倒计时方式
消息被计算。

Pubsub 看到的消息缓存是一个 LRU 缓存,可将消息保留最多
指定的持续时间。过了这个时间后,过期的消息将会
从缓存中清除。

“最后查看”缓存是滑动窗口缓存。每次看到消息
再次随着 SeenMessagesTTL 持续时间,其时间戳向前滑动。这
缓存频繁出现的消息并防止它们被
不断传播,特别是因为可能会增加
网络中重复消息的数量。

“first-seen”缓存将存储新消息并在消息到达后清除它们
SeenMessagesTTL 持续时间,即使在此期间多次看到它们
期间。

默认值:last-seen(参见 go-libp2p-pubsub

类型:可选字符串

对等互连

配置对等子系统。对等互连子系统将 Kubo 配置为
连接到、保持连接以及重新连接到一组节点。节点应该
使用此子系统在经常有用的对等点之间创建“粘性”链接
提高可靠性。

用例:

  • 连接到 IPFS 集群的 IPFS 网关应该对等以确保
    网关始终可以从集群中获取内容。
  • dapp 可以通过一组固定服务对嵌入的 Kubo 节点进行对等,或者
    纺织咖啡馆/中心。
  • 一群朋友可以互相查看以确保他们总是可以获取彼此的
    内容。

当一个节点被添加到对等节点集中时,Kubo 将:

  1. 保护连接管理器与此节点的连接。那是,
    Kubo 永远不会自动关闭与该节点的连接,并且
    到此节点的连接不会计入连接限制。
  2. 启动时连接到该节点。
  3. 如果最后一个连接断开或
    节点离线。这种重复的重新连接逻辑是由随机的
    指数退避延迟范围从约 5 秒到约 10 分钟,以避免
    反复重新连接到离线的节点。

对等互连可以是不对称的或对称的:

  • 当对称时,连接将受到两个节点的保护,并且可能会
    非常稳定。
  • 非对称时,只有一个节点(配置对等的节点)进行保护
    连接并尝试在断开连接时重新连接到对等节点。如果
    对等节点负载较重和/或连接限制较低,
    连接可能会反复抖动。不对称地凝视时要小心,不要
    超载同行。

对等。对等

与之对等的对等点集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
“对等”:{
“同行”:[
{
"ID": "QmPeerID1",
“地址”:[“/ip4/18.1.1.1/tcp/4001]
},
{
"ID": "QmPeerID2",
“地址”:[“/ip4/18.1.1.2/tcp/4001”,“/ip4/18.1.1.2/udp/4001/quic”]
}
]
}
...
}

其中“ID”是对等点 ID,“Addrs”是对等点的一组已知地址。如果没有指定地址,则会查询 DHT。

将来可能会添加其他字段。

默认值:空。

类型:数组[对等]

重新提供者

Reprovider.Interval

设置向路由重新提供本地内容的轮次之间的时间
系统。

  • 如果未设置,则使用隐式安全默认值。
  • 如果设置为值“0”,它将禁用内容重新提供。

注意:禁用内容重新提供将导致网络上的其他节点
无法发现你拥有你所拥有的物品。如果你想
要禁用此功能并使网络了解您所拥有的内容,您必须
定期手动公布您的内容。

默认值:22hDefaultReproviderInterval

类型:“可选持续时间”(默认未设置)

Reprovider.Strategy

告诉重新提供者应该宣布什么。有效的策略是:

  • "all" - 公布存储块的所有 CID
  • "pinned" - 仅递归地宣布固定的 CID(根块和子块)
  • "roots" - 仅宣布显式固定 CID 的根块

默认值:“全部”

类型:“可选字符串”(默认未设置)

路由

包含内容、对等和 IPNS 路由机制的选项。

路由.类型

有多个路由选项:“auto”、“autoclient”、“none”、“dht”、“dhtclient”和“custom”。

  • 默认: 如果未设置或设置为“自动”,您的节点将使用 IPFS DHT
    和下面列出的并行 HTTP 路由器可提高速度。

  • 如果设置为“autoclient”,您的节点将像“auto”一样运行,但不运行 DHT 服务器。

  • 如果设置为“none”,您的节点将使用_no_路由系统。你必须
    明确连接到具有您正在查找的内容的对等点。

  • 如果设置为“dht”(或“dhtclient”/“dhtserver”),您的节点将仅使用 IPFS DHT(无 HTTP 路由器)。

  • 如果设置为“自定义”,则禁用所有默认路由器,并且仅使用“Routing.Routers”中定义的路由器。

当DHT启用时,它可以以两种模式运行:客户端和服务器。

  • 在服务器模式下,您的节点将向其他对等点查询 DHT 记录,并将
    响应来自其他对等点的请求(存储记录的请求和
    请求检索记录)。

  • 在客户端模式下,您的节点将作为客户端查询DHT,但不会响应
    应其他同行的要求。该模式比服务器占用资源少
    模式。

Routing.Type 设置为 autodht 时,您的节点将作为 DHT 客户端启动,并且
当确定可以从 DHT 服务器访问时,切换到 DHT 服务器
公共互联网(例如,它不在防火墙后面)。

要强制使用特定的仅 DHT 模式、客户端或服务器,请将“Routing.Type”设置为
分别为“dhtclient”或“dhtserver”。请不要将其设置为“dhtserver”
除非您确定可以从公共网络访问您的节点。

当“Routing.Type”设置为“auto”或“autoclient”时,您的节点将加速某些类型的路由
通过利用与 IPIP-337 兼容的 HTTP 端点
除了IPFS DHT。
默认情况下,IPNI 的实例
使用 https://cid.contact。
将“Routing.Type”设置为“custom”后,可以在“Routing.Routers”中配置替代路由规则。

默认值:“自动”(DHT + IPNI)

类型:可选字符串null/缺失表示默认值)

路由.AcceleratedDHTClient

这个具有完整路由表策略的替代 DHT 客户端将
每小时对 DHT 进行一次完整扫描并记录找到的所有节点。
然后,当尝试查找时,不必经历多个 Kad 跃点
通过查找内存中记录的网络表,能够找到最终的20个节点。

这意味着持续更高的内存来存储路由表
以及每次网络扫描的额外 CPU 和网络带宽。
然而,单个读/写操作的延迟应该快 10 倍左右
在更大的数据集上,吞吐量可提高 600 万倍!

这与“Routing.Type”“custom”不兼容。如果您使用可组合路由器
您可以在每个路由器上单独进行配置。

当启用时:

  • 客户端 DHT 操作(读取和写入)应该更快地完成
  • 提供商现在将使用键空间扫描模式来保持活动状态
    CID 集大多个数量级。
    • 标准的 Bucket-Routing-Table DHT 仍将为 DHT 服务器运行(如果
      DHT 服务器已启用)。这意味着经典路由表将
      仍然可以用来回答其他节点。
      这对于保持不损害网络至关重要。
  • 操作“ipfs stats dht”将默认显示有关加速 DHT 客户端的信息

注意事项:

  1. 运行加速客户端可能会导致更多资源消耗(连接、RAM、CPU、带宽)
    • 其机器/网络可以执行的并行连接数量受到限制的用户可能会受到影响
    • 资源使用不顺畅,客户端轮流抓取网络,重新提供也同样轮次完成
    • 以前拥有大量内容但无法在网络上做广告的用户将看到内容增加
      当节点开始将其所有 CID 通告到网络中时,出口带宽。如果您有大量数据
      输入您不想宣传的节点,然后考虑使用 Reprovider Strategies
      以减少您重新提供的 CID 数量。同样,如果您运行的节点主要处理
      短暂的临时数据(例如,您使用单独的节点来摄取数据,然后存储和提供数据)
      您可能会受益于使用策略提供 来防止广告
      您最终不会拥有的数据。
  2. 目前,DHT 无法用于操作前 5-10 分钟的查询,因为路由表正在更新中。
    准备好了。这意味着在 DHT 中搜索特定节点或内容等操作最初将无法进行。
    • 您可以通过运行“ipfs stats dht”来查看 DHT 是否已初始填充
  3. 目前加速DHT客户端不兼容基于局域网的DHT,不会对DHT进行操作
    他们

默认值:“假”

类型:“bool”(缺少表示“false”)

路由.路由器

实验:“Routing.Routers”配置可能会在未来版本中更改

附加路由器的映射。

允许使用替代路由器扩展默认路由 (DHT)
实施。

映射键是路由器的名称,值是其配置。

默认值:{}

类型:对象[字符串->对象]

路由.路由器:类型

实验:“Routing.Routers”配置可能会在未来版本中更改

它指定将创建的路由类型。

目前支持的类型:

  • 基于 IPIP-337 的 HTTP 协议的“http”简单委托路由
  • dht 提供基于 libp2p 的 kad-dht 的去中心化路由
  • parallelsequential:可用于顺序或并行运行多个路由器的帮助程序。

类型:字符串

路由.路由器:参数

实验:“Routing.Routers”配置可能会在未来版本中更改

创建指定路由器所需的参数。每种路由器类型支持的参数:

HTTP:

  • Endpoint(强制):将用于连接到指定路由器的 URL。
  • MaxProvideBatchSize:此数字确定每批发送的 CID 的最大数量。服务器每批接受的元素可能不超过 100 个。默认 100 个元素。
  • MaxProvideConcurrency:它确定提供内容时使用的线程数。默认情况下为 GOMAXPROCS。

双氢睾酮:

  • "Mode":DHT 使用的模式。可能的值:“服务器”、“客户端”、“自动”
  • "AcceleratedDHTClient":如果您想使用加速DHT,请设置为true
  • “PublicIPNetwork”:设置为“true”以创建“WAN”DHT。设置为“false”以创建“LAN”DHT。

平行线:

  • Routers:将并行执行的路由器列表:
    • Name:string:路由器的名称。它应该是之前添加到“路由器”列表中的其中之一。
    • 超时:持续时间:本地超时。它接受与 Go time.ParseDuration(string) 兼容的字符串(10s1m2h)。当这个特定的路由器被调用时,时间就会开始计时,当路由器返回时,或者我们达到指定的超时时间,时间就会停止。
    • ExecuteAfter:duration:提供此参数将在指定时间延迟该路由器的执行。它接受与 Go time.ParseDuration(string) 兼容的字符串(10s1m2h)。
    • IgnoreErrors:bool:它将指定如果发生错误,是否应忽略该路由器。
  • 超时:持续时间:全局超时。它接受与 Go time.ParseDuration(string) 兼容的字符串(10s1m2h)。

顺序:

  • Routers:将按顺序执行的路由器列表:
    • Name:string:路由器的名称。它应该是之前添加到“路由器”列表中的其中之一。
    • 超时:持续时间:本地超时。它接受与 Go time.ParseDuration(string) 兼容的字符串。当这个特定的路由器被调用时,时间就会开始计时,当路由器返回时,或者我们达到指定的超时时间,时间就会停止。
    • IgnoreErrors:bool:它将指定如果发生错误,是否应忽略该路由器。
  • 超时:持续时间:全局超时。它接受与 Go time.ParseDuration(string) 兼容的字符串。

默认值:{}(使用安全的隐式默认值)

类型:对象[字符串->字符串]

路由:方法

Methods:map 将定义每个方法将执行哪些路由器。关键是方法的名称:“provide”、“find-providers”、“find-peers”、“put-ipns”、“get-ipns”。所有方法都必须添加到列表中。

该值将包含:

  • RouterName:string:路由器的名称。它应该是之前添加到“Routing.Routers”列表中的其中之一。

类型:对象[字符串->对象]

例子:

使用 2 个路由器、DHT (LAN/WAN) 和并行路由器的完整示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$ ipfs config Routing.Type --json '“自定义”'

$ ipfs 配置 Routing.Routers.WanDHT --json '{
“类型”:“dht”,
“参数”: {
“模式”:“自动”,
“公共IP网络”:正确,
“加速DHTClient”:假
}
}'

$ ipfs 配置 Routing.Routers.LanDHT --json '{
“类型”:“dht”,
“参数”: {
“模式”:“自动”,
“公共IP网络”:假,
“加速DHTClient”:假
}
}'

$ ipfs 配置 Routing.Routers.ParallelHelper --json '{
“类型”:“并行”,
“参数”: {
“路由器”:[
{
“路由器名称”:“LanDHT”,
“忽略错误”:正确,
“超时”:“3秒”
},
{
“路由器名称”:“WanDHT”,
“忽略错误”:错误,
“超时”:“5m”,
“执行后”:“2秒”
}
]
}
}'

ipfs 配置路由.Methods --json '{
“查找同行”:{
“路由器名称”:“并行助手”
},
“寻找供应商”:{
“路由器名称”:“并行助手”
},
“获取 ipns”:{
“路由器名称”:“并行助手”
},
“提供”: {
“路由器名称”:“并行助手”
},
“put-ipns”:{
“路由器名称”:“并行助手”
}
}'

用于配置群的选项。

Swarm.AddrFilters

不拨号的地址数组(多地址网络掩码)。默认情况下,IPFS 节点
公布_所有_地址,甚至是内部地址。这使得节点更容易
同一网络可以互相联系。不幸的是,这意味着 IPFS
每当拨号时,节点都会尝试连接到一个或多个私有IP地址
另一个节点,即使这个另一个节点位于不同的网络上。这可能
触发某些托管提供商的网络扫描警报或导致某些设置紧张。

server 配置文件用合理的默认值填充此列表,
防止拨号到所有不可路由的 IP 地址(例如,/ip4/192.168.0.0/ipcidr/16
这是 192.168.0.0/16 的多地址表示),但你应该始终
检查您自己的网络和/或托管提供商的设置。

默认值:[]

类型:数组[字符串]

Swarm.DisableBandwidthMetrics

一个布尔值,当设置为 true 时,将导致 ipfs 不跟踪
带宽指标。禁用带宽指标可能会导致性能轻微下降
改进以及内存使用量的减少。

默认值:“假”

类型:布尔

Swarm.DisableNatPortMap

禁用自动 NAT 端口转发。

如果未禁用(默认),Kubo 会要求 NAT 设备(例如路由器)打开
启动外部端口并将其转发到 Kubo 正在运行的端口。当这个
工作(即,当您的路由器支持 NAT 端口转发时),它使本地
Kubo 节点可通过公共互联网访问。

默认值:“假”

类型:布尔

Swarm.EnableHolePunching

启用NAT穿越打洞功能
当无法进行端口转发时。

启用后,Kubo 将使用以下方式与交易对手进行协调
[中继连接](https://github.com/libp2p/specs/blob/master/relay/ Circuit-v2.md),
升级为直接连接
尽可能通过 NAT/防火墙。
此功能需要将“Swarm.RelayClient.Enabled”设置为“true”。

默认值:true

类型:标志

Swarm.EnableAutoRelay

已删除

请参阅“Swarm.RelayClient”。

Swarm.RelayClient

中继客户端使用中继服务的配置选项。

默认值:{}

类型:对象

Swarm.RelayClient.Enabled

为此节点启用“自动中继用户”模式。

如果您的节点检测到,它将自动_使用_来自网络的公共中继
无法从公共互联网访问它(例如,它位于
防火墙)并从公共中继获取“/p2p-电路”地址。

默认值:true

类型:标志

Swarm.RelayClient.StaticRelays

您的节点将使用这些静态配置的中继服务器
而不是从网络中发现公共中继([Circuit Relay v2](https://github.com/libp2p/specs/blob/master/relay/ Circuit-v2.md))。

默认值:[]

类型:数组[字符串]

Swarm.RelayService

可以提供给_other_对等点的中继服务的配置选项
在网络上(Circuit Relay v2)。

默认值:{}

类型:对象

Swarm.RelayService.Enabled

允许向网络上的其他对等点提供“/p2p-电路”v2 中继服务。

注意:这是中继系统的服务/服务器部分。
禁用此选项将阻止该节点作为中继服务器运行。
使用 Swarm.RelayClient.Enabled 将您的节点转变为中继用户。

默认值:true

类型:标志

Swarm.RelayService.Limit

限制应用于每个中继连接。

默认值:{}

类型:对象[字符串 -> 字符串]

Swarm.RelayService.ConnectionDurationLimit

重置中继连接之前的时间限制。

默认值:“2m”

类型:持续时间

Swarm.RelayService.ConnectionDataLimit

重置中继连接之前中继的数据限制(每个方向)。

默认值:131072 (128 kb)

类型:可选整数

Swarm.RelayService.ReservationTTL

新的或刷新的预订的持续时间。

默认值:“1h”

类型:持续时间

Swarm.RelayService.MaxReservations

活动中继插槽的最大数量。

默认值:128

类型:可选整数

Swarm.RelayService.MaxCircuits

每个对等方打开的中继连接的最大数量。

默认值:16

类型:可选整数

Swarm.RelayService.BufferSize

中继连接缓冲区的大小。

默认值:2048

类型:可选整数

Swarm.RelayService.MaxReservationsPerPeer

来自同一对等点的最大保留数。

默认值:4

类型:可选整数

Swarm.RelayService.MaxReservationsPerIP

来自同一 IP 的最大保留数。

默认值:8

类型:可选整数

Swarm.RelayService.MaxReservationsPerASN

来自同一 ASN 的最大保留数。

默认值:32

类型:可选整数

Swarm.EnableRelayHop

已删除

替换为 Swarm.RelayService.Enabled

Swarm.DisableRelay

已删除

将“Swarm.Transports.Network.Relay”设置为“false”。

Swarm.EnableAutoNATService

已删除

请使用AutoNAT.ServiceMode

Swarm.ConnMgr

连接管理器决定要保留哪些连接以及多少个连接
被配置为保留。Kubo 目前支持两种连接管理器:

  • none:从不关闭空闲连接。
  • basic:默认的连接管理器。

默认情况下,此部分为空,隐式默认值定义如下
被使用。

Swarm.ConnMgr.Type

设置要使用的连接管理器类型,选项有:“none”(无连接
管理)和“基本”。

默认值:“基本”。

类型:“可选字符串”(未设置或为空时默认)

基本连接管理器

基本连接管理器使用“高水位”、“低水位”和内部
评分以定期关闭连接以释放资源。当一个节点
使用基本连接管理器达到“HighWater”空闲连接,它将
关闭最不有用的连接,直到达到“LowWater”空闲连接。

在以下情况下,连接管理器认为连接空闲:

  • 它尚未受到某些子系统的显式_​​保护_。例如,比特交换
    将保护与正在主动下载数据的对等点的连接,
    DHT 将保护一些对等点进行路由,并且对等子系统将
    保护所有“对等”节点。
  • 它的存在时间比 GracePeriod 还要长。

例子:

1
2
3
4
5
6
7
8
9
10
{
“一群”: {
“ConnMgr”:{
“类型”:“基本”,
“低水位”:100
“高水位”:200
“宽限期”:“30 秒”
}
}
}
Swarm.ConnMgr.LowWater

LowWater 是基本连接管理器将要处理的连接数
修剪到。

默认值:32

类型:可选整数

Swarm.ConnMgr.HighWater

HighWater 是连接数,超过时将触发
连接GC操作。注意:受保护/最近形成的连接不计算在内
向这个极限。

默认值:96

类型:可选整数

Swarm.ConnMgr.GracePeriod

GracePeriod 是新连接不被关闭的时间段
由连接管理器。

默认值:“20 秒”

类型:可选持续时间

Swarm.ResourceMgr

了解有关 Kubo 使用 libp2p 网络资源管理器的更多信息
专用资源管理文档中。

Swarm.ResourceMgr.Enabled

使用基于默认值和/或其他配置的限制来启用 libp2p 资源管理器,如 libp2p 资源管理 中所述。

默认值:true
类型:标志

Swarm.ResourceMgr.MaxMemory

这是允许 libp2p 使用的最大内存量。
当达到此限制时,libp2p 的资源管理器将阻止创建额外的资源。
该值还用于扩展不同范围内各种资源的限制
当使用默认限制(在 libp2p 资源管理 中讨论)时。
例如,增加此值将增加传入连接的默认限制。

可以通过“ipfs swarm resources –help”检查运行时限制。

默认值:“[TOTAL_SYSTEM_MEMORY]/2”
类型:可选字节

Swarm.ResourceMgr.MaxFileDescriptors

这是允许 libp2p 使用的文件描述符的最大数量。
当达到此限制时,libp2p 的资源管理器将防止额外的文件描述符消耗。

此参数在 Windows 上被忽略。

默认“[TOTAL_SYSTEM_FILE_DESCRIPTORS]/2”
类型:可选整数

Swarm.ResourceMgr.Allowlist

可以绕过正常系统限制的多地址列表(但仍受白名单范围限制)。
go-libp2p-resource-manager#Allowlist.Add的便捷配置。

默认值:[]

类型:数组[字符串](多地址)

Swarm.Transports

libp2p 传输的配置部分。将应用空配置
默认值。

Swarm.Transports.Network

libp2p network 传输的配置部分。启用的传输
该部分将用于拨号。但是,要接收这些连接
传输,这些传输的多地址必须添加到“Addresses.Swarm”中。

支持的传输包括:QUIC、TCP、WS、Relay 和 WebTransport。

本节中的每个字段都是一个“标志”。

Swarm.Transports.Network.TCP

[TCP] (https://en.wikipedia.org/wiki/Transmission_Control_Protocol) 是一个简单的
和广泛部署的传输,它应该与大多数实现兼容
和网络配置。TCP 不直接支持加密和/或
多路复用,因此 libp2p 将在其之上分层安全和多路复用传输。

默认值:启用

类型:标志

收听地址:

  • /ip4/0.0.0.0/tcp/4001(默认)
  • /ip6/::/tcp/4001(默认)

Swarm.Transports.Network.Websocket

[Websocket] (https://en.wikipedia.org/wiki/WebSocket) 是一种常用的传输方式
从基于浏览器的 js-ipfs 节点连接到非基于浏览器的 IPFS 节点。

虽然默认情况下启用拨号功能,但 Kubo 不会监听此功能
默认运输。

默认值:启用

类型:标志

收听地址:

  • /ip4/0.0.0.0/tcp/4002/ws
  • /ip6/::/tcp/4002/ws

Swarm.Transports.Network.QUIC

[QUIC] (https://en.wikipedia.org/wiki/QUIC) 是最广泛使用的交通工具
久保节点。它是一种基于 UDP 的传输,具有内置加密和
复用。相对于 TCP 的主要优点是:

1.建立连接需要1次往返(我们的TCP传输
目前需要 4)。
2. 没有队头阻塞
3. 每个连接不需要文件描述符,减轻了操作系统的负载。

默认值:启用

类型:标志

收听地址:

  • /ip4/0.0.0.0/udp/4001/quic(默认)
  • /ip6/::/udp/4001/quic(默认)

Swarm.Transports.Network.Relay

Libp2p 中继 代理
通过在多个 libp2p 节点之间跳跃来形成连接的传输。
允许 IPFS 节点使用其“/p2p-电路”连接到其他对等点
多地址。这种传输主要用于绕过防火墙和
NAT。

也可以看看:

默认值:启用

类型:标志

收听地址:

  • 这种运输很特殊。任何启用此传输的节点都可以接收
    此传输上的入站连接,无需指定侦听地址。

Swarm.Transports.Network.WebTransport

[go-libp2p]的新功能(https://github.com/libp2p/go-libp2p/releases/tag/v0.23.0)
WebTransport 传输。

这是 WebSocket 的精神后代,但基于“HTTP/3”。
由于它运行在“HTTP/3”之上,因此它在底层使用“QUIC”。
由于额外的开销,我们预计它的性能比“QUIC”最差,
这种传输实际上是针对无法执行“TCP”或“QUIC”的代理(如浏览器)。

WebTransport 是一种新的传输协议,目前由 IETF 和 W3C 正在开发,并且已经由 Chrome 实现。
从概念上讲,它就像在 QUIC 而不是 TCP 上运行的 WebSocket。最重要的是,它允许浏览器建立与 WebTransport 服务器的(安全!)连接,而无需 CA 签名的证书,
从而使在浏览器中运行的任何 js-libp2p 节点能够连接到任何 kubo 节点,而无需手动配置。

之前的替代方案是 websocket 安全,需要手动安装反向代理和 TLS 证书。

默认值:启用

类型:标志

Swarm.Transports.Security

libp2p security 传输的配置部分。启用的传输
此部分将用于保护未加密的连接。

安全传输配置为“优先级”类型。

当建立_出站_连接时,Kubo 将尝试每种安全性
按优先级顺序传输(从低到高),直到找到一个协议
接收器支持。当建立_inbound_连接时,Kubo会让
发起者选择协议,但会拒绝使用任何禁用的协议
运输。

支持的传输包括:TLS(优先级 100)和 Noise(优先级 300)。

默认优先级绝不会低于 100。

Swarm.Transports.Security.TLS

TLS (1.3) 是默认值
从 Kubo 0.5.0 开始,安全传输。这也是最受关注和关注的
值得信赖的安全传输。

默认值:100

类型:优先

Swarm.Transports.Security.SECIO

对 SECIO 的支持已被删除。请从您的配置中删除此选项。

Swarm.Transports.Security.Noise

Noise 预计将被替换
由于易于使用,TLS 作为跨平台、默认的 libp2p 协议
执行。目前默认启用,但优先级较低,因为它
尚未得到广泛支持。

默认值:300

类型:优先

Swarm.Transports.Multiplexers

libp2p _多路复用器_传输的配置部分。启用的传输
该部分将用于复用双工连接。

多路复用器传输的保护方式与安全传输相同,
“优先”类型。与安全传输一样,发起者得到他们的
第一选择。

支持的传输包括:Yamux(优先级 100)和 Mplex(优先级 200)

默认优先级绝不会低于 100。

Swarm.Transports.Multiplexers.Yamux

Yamux 是 Kubo 节点之间通信时使用的默认多路复用器。

默认值:100

类型:优先

Swarm.Transports.Multiplexers.Mplex

Mplex 是 Kubo 和所有设备之间通信时使用的默认多路复用器
其他 IPFS 和 libp2p 实现。与 Yamux 不同:

  • Mplex 是一个更简单的协议。
  • Mplex 更高效。
  • Mplex 没有内置的 keepalive。
  • Mplex 不支持背压。不幸的是,这意味着,如果
    到对等点的单个流会备份一段时间,mplex
    传输将杀死该流以允许其他流继续进行。在另一
    另一方面,缺乏背压意味着 mplex 在某些方面可以明显更快
    高延迟连接。

默认值:200

类型:优先

DNS

用于为 DNSLink/dns* Multiaddrs 配置 DNS 解析的选项。

DNS.Resolvers

FQDN 到自定义解析器 URL 的映射。

这允许覆盖操作系统提供的默认 DNS 解析器,
每个域或 TLD 使用不同的解析器(包括来自替代的非 ICANN 命名系统的解析器)。

例子:

1
2
3
4
5
6
7
8
9
10
{
“DNS”:{
“解析器”:{
“eth。”:“https://dns.eth.limo/dns-query”,
“加密。”:“https://resolver.unstoppable.io/dns-query”,
“自由。”:“https://ns1.irisen.fr/dns-query”,
".": "https://cloudflare-dns.com/dns-query"
}
}
}

请注意:

  • 目前仅支持 DNS over HTTPS (DoH) 端点的“https://” URL 作为值。
  • 默认的全能解析器是操作系统提供的明文解析器。可以通过为由“.”指示的 DNS 根添加 DoH 条目来覆盖它,如上所示。
  • 对选定分散式 TLD 的开箱即用支持依赖于尽力提供的集中式服务。隐式 DoH 解析器是:
    1
    2
    3
    4
    {
    “eth。”:“https://resolver.cloudflare-eth.com/dns-query”,
    “加密。”:“https://resolver.cloudflare-eth.com/dns-query”
    }
    为了获得去中心化命名系统的所有好处,我们强烈建议将 DoH 端点设置为空字符串,并在本地主机上运行自己的去中心化解析器作为包罗万象的解析器。

默认值:{}

类型:对象[字符串 -> 字符串]

DNS.MaxCacheTTL

DoH 缓存中条目有效的最大持续时间。

这允许您限制 DNS 响应建议的生存时间 (RFC2181)。
如果存在,上限将应用于 DNS.Resolvers 中的 DoH 解析器。

注意:这不适用于 Go 的默认 DNS 解析器。要使其成为全局设置,请首先向“DNS.Resolvers”添加“.”条目。

例子:

  • "5m" DNS 条目保留 5 分钟或更短时间。
  • "0s" DNS 条目一旦被检索就会过期。

默认值:尊重 DNS 响应 TTL

类型:可选持续时间

搭建Tuic V5

作者 LanYun
2023年7月6日 09:23

前言

本文内容基于开源项目 tuic 精巧的TUICed 0-RTT代理协议,以cloudflare作为域名解析服务,surge作为代理端.

你需要至少有:

  • VPS
  • 域名

点开发布链接可以看到最新版,建议以最新版为准,可替换本文中出现的链接.

搭建

配置

首先更新软件源,并创建tuic文件夹

1
2
3
apt update -y
apt -y install wget
mkdir /opt/tuic && cd /opt/tuic

获取服务端程序并赋予权限

name -a命令查看linux架构

GNUmusl是两种不同的C库(C standard library)实现,下面用musl库,因为它具有更小的内存占用和更快的启动时间.

amd
1
2
wget https://github.com/EAimTY/tuic/releases/download/tuic-server-1.0.0/tuic-server-1.0.0-x86_64-unknown-linux-musl -O /opt/tuic/tuic-server
chmod +x /opt/tuic/tuic-server
arm
1
2
wget https://github.com/EAimTY/tuic/releases/download/tuic-server-1.0.0/tuic-server-1.0.0-aarch64-unknown-linux-musl -O /opt/tuic/tuic-server
chmod +x /opt/tuic/tuic-server

接下来建立服务端配置

1
2
cat /proc/sys/kernel/random/uuid # 获取UUID,后面记得替换
vim /opt/tuic/config.json # 将下面json内容修改后粘贴进来

稍微分别翻译一部分意思吧,详细完整请看配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 用于监听的套接字地址,默认443,如果端口被占用可以换成其他,建议用其他的端口,另外tuic暂不支持回落
// 用户列表,包含用户UUID和密码
// 证书文件的路径
// 私钥文件的路径
// 可选。拥堵控制算法,可用选项:
// "cubic", "new_reno", "bbr"
// 默认:"cubic" ,个人推荐 "bbr"
// 可选。应用层协议的协商
// 默认为空(无ALPN)
// 可选。如果服务器应该为中继IPv6 UDP数据包创建单独的UDP套接字
// 默认:true
// 可选。在服务器端启用0-RTT QUIC连接握手。
// 这对性能影响不大,因为该协议是完全复用的。
// 警告:强烈建议禁用该功能,因为它容易受到重放攻击。参见https://blog.cloudflare.com/even-faster-connection-establishment-with-quic-0-rtt-resumption/#attack-of-the-clones
// 默认值:false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"server": "[::]:443",
"users": {
"00000000-0000-0000-0000-000000000000": "PASSWORD_0"
},
"certificate": "/opt/tuic/fullchain.pem",
"private_key": "/opt/tuic/privkey.pem",
"congestion_control": "bbr",
"alpn": ["h3", "spdy/3.1"],
"udp_relay_ipv6": true,
"zero_rtt_handshake": false,
"auth_timeout": "3s",
"max_idle_time": "10s",
"max_external_packet_size": 1500,
"gc_interval": "3s",
"gc_lifetime": "15s",
"log_level": "warn"
}

创建systemd

1
vim /lib/systemd/system/tuic.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Delicately-TUICed high-performance proxy built on top of the QUIC protocol
Documentation=https://github.com/EAimTY/tuic
After=network.target

[Service]
User=root
WorkingDirectory=/opt/tuic
ExecStart=/opt/tuic/tuic-server -c config.json
Restart=on-failure
RestartPreventExitStatus=1
RestartSec=5

[Install]
WantedBy=multi-user.target
1
2
3
systemctl daemon-reload # 重新加载系统管理守护进程(systemd) 的配置文件
systemctl enable --now tuic.service # 启动tuic服务并设置开机自启
systemctl status tuic.service # 查看状态

证书

申请证书

本博客有用开源工具 acme.sh 通过DNS来自动化证书续期的教程.本文这里用另外一个开源工具 certbot

先去域名解析网站将xx.xxx.xx域名解析到你这个VPS的IP上.

下面示例并不是DNS验证,而是通过80端口验证(standalone插件)

example@gmail.com 换成你的邮箱 xx.xxx.xx 换成你的域名

1
2
3
4
5
6
7
apt -y install certbot # 安装certbot
certbot certonly \
--standalone \
--agree-tos \
--no-eff-email \
--email example@gmail.com \
-d xx.xxx.xx

通过systemd timer定时更新证书

1
2
systemctl enable --now certbot.timer # 启动并设置开机自动启动
systemctl status certbot.timer # 查看状态
1
2
3
# 创建软连接
ln -s -v /etc/letsencrypt/live/vless3.lanyundev.com/fullchain.pem /opt/tuic/fullchain.pem
ln -s -v /etc/letsencrypt/live/vless3.lanyundev.com/privkey.pem /opt/tuic/privkey.pem

添加bash脚本用于续订证书后自动重启tuic

1
vim /etc/letsencrypt/renewal-hooks/post/tuic.sh
1
2
3
#!/bin/bash

systemctl restart tuic.service
1
chmod +x /etc/letsencrypt/renewal-hooks/post/tuic.sh

额外记录一下:

证书sha256指纹获取:

1
openssl x509 -noout -fingerprint -sha256 -inform pem -in /opt/tuic/fullchain.pem

简单用法

1
2
3
4
5
6
7
8
9
10
# 查看证书列表
certbot certificates
# 手动续订,后面--manual哪些都是可选
certbot renew --manual --preferred-challenges dns --manual-auth-hook "/脚本目录/au.sh python txy add" --manual-cleanup-hook "/脚本目录/au.sh python txy clean"
# 使用 crontab 定时更新证书,示例
# 注意只有成功 renew 证书,才会重新启动 Nginx
1 1 */1 * * root certbot-auto renew --manual --preferred-challenges dns --deploy-hook "service nginx -s reload" --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean"
# 撤销证书
sudo certbot revoke --cert-name example.com
sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem

后续有机会更新吧,

❌
❌