[{"data":1,"prerenderedAt":610},["ShallowReactive",2],{"content:\u002Ffiddling\u002Fopnsense-transparent-proxy":3,"surround:\u002Ffiddling\u002Fopnsense-transparent-proxy":600},{"id":4,"title":5,"body":6,"categories":574,"date":576,"description":577,"draft":578,"extension":579,"image":580,"meta":581,"navigation":583,"path":584,"permalink":580,"published":580,"readingTime":585,"recommend":580,"references":580,"seo":590,"sitemap":591,"stem":592,"tags":593,"type":598,"__hash__":599},"content\u002Fposts\u002Ffiddling\u002Fopnsense-transparent-proxy.md","实现 OPNsense 透明代理+分流",{"type":7,"value":8,"toc":556},"minimark",[9,13,25,43,46,49,52,62,65,69,73,76,87,100,110,113,121,124,139,143,153,159,167,177,181,184,190,197,200,244,247,280,283,333,336,340,343,346,349,352,358,361,364,368,371,374,390,396,402,413,416,425,431,437,444,450,458,461,467,470,476,484,491,495,498,505,512,515,519,522,525,528,534,541,544,547,550,553],[10,11,12],"h3",{"id":12},"前言",[14,15,16,17,24],"p",{},"早先透明代理 + 分流一直使用的是 ikuai 作为主路由，OpenWRT 作为旁路由的方案，这也是网上大部分教程的主流方案。后面冲浪的时候了解到 ikuai 可能会有 ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fwusiyu.me\u002F2022-ikuai-non-cloud-background-activities\u002F",[22],"nofollow","偷跑流量与上报信息的情况"," 出现，另外作为国产闭源系统，安全性也比较成问题",[14,26,27,28,32,33,37,38,42],{},"后续更换了主路由 OpenWRT，旁路由 Debian 的 ",[18,29,31],{"href":30},"\u002Ffiddling\u002Fdebian-as-bypass-router","方案","，后面又不使用旁路由方案，先后尝试了 ",[18,34,36],{"href":35},"\u002Ffiddling\u002Ffake-ip-based-transparent-proxy","基于 FakeIP 的分流转发方案"," 和 ",[18,39,41],{"href":40},"\u002Ffiddling\u002Fmore-accurate-chnroute","基于 BGP 的分流转发方案","，最终稳定在了基于 BGP 的分流转发方案上",[14,44,45],{},"最近又了解到了 OPNsense 这个防火墙\u002F路由系统。简直是梦中情路由系统，开源免费，UI 美观，功能完善，同时还提供了 gui 界面支持自动更新 ip list 以用于分流。所以计划将现有的分流转发方案迁移到该系统上，同时不在单独使用一个软路由用于科学，而是直接将 clash 集成进主路由中",[14,47,48],{},"网上冲浪了下，相关的教程并不多，有部分教程也由于年久失修，不再有效。踩了一些坑后，决定整理一下详细的方案",[14,50,51],{},"梳理了下需要实现的功能：",[53,54,55,59],"ul",{},[56,57,58],"li",{},"DNS 转发到 clash 统一解析",[56,60,61],{},"请求流量进入 OPNsense 后，可以根据某个 list 进行分流，将部分流量导入 clash",[14,63,64],{},"OPNsense 的基础安装过程就不再赘述，网络上相关的内容很多",[10,66,68],{"id":67},"clash-安装","clash 安装",[70,71,72],"h4",{"id":72},"二进制下载和配置文件",[14,74,75],{},"DNS 解析和流量处理都依赖了 clash 的功能，所以第一步先安装 clash",[14,77,78,79,83,84],{},"ssh 进 OPNsense（怎么开启 ssh？STFW）后，新建文件夹 ",[80,81,82],"code",{"code":82},"\u002Fusr\u002Flocal\u002Fclash"," 作为 clash 二进制、配置文件和其他相关文件的存放点。clash 二进制建议 scp 过去（毕竟主路由现在还没科学，直接下载速度很慢）。这里需要先把 clash 二进制和配置文件上传到该目录下。clash 二进制重命名为 clash，配置文件命名为 ",[80,85,86],{"code":86},"config.yaml",[14,88,89,90,95,96,99],{},"在 mihomo 的 ",[18,91,94],{"href":92,"rel":93},"https:\u002F\u002Fgithub.com\u002FMetaCubeX\u002Fmihomo\u002Freleases",[22],"releases 页面"," 下载最新的内核版本。注意下载 freebsd 版本，根据你的机器架构选择 386、amd64 或者 arm64。如果你是 amd64 且后续运行 clash 时阶段出现以下报错，请下载 ",[80,97,98],{"code":98},"amd64-compatible"," 版",[101,102,108],"pre",{"className":103,"code":105,"language":106,"meta":107},[104],"language-shell","This PROGRAM can only be run on _AMD64 processors with v3 microarchitecture_ support.\n","shell","",[80,109,105],{"__ignoreMap":107},[14,111,112],{},"配置文件就不多说了，直接用一份你一直在用的就可以。但注意改动下面的配置",[101,114,119],{"className":115,"code":117,"language":118,"meta":107},[116],"language-yaml","mixed-port: 7890\n\ndns:\n  listen: 127.0.0.1:5353\n\ntun:\n  enable: false\n","yaml",[80,120,117],{"__ignoreMap":107},[14,122,123],{},"dns 监听 5353 端口，作为 OPNsense 自带的 DNS 上游。同时关闭 tun，不主动劫持流量，而是由 OPNsense 进行流量筛选后导入。这里 mixed-port 同时兼具 socks-port、http-port 和 https-port 的功能",[14,125,126,127,130,131,134,135,138],{},"运行 ",[80,128,129],{"code":129},"pw user add clash -c \"Clash\" -s \u002Fusr\u002Fsbin\u002Fnologin"," 创建一个无登录的 clash 用户，并通过 ",[80,132,133],{"code":133},"chown clash:clash \u002Fusr\u002Flocal\u002Fclash"," 赋予文件夹权限。完成后可以通过 ",[80,136,137],{"code":137},"\u002Fusr\u002Flocal\u002Fclash\u002Fclash -d \u002Fusr\u002Flocal\u002Fclash"," 执行一次，观察下是否可以成功运行",[70,140,142],{"id":141},"注册-clash-服务","注册 clash 服务",[14,144,145,146,37,149,152],{},"新建文件 ",[80,147,148],{"code":148},"\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Fclash",[80,150,151],{"code":151},"\u002Fusr\u002Flocal\u002Fopnsense\u002Fservice\u002Fconf\u002Factions.d\u002Factions_clash.conf"," 将 clash 注册成一个系统服务",[101,154,157],{"className":155,"code":156,"language":106,"meta":107},[104],"#!\u002Fbin\u002Fsh\n# $FreeBSD$\n\n# PROVIDE: clash\n# REQUIRE: LOGIN cleanvar\n# KEYWORD: shutdown\n\n# Add the following lines to \u002Fetc\u002Frc.conf to enable clash:\n# clash_enable (bool): Set to \"NO\" by default.\n# Set to \"YES\" to enable clash.\n# clash_config (path): Clash config dir.\n# Defaults to \"\u002Fusr\u002Flocal\u002Fetc\u002Fclash\"\n\n. \u002Fetc\u002Frc.subr\n\nname=\"clash\"\nrcvar=clash_enable\n\nload_rc_config $name\n\n: ${clash_enable:=\"NO\"}\n: ${clash_config=\"\u002Fusr\u002Flocal\u002Fclash\"}\n\ncommand=\"\u002Fusr\u002Flocal\u002Fclash\u002Fclash\"\n#pidfile=\"\u002Fvar\u002Frun\u002Fclash.pid\"\nrequired_files=\"${clash_config}\"\nclash_group=\"clash\"\nclash_user=\"clash\"\n\ncommand_args=\"-d $clash_config\"\n\nrun_rc_command \"$1\"\n",[80,158,156],{"__ignoreMap":107},[101,160,165],{"className":161,"code":163,"language":164},[162],"language-text","[start]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Fclash onestart\ntype:script\nmessage:starting clash\n\n[stop]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Fclash stop\ntype:script\nmessage:stoping clash\n\n[status]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Fclash statusexit 0\ntype:script_output\nmessage:get clash status\n\n[restart]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Fclash onerestart\ntype:script\nmessage:restarting clash\n","text",[80,166,163],{"__ignoreMap":107},[14,168,169,170,173,174],{},"赋予运行权限 ",[80,171,172],{"code":172},"chmod +x \u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Fclash"," 后启用 ",[80,175,176],{"code":176},"service configd restart",[70,178,180],{"id":179},"clash-开机自启","clash 开机自启",[14,182,183],{},"接下来设置 clash 开机自启就可以了，但这里有个坑：",[185,186,187],"blockquote",{},[14,188,189],{},"clash 作为系统服务启动后，并没有完成启动后就保持后台运行的功能，这样每次系统重启后会启动到 clash 之后就不会往后走，因该 clash 一直会保持在前台，导致排在 clash 后面的待启动服务就没法启动了",[14,191,192,193,196],{},"有一个曲折的办法就是通过 OPNsense 自带的一个服务监控功能 Monit 来拉起和监控 clash 的状态。Monit 功能可在 ",[80,194,195],{"code":195},"服务-Monit"," 中开启",[14,198,199],{},"在 Service Test Settings 中添加两个 Service Test，第一个负责拉起 clash",[201,202,203,216],"table",{},[204,205,206],"thead",{},[207,208,209,213],"tr",{},[210,211,212],"th",{},"Setting",[210,214,215],{},"Value",[217,218,219,228,236],"tbody",{},[207,220,221,225],{},[222,223,224],"td",{},"Name",[222,226,227],{},"Clash",[207,229,230,233],{},[222,231,232],{},"Condition",[222,234,235],{},"failed host 127.0.0.1 port 7890 type tcp",[207,237,238,241],{},[222,239,240],{},"Action",[222,242,243],{},"Restart",[14,245,246],{},"第二个避免重启死循环",[201,248,249,257],{},[204,250,251],{},[207,252,253,255],{},[210,254,212],{},[210,256,215],{},[217,258,259,266,273],{},[207,260,261,263],{},[222,262,224],{},[222,264,265],{},"RestartLimit4",[207,267,268,270],{},[222,269,232],{},[222,271,272],{},"5 restarts within 5 cycles",[207,274,275,277],{},[222,276,240],{},[222,278,279],{},"Unmonitor",[14,281,282],{},"最后在 Service Settings 里添加",[201,284,285,293],{},[204,286,287],{},[207,288,289,291],{},[210,290,212],{},[210,292,215],{},[217,294,295,301,309,317,325],{},[207,296,297,299],{},[222,298,224],{},[222,300,227],{},[207,302,303,306],{},[222,304,305],{},"Match",[222,307,308],{},"clash",[207,310,311,314],{},[222,312,313],{},"Start",[222,315,316],{},"\u002Fusr\u002Flocal\u002Fsbin\u002Fconfigctl clash start",[207,318,319,322],{},[222,320,321],{},"Stop",[222,323,324],{},"\u002Fusr\u002Flocal\u002Fsbin\u002Fconfigctl clash stop",[207,326,327,330],{},[222,328,329],{},"Tests",[222,331,332],{},"Clash,RestartLimit4",[14,334,335],{},"保存后等待一段时间，在 Monit - Status 里查看 clash 是否正常运行",[10,337,339],{"id":338},"dns-解析","DNS 解析",[14,341,342],{},"使用 OPNsense 自带的 Unbound DNS 设置上游 DNS 为 clash 的 127.0.0.1:5353，一直解析出错，非常奇怪",[14,344,345],{},"百思不得其解，最终决定关闭 Unbound DNS，用回了 AdGuard Home 作为默认 DNS，劫持 53 端口",[14,347,348],{},"AdGuard Home 没有被包含在 OPNsense 的默认插件源中，需要手动添加社区源",[14,350,351],{},"ssh 进 OPNsense 后执行命令",[101,353,356],{"className":354,"code":355,"language":106,"meta":107},[104],"$ fetch -o \u002Fusr\u002Flocal\u002Fetc\u002Fpkg\u002Frepos\u002Fmimugmail.conf https:\u002F\u002Fwww.routerperformance.net\u002Fmimugmail.conf\n$ pkg update\n",[80,357,355],{"__ignoreMap":107},[14,359,360],{},"接着在 web-gui 中的系统 - 固件 - 插件中搜索 adguard，安装 os-adguardhome-maxit 即可。安装完成后即可在服务-Adguardhome 中开启 Adguard Home。web 管理开放在 3000 端口，初始化设置过程不表，注意 DNS 监听端口设置为 53，即以 Adguard Home 作为 OPNsense 所在机器的默认 DNS server",[14,362,363],{},"安装完成后在 Adguard Home 的设置-DNS 设置中将上游 DNS 服务器设置为 127.0.0.1:5353，即 Clash 的 DNS 监听地址即可",[10,365,367],{"id":366},"国内外-ip-分流","国内外 IP 分流",[70,369,72],{"id":370},"二进制下载和配置文件-1",[14,372,373],{},"OPNsense 默认是内置了一个 Squid 代理程序用于提供流量代理，但是该程序只能用于代理 http\u002Fhttps 流量，无法代理常规的 tcp 和 udp 流量，作为一个代理是很不完美的。于是采用了曲线救国的方案，通过 tun2socks 项目将 tcp\u002Fudp 流量导入 clash 完成代理",[14,375,376,377,380,381,386,387],{},"新建文件夹 ",[80,378,379],{"code":379},"\u002Fusr\u002Flocal\u002Ftun2socks"," 作为 tun2socks 的二进制和配置文件的安放处。在 ",[18,382,385],{"href":383,"rel":384},"https:\u002F\u002Fgithub.com\u002Fxjasonlyu\u002Ftun2socks\u002Freleases",[22],"Github Releases"," 中下载最新的 freebsd 二进制到文件夹下，并将其重命名为 tun2socks。新建配置文件 ",[80,388,389],{"code":389},"\u002Fusr\u002Flocal\u002Ftun2socks\u002Fconfig.yaml",[101,391,394],{"className":392,"code":393,"language":118,"meta":107},[116],"# debug \u002F info \u002F warning \u002F error \u002F silent\nloglevel: info\n\n# URL format: [protocol:\u002F\u002F]host[:port]\nproxy: socks5:\u002F\u002F127.0.0.1:7890\n\n# URL format: [driver:\u002F\u002F]name\n# TUN 设备名称，避免使用 tun0\ndevice: tun:\u002F\u002Fproxytun2socks0\n\n# Maximum transmission unit for each packet\nmtu: 1500\n\n# Timeout for each UDP session, default value: 60 seconds\nudp-timeout: 120s\n",[80,395,393],{"__ignoreMap":107},[14,397,398,401],{},[80,399,400],{"code":400},"proxy"," 处填写到 clash 的 socks5 端口的地址",[14,403,404,405,408,409,412],{},"可在文件夹 ",[80,406,407],{"code":407},"\u002Fusr\u002Flocal\u002Ftun2socks\u002F"," 内运行 ",[80,410,411],{"code":411},".\u002Ftun2socks -config .\u002Fconfig.yaml","，测试配置文件是否正确",[70,414,415],{"id":415},"注册服务",[14,417,418,419,37,422],{},"新建文件 ",[80,420,421],{"code":421},"\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks",[80,423,424],{"code":424},"\u002Fusr\u002Flocal\u002Fopnsense\u002Fservice\u002Fconf\u002Factions.d\u002Factions_tun2socks.conf",[101,426,429],{"className":427,"code":428,"language":106,"meta":107},[104],"#!\u002Fbin\u002Fsh\n\n# PROVIDE: tun2socks\n# REQUIRE: LOGIN\n# KEYWORD: shutdown\n\n. \u002Fetc\u002Frc.subr\n\nname=\"tun2socks\"\nrcvar=\"tun2socks_enable\"\n\nload_rc_config $name\n\n: ${tun2socks_enable:=no}\n: ${tun2socks_config:=\"\u002Fusr\u002Flocal\u002Ftun2socks\u002Fconfig.yaml\"}\n\npidfile=\"\u002Fvar\u002Frun\u002F${name}.pid\"\ncommand=\"\u002Fusr\u002Flocal\u002Ftun2socks\u002Ftun2socks\"\ncommand_args=\"-config ${tun2socks_config} > \u002Fdev\u002Fnull 2>&1 & echo \\$! > ${pidfile}\"\n\nstart_cmd=\"${name}_start\"\n\ntun2socks_start()\n{\n    if [ ! -f ${tun2socks_config} ]; then\n        echo \"${tun2socks_config} not found.\"\n        exit 1\n    fi\n    echo \"Starting ${name}.\"\n    \u002Fbin\u002Fsh -c \"${command} ${command_args}\"\n}\n\nrun_rc_command \"$1\"\n",[80,430,428],{"__ignoreMap":107},[101,432,435],{"className":433,"code":434,"language":164},[162],"[start]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks start\nparameters:\ntype:script\nmessage:starting tun2socks\n\n[stop]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks stop\nparameters:\ntype:script\nmessage:stopping tun2socks\n\n[restart]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks restart\nparameters:\ntype:script\nmessage:restarting tun2socks\n\n[status]\ncommand:\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks status; exit 0\nparameters:\ntype:script_output\nmessage:request tun2socks status\n",[80,436,434],{"__ignoreMap":107},[14,438,439,440,443],{},"创建 ",[80,441,442],{"code":442},"\u002Fetc\u002Frc.conf"," 并添加以下内容：",[101,445,448],{"className":446,"code":447,"language":164},[162],"tun2socks_enable=\"YES\"\n",[80,449,447],{"__ignoreMap":107},[14,451,452,453,173,456],{},"给予运行权限 ",[80,454,455],{"code":455},"chmod +x \u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks",[80,457,176],{"code":176},[14,459,460],{},"并手动启动 tun2socks",[101,462,465],{"className":463,"code":464,"language":106,"meta":107},[104],"\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks start\n",[80,466,464],{"__ignoreMap":107},[70,468,469],{"id":469},"开机启动",[14,471,472,473],{},"创建文件 ",[80,474,475],{"code":475},"\u002Fusr\u002Flocal\u002Fetc\u002Frc.syshook.d\u002Fearly\u002F60-tun2socks",[101,477,482],{"className":478,"code":480,"language":481,"meta":107},[479],"language-bash","#!\u002Fbin\u002Fsh\n\n# Start tun2socks service\n\u002Fusr\u002Flocal\u002Fetc\u002Frc.d\u002Ftun2socks start\n","bash",[80,483,480],{"__ignoreMap":107},[14,485,486,487,490],{},"给予文件可执行权限 ",[80,488,489],{"code":489},"chmod +x \u002Fusr\u002Flocal\u002Fetc\u002Frc.syshook.d\u002Fearly\u002F60-tun2socks"," 即可",[70,492,494],{"id":493},"新建端口配置网关","新建端口、配置网关",[14,496,497],{},"在 OPNsense 的接口 - 分配中，添加一个新接口，设备即为我们在配置文件中写的 proxytun2socks0，保存即可",[14,499,500,501,504],{},"随后在添加的接口的配置页面启用接口，描述填写 TUN2SOCKS，IPv4 配置类型选择静态 IPv4，IPv4 地址为 ",[80,502,503],{"code":503},"10.0.3.1\u002F24","，保存",[14,506,507,508,511],{},"在系统 - 网关 - 配置中，新建一个网关，名称为 TUN2SOCKS_MIHOMO，接口选择我们刚添加的接口 TUN2SOCKS，IP 地址填写 ",[80,509,510],{"code":510},"10.0.3.2","，其他默认保存",[14,513,514],{},"这样我们就新建了一个网关，只要流量进入这个网关，就会被转发到 127.0.0.1:7890，也就是 clash 进行代理",[70,516,518],{"id":517},"设置国内外-ip-分流","设置国内外 IP 分流",[14,520,521],{},"OPNsense 对于我来说最有用的功能，就是防火墙 - 别名。这里可以设置一个 ip list，并在后续的规则配置中直接使用这个 ip list。这个 list 不仅可以手动填写，还可以直接订阅一个地址，动态获取",[14,523,524],{},"进入防火墙 - 别名，这里需要新建两个别名",[14,526,527],{},"第一个是 InternalAddress，表示局域网地址范围，类型选择 Network(s)，内容为",[101,529,532],{"className":530,"code":531,"language":164},[162],"0.0.0.0\u002F8\n127.0.0.0\u002F8\n10.0.0.0\u002F8\n172.16.0.0\u002F12\n192.168.0.0\u002F16\n169.254.0.0\u002F16\n224.0.0.0\u002F4\n240.0.0.0\u002F4\n",[80,533,531],{"__ignoreMap":107},[14,535,536,537],{},"第二个是 CN_V4，表示国内的 IP 地址范围，类型选择 URL Table (IPs)，内容填写一个包含国内所有网段范围的列表地址即可，如 ",[18,538,539],{"href":539,"rel":540},"https:\u002F\u002Fraw.githubusercontent.com\u002Fgaoyifan\u002Fchina-operator-ip\u002Frefs\u002Fheads\u002Fip-lists\u002Fchina.txt",[22],[14,542,543],{},"随后在防火墙 - 规则-LAN 中新建两个规则，排在规则列表的最前面，注意规则顺序从上到下",[14,545,546],{},"第一个规则目标为 InternalAddress，其余默认，表示目标地址为局域网时，按照默认规则路由",[14,548,549],{},"第二个规则目标为 CN_V4，并勾上目标\u002F反转，网关选择上文新建的 TUN2SOCKS_MIHOMO，表示当目标地址为非中国 IP 时，将流量转发到 TUN2SOCKS_MIHOMO 网关",[14,551,552],{},"下面应该就是剩下的默认规则了，其他所有流量仍然按照默认规则路由，也就是国内 IP 直接走直连",[14,554,555],{},"当尝试访问 google 时，DNS 请求由 Adguard Home 获取转发到 clash，解析出 google 的真实地址。随后再向这个地址请求数据时，命中防火墙规则的第二条，转发到 TUN2SOCKS_MIHOMO 网关，通过 socks5 端口进入 clash 处理，最终实现出墙",{"title":107,"searchDepth":557,"depth":557,"links":558},4,[559,561,566,567],{"id":12,"depth":560,"text":12},3,{"id":67,"depth":560,"text":68,"children":562},[563,564,565],{"id":72,"depth":557,"text":72},{"id":141,"depth":557,"text":142},{"id":179,"depth":557,"text":180},{"id":338,"depth":560,"text":339},{"id":366,"depth":560,"text":367,"children":568},[569,570,571,572,573],{"id":370,"depth":557,"text":72},{"id":415,"depth":557,"text":415},{"id":469,"depth":557,"text":469},{"id":493,"depth":557,"text":494},{"id":517,"depth":557,"text":518},[575],"折腾","2025-01-16 23:09:00","OPNsense 作为一款开源的防火墙和路由系统，因其美观的用户界面和全面的功能而备受关注。在经历了一系列路由方案后，用户们逐渐认识到其在透明代理和流量分流方面的强大潜力。通过结合 BGP 分流转发方式，OPNsense 提供了更高的安全性和稳定性，成为了理想的网络管理解决方案。尤其是其自动更新 IP 列表的功能，使得网络管理变得更加便捷。",false,"md",null,{"slots":582},{},true,"\u002Ffiddling\u002Fopnsense-transparent-proxy",{"text":586,"minutes":587,"time":588,"words":589},"12 min read",11.305,678300,2261,{"title":5,"description":577},{"loc":584},"posts\u002Ffiddling\u002Fopnsense-transparent-proxy",[575,594,595,596,597],"翻墙","透明代理","OPNsense","分流","tech","UuPkhNYK7vfKjSbUgawZVx5lZ8Fls0a1hhuJ9niSoPA",[601,605],{"title":602,"path":40,"stem":603,"date":604,"type":598,"children":-1},"更精确的基于 BGP 的国内外 IP 分流","posts\u002Ffiddling\u002Fmore-accurate-chnroute","2024-10-07 16:51:00",{"title":606,"path":607,"stem":608,"date":609,"type":598,"children":-1},"在 VitePress 中实现一个动态说说功能","\u002Ffiddling\u002Fvitepress-memos-component","posts\u002Ffiddling\u002Fvitepress-memos-component","2025-01-29 21:58:00",1787554444481]