-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontent.json
1 lines (1 loc) · 49.8 KB
/
content.json
1
{"meta":{"title":"sunjx97's Blog","subtitle":"","description":"随手记录日常搞机折腾的二三事~","author":"sunjx97","url":"https://sunjx97.github.io","root":"/"},"pages":[{"title":"Hello World","date":"2022-03-21T06:50:28.457Z","updated":"2022-02-12T12:57:59.481Z","comments":false,"path":"about/index.html","permalink":"https://sunjx97.github.io/about/index.html","excerpt":"","text":""}],"posts":[{"title":"ipv6 环境下的家庭网络维护","slug":"ipv6 环境下的家庭网络维护","date":"2023-11-05T03:35:04.000Z","updated":"2023-11-05T10:18:46.649Z","comments":true,"path":"posts/266c2cf6/","link":"","permalink":"https://sunjx97.github.io/posts/266c2cf6/","excerpt":"千呼万唤始出来,ipv6 终于在我这边落地了。正好赶上周末,把家里相关的网络配置折腾一下吧(","text":"前言千呼万唤始出来,ipv6 终于在我这边落地了。正好赶上周末,就折腾了一下家中相关的网络配置,顺便加以记录。本人确实不大熟悉网络相关知识,如有错误请不吝指正。 路由器开启 ipv6ipv6 的常见地址段有: 全球单播地址(也就是公网地址):2001::/16,电信的是 240e 开头,联通 2408 开头,移动 2409 开头。 局域网地址:fc、fd 开头,可路由。 链路本地地址:fe80 开头,不可路由,电脑自动生成。 ipv6 的发放模式ipv6 有三种分配模式: SLAAC Stateful DHCPv6 Stateless DHCPv6 因为是租房,光猫不在我控制范围内,分配到我路由器时已经是 /64 的地址了(悲),所以我这里使用 SLAAC 模式让光猫给下游设备分配 ipv6,根据 mac 随机生成后缀也相对更安全。 在我的 Openwrt 固件的图形管理页面有些配置没有,所以使用 ssh 远程到路由器,修改配置文件 /etc/config/dhcp 并重启。这里要将 lan 和 wan6 的 ra、dhcpv6、ndp 三项指定为 'relay',即使用中继模式。 12345678910111213141516171819202122config dhcp 'lan' option interface 'lan' option start '100' option limit '150' option leasetime '12h' option dhcpv4 'server' option force '1' option ra 'relay' option dhcpv6 'relay' option ndp 'relay'config dhcp 'wan' option interface 'wan' option ignore '1'config dhcp 'wan6' option interface 'wan6' option ignore '1' option master '1' option ra 'relay' option dhcpv6 'relay' option ndp 'relay' ADGuard home 配置我开启 ipv6 主要是为了在 bt/pt 时能获得更好的连接性,以及能在外访问家中的服务。当下 ipv6 建设并不完善,ipv6 优先的话有时会导致网速变慢和部分网页组件无法加载等问题,且 clash 对 ipv6 的支持并不好,所以我还是只使用 ipv4 的 dns 服务。 通过 设置 - DNS 设置 - DNS 服务配置 项,我们可以关闭 ipv6 地址解析。勾选禁用 IPv6 地址的解析即可。 docker 容器开启 ipv6相较于 docker 默认的 bridge 网络模式,macvlan 可以控制创建容器时的 ip 地址,方便我们针对 ip 地址进行更精细的操作。我们可以在 docker 中创建 macvlan 网络时添加参数,使之默认支持 ipv6。注:下文提及的所有 docker 容器均使用 macvlan 网络,且获得了独立的公网 ipv6 地址。 基本原理在创建 macvlan 时,只指定 ipv6 的局域网网段,但不配置 ipv6 网关。此时本 macvlan 网络创建的容器,其 ipv6 的公网地址和网关将通过 SLAAC 从路由器获得。 教程查看宿主机网卡名称打开安装 docker 的宿主机,先查询网卡/接口名称。执行以下命令:ifconfig,结合 ip 地址,可以看到我这里的网卡名为 ens18。 创建 macvlan 网络执行以下命令创建 macvlan 网络: 1docker network create -d macvlan –ipv6 –subnet=【内网 v4 网段(CIDR)】 –gateway=【内网 v4 网关】 –subnet=fd00::/64 -o parent=【宿主机网卡名称】 【macvlan 网络名】 【内网 v4 网段(CIDR)】以 CIDR 格式。如内网为从 192.168.1.1 到 192.168.1.255,则写成这样的形式:192.168.0.0/24。 【内网 v4 网关】即你的内网网关,一般为路由器地址。 假定网关为 192.168.1.1,那么应写成: 1docker network create -d macvlan –ipv6 –subnet=192.168.0.0/24 –gateway=192.168.1.1 –subnet=fd00::/64 -o parent=ens18 test1br0 用该命令创建名为 test1br0 的 macvlan 网络,仅后所有用到该网络创建的 docker 容器都会有 ipv6 地址。 内网服务暴露ipv6 流量转发因为 ipv6 完全暴露到公网,所以默认情况下路由器会开启 ipv6 防火墙,只允许内部的设备向外访问 ipv6 地址,而不允许外部访问内部。像这样如果在 bt 时,两端都开启 ipv6 防火墙就寄了,防火墙阻隔了对方发起 ipv6 访问的请求。 所以我们要配置网关的 ipv6 防火墙,对相关流量进行放行。 Openwrt 防火墙进入 网络 - 防火墙 模块,我们可以设置 Openwrt 的防火墙。关于防火墙的详细配置可以参看这篇文章。 三个出入转发规则:当接口没有加入任何一个防火墙区域的时候,就遵循这个默认规则。这里的出入转发都是针对路由器而言: 入站:数据包发送给路由器 出站:数据包从路由器发出 转发:流量终点站不是路由器,只是经路由器中转转发 配置防火墙放行 ipv6 流量当前有两种针对 ipv6 流量的放行方式: 针对 ip 放行 针对端口放行 额外配置放行规则通过 网络 - 防火墙 - 通信规则,我们可以自定义相关的流量规则。 匹配固定 ipv6 后缀写法:::【需要暴露的主机的后缀】/::ffff:ffff:ffff:ffff 一般用于 dhcpv6 这种后缀固定且有规律的情况。如你的主机 ipv6 后缀为 d09,则目标地址应填写 ::d09/::ffff:ffff:ffff:ffff。 transmission公网 ipv6 对用于 bt/pt 的 transmission 十分重要。我们可以通过开放相应端口的形式使之更好地利用 ipv6。 路由器防火墙配置我这里的 transmission 端口为 51413,所以开放所有针对 51413 端口的流量转发。这或许太过简单粗暴,也许会有安全隐患,但是胜在方便。 使用 Shadowsocks 访问内网因为我的 Shadowsocks 容器有独立的 ipv6 地址,所以无法通过常规的 ddns 手段更新 ipv6 地址。如果是 host 模式会简单很多。 ddns这里使用 Openwrt 自带的 ddns-go 来更新路由器 ipv6 地址。 选择你的 dns 服务商,填好相关信息。 这里之开启 ipv6 的 ddns 服务。如下选择好,等待更新。 端口转发选择 网络 - 端口转发,添加一条端口转发规则。将入站的端口为 9000 的 ipv6 流量转发给本地 Shadowsocks 对应的 ip 和端口。 路由器防火墙配置不知道为什么前面端口转发勾选的打开防火墙端口没有生效,所以这里在防火墙再开启一下相应端口的流量入站。 针对局域网内访问的优化ADGuard home 配置 DNS 重写因为关闭了 ipv6 的 dns 解析,我们这里设置 DNS 重写。在 过滤器 - DNS 重写 页面,可以很方便的添加一条规则,将所有访问对 Shadowsocks 节点域名的请求转发给内网的 Shadowsocks 服务。我使用泛域名统一转发给了 Nginx Proxy Mananger Nginx Proxy Mananger 转发流量因为我用泛域名将所有请求转发给了 Nginx Proxy Mananger,所以这里在 Nginx Proxy Mananger 多添加一条 Stream 的转发。因为我 Shadowsocks 服务的端口为 9000,所以我将 9000 端口的请求再转发到内网的 Shadowsocks 服务。 结语ipv6 还是前景可期的。虽然现在国内相关的建设还不完善,但当下也足够个人使用了。还是希望随着时间的推移,ipv6 推广也能顺利进展下去吧。 参考资料【原创】 通过openwrt的IPV6中继(也叫ipv6透传),使后端设备获得原生ipv6公网地址unraid系统下macvlan网络的docker容器使用ipv6什么是CIDR? - CIDR 块和表示法简介 - Amazon AWS关于家庭 ipv6 网络的“裸奔”问题之我见openwrt 防火墙解析超详细,多图,简单,OpenWRT IPV6 端口转发 SOCAT (个人记录)求助:ipv6端口转发IPv6 — 动态地址配置","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"transmission","slug":"transmission","permalink":"https://sunjx97.github.io/tags/transmission/"},{"name":"docker","slug":"docker","permalink":"https://sunjx97.github.io/tags/docker/"},{"name":"Shadowsocks","slug":"Shadowsocks","permalink":"https://sunjx97.github.io/tags/Shadowsocks/"},{"name":"Openwrt","slug":"Openwrt","permalink":"https://sunjx97.github.io/tags/Openwrt/"},{"name":"ipv6","slug":"ipv6","permalink":"https://sunjx97.github.io/tags/ipv6/"},{"name":"ddns","slug":"ddns","permalink":"https://sunjx97.github.io/tags/ddns/"},{"name":"防火墙","slug":"防火墙","permalink":"https://sunjx97.github.io/tags/%E9%98%B2%E7%81%AB%E5%A2%99/"},{"name":"端口转发","slug":"端口转发","permalink":"https://sunjx97.github.io/tags/%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/"}]},{"title":"使用docker搭建vaultwarden密码管理服务","slug":"使用docker搭建vaultwarden密码管理服务","date":"2022-07-11T11:22:22.000Z","updated":"2022-12-25T15:46:04.726Z","comments":true,"path":"posts/b3a0bacb/","link":"","permalink":"https://sunjx97.github.io/posts/b3a0bacb/","excerpt":"bitwarden是一款优秀的自由开源密码管理软件,其覆盖多平台且支持自行部署。但由于官方版本过重,使用rust重写的第三方开源版vaultwarden更适合我们搭建使用——它运行更轻量,也能使用许多官方版本需要付费的功能。","text":"前言今天介绍一款密码管理软件bitwarden。bitwarden是一款优秀的自由开源密码管理软件,其覆盖多平台且支持自行部署。但由于官方版本过重,使用rust重写的第三方开源版vaultwarden更适合我们搭建使用——它运行更轻量,也能使用许多官方版本需要付费的功能。 服务端搭建流程使用docker搭建vaultwarden使用以下命令搭建,注意替换掉【你的ADMIN_TOKEN】和【数据目录】。 1docker run -d --name vaultwarden --restart unless-stopped --hostname vaultwarden -e ADMIN_TOKEN=【你的ADMIN_TOKEN】 -e WEBSOCKET_ENABLED=true -v 【数据目录】:/data/ -p 80:80 -p 3012:3012 vaultwarden/server:latest 详细设置参数可以在官方文档找到,参见这里。 设置smtp邮件通知进入http://【容器ip】/admin(如容器ip为192.168.10.5,则为http://192.168.10.5/admin),输入之前配置的【你的ADMIN_TOKEN】进入管理页面 点开SMTP Email Settings模块,勾选Enabled打开,其余部分填入对应内容即可。此处以QQ邮箱为例。 如上,From Address和Username填入邮箱地址,Password为邮箱密码(或其他凭证,如QQ邮箱使用授权码),From Name为发信人名称。 设置即时自动同步vaultwarden默认可以定期自动同步,但间隔期可能导致多设备数据不一致,有时甚至会导致未同步信息被覆盖。好在如今,我们可以通过开启WebSocket来实现实时同步。 创建容器时的WEBSOCKET_ENABLED=true参数来开启Websocket;如果使用反向代理,则要在反向代理里同步开启。 对服务进行反向代理因web页面强制要求使用https访问,建议使用反代套一层https,此处使用nginx proxy manager。 填写好ip和端口,打开Websockets Support和Block Common Exploits,SSL选择证书,打开Force SSL,配置完成。 开始使用点击Create Account创建账号,此时的密码为账号的主密码。进入Settings-Options,更改Language为中文即可。 注意!主密码非常重要!!Bitwarden通过帐号和主密码经算法得到一个值,然后用这个值去加密用户的各个密码,最后储存在服务器上。而加密解密都需要在本地进行,也就是说,黑客即使攻破了服务器,仍无法破解密码数据库。这对我们的密码足够安全,但也意味着你一旦忘记主密码,你所有保存的密码将永远无法访问,所以——请谨慎保管主密码! 功能介绍密码生成器不论是网页版还是客户端,我们都能很容易找到密码生成器,它可以帮我们生成满足要求的随机密码,这对于账号的安全性有很大的提升。 试试你的密码要多久才能被破解?——How Secure Is My Password 匹配模式bitwarden匹配模式十分重要,它决定了你的账号密码何时自动填充到网页中,默认是基础域模式,可以根据自己需求适当调整。各个匹配模式摘录如下: 基础域选择基础域,当登录项目的 URI 值的顶级域名和第二级名与检测到的资源相匹配时,Bitwarden 将弹出提示以提供自动填充。例如,URI 的值为https://google.com,使用基础域匹配检测: URL 自动填充? http://google.com ✔︎ https://accounts.google.com ✔︎ https://google.net ✘ http://yahoo.com ✘ 主机选择主机,当登录项目的 URI 值的主机名和端口(若指定了)与检测到的资源相匹配时,Bitwarden 将弹出提示以提供自动填充。例如,URI 的值为https://sub.domain.com:4000,使用主机匹配检测: URL 自动填充? http://sub.domain.com:4000 ✔︎ https://sub.domain.com:4000/page.html ✔︎ https://domain.com ✘ https://sub.domain.com ✘ https://sub2.sub.domain.com:4000 ✘ https://sub.domain.com:5000 ✘ 开始于选择开始于,当检测到的资源以登录项目的 URI 值开头(无论后面跟什么)时,Bitwarden 将弹出提示以提供自动填充。例如,URI 的值为https://sub.domain.com/path/,使用开始于匹配检测: URL 自动填充? https://sub.domain.com/path/ ✔︎ https://sub.domain.com/path/page.html ✔︎ https://sub.domain.com ✘ https://sub.domain.com:4000/path/page.html(被端口阻断了) ✘ https://sub.domain.com/path(缺少斜杠) ✘ 正则表达式选择正则表达式,当检测到的资源与一个指定的正则表达式相匹配时,Bitwarden 将弹出提示以提供自动填充。正则表达式始终不区分大小写。 不安全示例URI 的值为^https://.*google\\.com$,使用正则表达式匹配检测: URL 自动填充? https://google.com ✔︎ https://sub.google.com ✔︎ https://malicious-site.com?q=google.com ✔︎ http://google.com ✘ https://yahoo.com ✘ 这可能比预期的要匹配得更多。 安全示例URI 的值为^https://[a-z]+\\.wikipedia\\.org/w/index\\.php,使用正则表达式匹配检测: URL 自动填充? https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Bitwarden ✔︎ https://pl.wikipedia.org/w/index.php?title=Specjalna:Zaloguj&returnto=Bitwarden ✔︎ https://en.wikipedia.org/w/index.php ✔︎ https://malicious-site.com ✘ https://en.wikipedia.org/wiki/Bitwarden ✘ 精确选择精确,当登录项目的 URI 值与检测到的资源精确匹配时,Bitwarden 将弹出提示以提供自动填充。例如,URI 的值为https://www.google.com/page.html,使用精确匹配检测: URL 自动填充? https://www.google.com/page.html ✔︎ http://www.google.com/page.html ✘ https://www.google.com/page.html?query=123 ✘ https://www.google.com ✘ 从不选择从不,Bitwarden 将从不为登录项目弹出以提供自动填充。 客户端配置接下来就是要自己的所有设备都能连接到密码库,并时刻更新密码了。此处以chrome扩展为例,其他客户端都大同小异,也就不多言了。 chrome扩展设置在chrome应用商店搜索找到bitwarden,添加并启用。点击左上角设置,在自托管环境-服务器URL处填写自己的反代url,回到主页就能登录了。 点开设置页,将安全-密码库超时时间设置为从不,这样比较方便不需要频繁输入密码解锁。 在设置页,找到其他-选项,点击进入;找到AUTOFILL,勾选自动填充。 结语到这里,本篇教程就已基本结束了。Bitwarden是一款很强大的密码管理平台,本文也只简单介绍了部分基础内容。至于剩下更多功能,就留给各位自己发掘了~ 参考资料部署基于 Rust 的第三方 Bitwarden 服务端容器【保姆级教程】利用宝塔面板+Docker搭建一个优秀的密码管理器——BitwardenBitwarden的安装 – Wenhui’s Rotten PenURI 的使用 - Bitwarden 帮助中心中文版Home · dani-garcia_vaultwarden WikiBitwarden 帮助中心中文版","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://sunjx97.github.io/tags/docker/"},{"name":"密码管理","slug":"密码管理","permalink":"https://sunjx97.github.io/tags/%E5%AF%86%E7%A0%81%E7%AE%A1%E7%90%86/"},{"name":"vaultwarden","slug":"vaultwarden","permalink":"https://sunjx97.github.io/tags/vaultwarden/"},{"name":"bitwarden","slug":"bitwarden","permalink":"https://sunjx97.github.io/tags/bitwarden/"}]},{"title":"陕西广电光猫获取超管密码","slug":"陕西广电光猫获取超管密码","date":"2022-03-11T04:02:32.000Z","updated":"2022-03-31T13:31:53.414Z","comments":true,"path":"posts/96c33dc6/","link":"","permalink":"https://sunjx97.github.io/posts/96c33dc6/","excerpt":"主流的三大运营商(电信、联通、移动)获取光猫超管权限的资料在网上有很多,但如广电之流的破解方法却寥寥无几。如今终于找到了获取广电光猫超管密码的方法,在此分享给大家。","text":"前言主流的三大运营商(电信、联通、移动)获取光猫超管权限的资料在网上有很多,但如广电之流的破解方法却寥寥无几。如今终于找到了获取广电光猫超管密码的方法,在此分享给大家。 本次测试的机型为 HGU B1型家庭网关 型号: GL3100B1 固件版本: V3.0.16353 硬件版本: V20。 教程 使用普通账号密码登录陕西广电光猫后台(此处为http://192.168.1.1/)。 访问http://192.168.1.1/romfile.cfg并下载romfile.cfg文件。 将romfile.cfg文件用VS Code打开(记事本也行)并查找useradmin,web_passwd值即为超级管理员密码(此处即为5802,密码每个人都不一样,请自行获取)。 输入超管账号useradmin和密码5802,可见已经登录到维护后台,接下来就愉快地折腾吧~ 参考资料如何破解光猫,获取超级管理员账户和密码","categories":[{"name":"家庭网络","slug":"家庭网络","permalink":"https://sunjx97.github.io/categories/%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C/"}],"tags":[{"name":"光猫","slug":"光猫","permalink":"https://sunjx97.github.io/tags/%E5%85%89%E7%8C%AB/"},{"name":"陕西广电","slug":"陕西广电","permalink":"https://sunjx97.github.io/tags/%E9%99%95%E8%A5%BF%E5%B9%BF%E7%94%B5/"}]},{"title":"使用docker搭建webdav应用","slug":"使用docker搭建webdav应用","date":"2022-02-19T04:16:46.000Z","updated":"2022-02-19T06:13:52.995Z","comments":true,"path":"posts/cb46f731/","link":"","permalink":"https://sunjx97.github.io/posts/cb46f731/","excerpt":"一直想搭建好nas的webdav服务,但网上大多数服务都不支持多用户,许多人推荐的 hacdias/webdav 项目也找不到详细的安装教程,也就一直搁置了。如今终于搭建成功,便把个人的搭建流程发出来,希望能帮到有需要的人。","text":"前言一直想搭建好nas的webdav服务,但网上大多数服务都不支持多用户,许多人推荐的hacdias/webdav项目也找不到详细的安装教程,也就一直搁置了。如今终于搭建成功,便把个人的搭建流程发出来,希望能帮到有需要的人。因为我也不大懂也就是刚跑起来,所以有问题的地方请大佬们轻喷orz 搭建教程咱使用的是hacdias大佬的基于Go语言的webdav,项目地址在这里。这里使用官方的docker镜像。 创建配置文件在准备好的目录(本例为/docker/webdav)创建配置文件config.yaml,填入以下内容。 12345678910111213141516171819202122232425262728# 监听任意网卡,多网卡可指定对应ipaddress: 0.0.0.0port: 8081auth: trueprefix: /modify: truerules: []# 跨域设置cors: enabled: true credentials: true allowed_headers: - Depth allowed_hosts: - http://localhost:8081 allowed_methods: - GET exposed_headers: - Content-Length - Content-Range# 用户信息,如果 auth 为 true 生效users: - username: admin password: admin # 配置自己的 webdav 访问范围,此例为 /data 内所有文件 scope: /data 创建容器与多数docker容器创建相同,值得注意的是要将config.yaml所在目录映射进容器,并在启动参数指定config为容器内config.yaml。 参考: 1docker run -d --name webdav-go -v /media:/data/media -v /docker/webdav:/config -p 8081:8081 --restart unless-stopped hacdias/webdav:latest --config /config/config.yaml 目录与端口映射将想要通过webdav访问的目录映射进容器内部/data目录,配置文件目录/docker/webdav映射到容器/config目录,端口8081映射到外部。 启动参数添加启动参数--config /config/config.yaml。portainer-ce安装要在Advanced container settings-Command & logging设置,command设置为override并填入参数。 挂载 webdav推荐使用RaiDrive挂载webdav盘,2020.6.36前的版本没有广告。有需求可自行反代。 参考资料hacdias/webdav: Simple Go WebDAV server.记录一次NAS系统崩溃","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"webdav","slug":"webdav","permalink":"https://sunjx97.github.io/tags/webdav/"},{"name":"docker","slug":"docker","permalink":"https://sunjx97.github.io/tags/docker/"}]},{"title":"使用frp和Shadowsocks实现安全访问内网服务","slug":"使用frp和shadowsocks实现安全访问内网服务","date":"2022-02-16T11:19:23.000Z","updated":"2022-03-11T04:07:11.630Z","comments":true,"path":"posts/264d1c83/","link":"","permalink":"https://sunjx97.github.io/posts/264d1c83/","excerpt":"初期自建服务器进度完成后,第二步便是实现外网对内网服务的访问(不然岂不是太过鸡肋w)。但苦于总是找不到个万全的方法,因而一直处于搁置状态。如今看到b站 @靛青K 大佬通过ss实现内网服务安全访问的方法,咱灵光一闪,想到通过frp解决没有公网ip问题,进而通过ss实现内网安全访问的思路,于是便有了这篇文章——","text":"前言初期自建服务器进度完成后,第二步便是实现外网对内网服务的访问(不然岂不是太过鸡肋w)。但苦于没有公网ip,传统内网穿透(如frp)把自身服务公开到公网又觉得太不安全,zerotier虚拟局域网又要频繁切换vpn很不方便,总是找不到个万全的方法,因而一直处于搁置状态。如今看到b站@靛青K大佬通过ss实现内网服务安全访问的方法,咱灵光一闪,想到通过frp解决没有公网ip问题,进而通过ss实现内网安全访问的思路,于是便有了这篇文章—— 主体思路通过clash实现基于域名的分流,当匹配到特定域名后缀后将流量发往ss服务端,ss服务端通过frp实现内网穿透,从而实现安全而又便捷的内网访问功能。相较于传统公网ip和frp在公网暴露服务的风险隐患,本方法只允许知晓ss账号的人通过ss访问内网服务,而相对于zerotier则连通性更好,还免去了zerotier和clash不能共存的麻烦,方便很多。 流量整体转发路径如下外网访问 => clash规则匹配分流(ss客户端) => frps => frpc => ss服务端 => (ADGuard Home 自建DNS) => 反向代理服务器 => 目标服务 Shadowsocks 服务端搭建本人使用Shadowsocks-rust版本,通过docker安装。其中【宿主机地址】替换为本地保存ss配置文件的目录。 1docker run -d -p 9000:9000 -p 9000:9000/udp --name shadowsocks-rust --restart=always -v 【宿主机目录】:/etc/shadowsocks-rust teddysun/shadowsocks-rust 在【宿主机目录】下新建config.json文件,内容如下。password0替换为你的密码,键dns的值192.168.1.1替换为你的dns服务器地址。method的值aes-256-gcm换为你的加密方式(用咱这个就行,不用动)。 1234567"server":"0.0.0.0","server_port":9000,"password":"password0","timeout":300,"method":"aes-256-gcm","dns":"192.168.1.1","mode":"tcp_and_udp" 重启shadowsocks-rust服务,ss服务端设置完成。 使用frp实现内网穿透建立frp隧道推荐使用SAKURA FRP提供的免费内网穿透服务,普通用户能通过签到每日免费获取流量,内网服务的简单访问足够了(大流量或对网络要求更高的用户请自行购买流量包和VIP)。 (申请账号后)登录进入主面版,点击穿透-节点状态查看所有节点。免费用户节点有限,挑个能用的国内节点就行。 转到用户-用户信息-账号信息处,找到访问密钥,记录备用。 通过id(上面节点#后即为id)选取节点,转到穿透-隧道列表-新建隧道创建隧道。选择穿透节点,tcp、udp隧道各创建一个。隧道名随意设置,本地ip为ss服务器ip,本地端口均为9000(与上面ss的配置文件一致),穿透节点、远程端口均一致,开启压缩和加密。 创建完成后,在隧道列表页获取隧道id。 点其中一条隧道最后三个点(操作项),选择配置文件,找到[common]下server_addr项,复制frp服务器地址备用。 通过docker安装frpc因为使用的是SAKURA FRP提供的服务,所以这里不能使用官方版frpc,应在dockerhub拉取natfrp/frpc镜像。 注意不同于官方frpc,natfrp使用用户密钥和隧道id拉取配置文件,所以要设置启动参数。格式为<启动密钥>:<隧道ID1>,隧道ID2,隧道ID3,...,其中启动密钥即上一步的访问密钥,隧道id即上一步的两个隧道id。 使用命令行安装如下: 1docker run -d --name frpc-natfrp --restart=always natfrp/frpc -f <启动参数> 使用portainer-ce安装也可,值得注意的是运行时参数设置在Advanced container settings-Command & logging设置,command设置为override并填入参数,如下图。 clash根据规则分流我使用subconverter生成包含自定义规则的配置文件,subconverter可以自己搭建也能用别人搭好的,这里推荐一个ACL4SSR 在线订阅转换。远程配置使用自己的配置文件模板(可以参考大佬的模板),在ruleset和proxy_group对应添加节点和规则。配置完成后转换合并订阅即可。 subconverter 配置文件模板subconverter可以通过设置远程配置实现定制自己需要的规则分流。咱这里使用GitHub存储远程配置文件。这里推荐直接复制大佬的模板,然后在此基础上修改。 推荐几个基础模板:ACL4SSR_Online 默认版 分组比较全(与Github同步)ACL4SSR_Online_Full 全分组 重度用户使用(与Github同步) subconverter订阅转换设置细则可参考官方使用文档,这里只讲本教程需要的内容。 Github 创建仓库(注册并)登录Github,创建仓库,创建远程配置文件config.ini。这里太过简单直接跳过罢 ruleset 设置咱这里使用GitHub保存规则文件,同仓库下创建ruleset.list,填入要匹配的的域名或ip。具体规则在这里。我们这里直接填DOMAIN-SUFFIX,your-domain.com,将your-domain.com替换为你的域名,此行意为以your-domain.com为后缀的域名被匹配。最后保存,点击Raw获得真实地址。 复制大佬的配置模板,在配置模板中增加以下一行,=后面替换为你的proxy_group名称+规则地址。proxy_group和ruleset名称必须完全一致,否则会报错。注意,规则从上往下匹配,所以最好添加到一列ruleset的最上方。 1ruleset=🏠 家庭内网,https://raw.githubusercontent.com/your_account/your_project/main/rulesets/ruleset.list 该条的含义是:从ruleset.list拉取规则,并将匹配到的流量使用🏠 家庭内网中选中的节点转发。 proxy_group 设置在配置模板中增加以下一行,将GROUPID=3的3换成自己订阅链接/节点的序号(序号从0开始计算)。 1custom_proxy_group=🏠 家庭内网`select`!!GROUPID=3`[]DIRECT`http://www.gstatic.com/generate_204`60,5,50 该条的含义是:创建一个名为🏠 家庭内网的代理组,使用select模式,添加第4条订阅和DIRECT到该节点组,延迟测速周期60秒,5秒未响应即为超时,延迟容差为50ms。 获取远程配置地址以上两处修改完成后,GitHub创建的远程配置文件页点击Raw获取真实地址。 Shadowsocks 节点链接生成一般使用的ss链接都经过了base64加密,我们这里先生成未加密的节点链接,再加密。 获得未加密的ss链接模板:method:password@hostname:port。 method是你的ss的加密方式,password是上面设置的密码,hostname和port是上面frp服务的地址和远程端口,分别替换对应内容。替换后示例aes-256-gcm:barfoo@hostname:8388。 通过base64加密获得ss链接通过这里可以便捷地实现base64加密,然后加上ss://大功告成,可以额外添加#节点名称来给自己的ss节点命名。 通过 subconverter 生成全新订阅使用推荐的ACL4SSR 在线订阅转换生成全新订阅。在订阅链接处按次序填好机场订阅链接和ss链接,在订阅转换的远程配置处粘贴上面得到的远程配置地址,点生成订阅链接即可。 DNS 服务器设置这里使用ADGuard Home做DNS服务,ADGuard Home的DNS重写可以看作自定义hosts功能。选择过滤器-DNS重写,添加DNS重写,ip为反向代理服务器的ip。ADGuard Home这里支持泛域名,好评! 这样所有对该域名的DNS请求都会将目标指向反向代理服务器所在ip,DNS设置完毕。 内网流量转发设置现在,你已经可以实现外网访问本地内网服务了。但内网设备clash也会绕这么大一圈来访问内网服务,这不符合我们的初衷。这就需要我们对内网流量转发做额外设置,假装在这个过程中访问了frp服务器并成功转发流量。 DNS 服务器设置梅开二度,我们又回到了DNS重写,添加域名为frp服务器的域名,ip为反代服务器的ip。 反代设置 Streams 流量转发这里通过Nginx Proxy Manager设置,没有搭建的同学可以查看咱之前的搭建教程:《使用docker搭建nginx proxy manager实现反向代理和SSL证书申请》。 Nginx的Stream模块工作在第四层,我们可以用来转发tcp、udp数据包。登录管理页面,点击Streams-Add Stream,Incoming Port填frp隧道的远程端口,Forward Host填ss服务端的ip,Forward Port填ss服务端的端口(即上面设置的9000)。 结语至此,本教程终于结束了。对于内外网两栖的设备在节点组需要选择自己的ss节点,而内网设备直接选择DIRECT即可,DNS和反代服务器会将流量转发到正确的服务ip和端口。相对于@靛青K大佬直接使用ddns和公网ip搭建ss服务端,这个方法肯定麻烦许多,但对于当前ipv6未全面铺开的情况和大内网的我来说,终归是够用了。所以ipv6时代什么时候来啊(#`O′)/ 参考资料使用 Shadowsocks 访问家庭内网使用 docker 管理 frpc 运行 - SAKURA FRPsubconverter 官方使用文档规则编辑 - Clash for Windowsshadowsocks 生成二维码 URIURI与二维码 - shadowsocks-libev","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"内网穿透","slug":"内网穿透","permalink":"https://sunjx97.github.io/tags/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"},{"name":"frp","slug":"frp","permalink":"https://sunjx97.github.io/tags/frp/"},{"name":"Shadowsocks","slug":"Shadowsocks","permalink":"https://sunjx97.github.io/tags/Shadowsocks/"}]},{"title":"解决transmission使用网络共享的监控目录时的监控失灵问题","slug":"解决transmission使用网络共享的监控目录时的监控失灵问题","date":"2022-01-07T15:11:08.000Z","updated":"2022-02-18T12:45:23.855Z","comments":true,"path":"posts/7133bd05/","link":"","permalink":"https://sunjx97.github.io/posts/7133bd05/","excerpt":"Linux下使用transmission时,其监控文件夹功能会在监控smb共享文件夹时失效。","text":"前言transmission可以通过设置watch监控文件夹来自动添加监控目录内的种子,但如果监控文件夹是smb共享,则会出现失灵的现象(即只在开启或重启时添加一次目录内的种子)。本人使用NAS集中管理自己的数据,docker版transmission也是映射的主机挂载的smb共享文件夹,便出现了日常使用不自动添加种子的问题。 问题原因transmission在Linux下默认使用inotify监控监控目录,而inotify不对cifs共享有效。 解决方案在配置文件目录的settings.json加入下行即可。 1"watch-dir-force-generic": true, 参考资料Watch-dir on network folder","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"transmission","slug":"transmission","permalink":"https://sunjx97.github.io/tags/transmission/"},{"name":"pt","slug":"pt","permalink":"https://sunjx97.github.io/tags/pt/"},{"name":"smb","slug":"smb","permalink":"https://sunjx97.github.io/tags/smb/"}]},{"title":"解决通过fstab开机挂载smb文件夹导致的Database is locked问题","slug":"解决通过fstab开机挂载smb文件夹导致的Database-is-locked问题","date":"2022-01-04T05:38:54.000Z","updated":"2022-02-18T12:45:23.859Z","comments":true,"path":"posts/cbb0bc9e/","link":"","permalink":"https://sunjx97.github.io/posts/cbb0bc9e/","excerpt":"发现在使用fstab开机挂载时,使用sqlite的数据库,有时会导致Database is locked问题,这时需要通过添加参数来解决。","text":"前言发现在使用fstab开机挂载的smb文件夹会有Database is locked的问题,如通过docker安装的nginx-proxy-manager和qiandao,映射的文件夹是smb(cifs)共享挂载的,因为默认使用了sqlite的数据库,会导致Database is locked问题,如下图: 解决方案在挂载时加入nolock参数即可。 1//myserver /mymount cifs username=**,password=**,nolock,uid=1000,gid=1000 参考资料Database is locked","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://sunjx97.github.io/tags/docker/"},{"name":"smb","slug":"smb","permalink":"https://sunjx97.github.io/tags/smb/"},{"name":"sqlite","slug":"sqlite","permalink":"https://sunjx97.github.io/tags/sqlite/"}]},{"title":"蜗牛星际A款机箱的六盘位改造","slug":"蜗牛星际A款机箱的六盘位改造","date":"2022-01-01T12:46:11.000Z","updated":"2022-02-18T12:45:23.850Z","comments":true,"path":"posts/b040efc9/","link":"","permalink":"https://sunjx97.github.io/posts/b040efc9/","excerpt":"蜗牛星际A款机箱改造6盘位(4个3.5寸盘位+2个2.5寸盘位)","text":"前言距离改造已经过去很久了,直到现在才发出来_(:3」∠)_ 教程因为蜗牛星际A款机箱本来就带一个2.5寸硬盘位(机箱内部),所以只要再扩展出一个2.5寸硬盘位即可。 用到了一个2.5寸硬盘支架,购买链接在这里,购买半高PCIe款。 使用的螺丝购买链接在这里,规格为M3,建议买短点。 先用四个螺丝将支架和硬盘固定(硬盘有一面有四个螺丝孔),我这边买的螺丝比较长,所以用螺母当垫片使用。 因为螺丝本身有厚度,所以支架最底下那个盘位要空出来,直接在第二个盘位安装2.5寸硬盘即可。 成品如图: 大概只能扩充到2个2.5寸盘位,毕竟离机箱壁太近了。 注意事项机箱内部的2.5寸盘位因为要将4个螺丝孔那面对外,所以对硬盘厚度有要求,建议厚盘装在外面。","categories":[{"name":"DIY","slug":"DIY","permalink":"https://sunjx97.github.io/categories/DIY/"}],"tags":[{"name":"蜗牛星际","slug":"蜗牛星际","permalink":"https://sunjx97.github.io/tags/%E8%9C%97%E7%89%9B%E6%98%9F%E9%99%85/"},{"name":"DIY","slug":"DIY","permalink":"https://sunjx97.github.io/tags/DIY/"}]},{"title":"使用docker搭建nginx proxy manager实现反向代理和SSL证书申请","slug":"使用docker搭建nginx-proxy-manager实现反向代理和SSL证书申请","date":"2022-01-01T03:12:37.000Z","updated":"2022-07-10T02:59:53.542Z","comments":true,"path":"posts/233f7ebd/","link":"","permalink":"https://sunjx97.github.io/posts/233f7ebd/","excerpt":"自从入坑NAS以来,(黑)群晖一直都是我文件存储管理的得力助手。但随着我的学习和理解不断加深,黑裙已不能满足我的需求。如今,是时候告别(黑)群晖,往更专业的自建服务器方向发展了。其中关键的一步,便是找到能方便替换群晖反向代理服务的开源项目,而nginx proxy manager给了我一个很好的选择。","text":"前言自从入坑NAS以来,(黑)群晖一直都是我文件存储管理的得力助手。但随着我的圈内吹水日益熟练学习和理解不断加深,黑裙已不能满足我的需求。如今,是时候告别(黑)群晖,往更专业的自建服务器方向发展了。其中关键的一步,便是找到能方便替换群晖反向代理服务的开源项目,而nginx proxy manager给了我一个很好的选择。 nginx proxy manager介绍nginx proxy manager能让我们轻松地转发到在家里或其他地方运行的网站,包括免费的SSL,而不需要对Nginx或Letsencrypt了解太多。便捷直观的web页面管理和操作无疑大大简化了一般nginx反代服务的步骤。 docker安装nginx proxy manager推荐使用docker-compose安装 12345678910111213141516171819202122232425version: "3"services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: # These ports are in format <host-port>:<container-port> - '80:80' # Public HTTP Port - '443:443' # Public HTTPS Port - '81:81' # Admin Web Port # Add any other Stream port you want to expose # - '21:21' # FTP # Uncomment the next line if you uncomment anything in the section # environment: # Uncomment this if you want to change the location of # the SQLite DB file within the container # DB_SQLITE_FILE: "/data/database.sqlite" # Uncomment this if IPv6 is not enabled on your host # DISABLE_IPV6: 'true' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt 浏览器输入【docker主机ip:81】,成功进入web页面,初次登录使用邮箱:admin@example.com,密码:changeme。 登录进去后会让你设置管理员的用户名(Full Name),昵称(Nickname)和邮箱。 接下来设置密码,旧密码即预设密码changeme。 至此,nginx proxy manager初始化完成。 使用nginx proxy manager实现反向代理登录进入主面版,点击Proxy Hosts转到反向代理设置界面。 点击Add Proxy Host,添加一个反向代理。 在Details页面,Domain Names填写你的域名,Scheme填写反代对象的协议(http/https),Forward Hostname/IP填写反代对象的地址,Forward Port填写反代对象的端口号。 Domain Names - 填写需要反代的域名Scheme - 选择来源的协议Forward Hostname / IP - 填写来源的主机名或IPForward Port - 填写来源的端口Cache Assets - 是否启用缓存Block Common Expoits - 阻止常见的漏洞Websockets Support - 是支援 WebsocketsAccess List - 权限列表选择,可以给反代的网页设置账户密码,验证通过后才能正常打开 如果有https加密需求,转到SSL页面,将SSL Certificate选择为你申请的证书,建议勾选SSL Force(强制SSL)。 点击保存,在反向代理页面可以看到刚刚设置的反向代理。 测试相应网站,反代成功。 SSL证书申请HTTP-01 验证方式最简单常规的SSL证书申请方式,如果你的主机可以放行80端口(如在各大公有云处购买的主机),推荐使用这种方式。我这边没有虚拟主机,家用80端口也被封锁了,所以也没用过这种方式,姑且放在这里给大家参考_(:3」∠)_ 转到反代编辑页面,在SSL页面选择Request a new SSL Certificate,建议勾选SSL Force(强制SSL),打开勾选I Agree to the Let’s Encrypt Terms of Service同意Let’s Encrypt相关条款,点击保存。 可以看到反代已自动申请SSL证书,可以通过https访问了。证书有效期3个月,到期会自动续期。 DNS-01 验证方式因为国内ISP一般都封锁了80端口,所以HTTP-01验证方式大概率在家庭自建服务器的情况下不会成功。作为替代,我们可以选择使用DNS-01的验证方式来申请SSL证书。相较于HTTP-01,DNS-01可以申请支持通配符的域名证书,也算弥补了其操作繁琐的缺点。这里以DNSPOD和CloudFlare为例: · DNSPOD1. 申请api key首先登录DNSPOD控制台,在右上角找到 API密钥 项。 转到 DNSPod Token 页面,点击创建密钥。 设置密钥名称 查看并保存ID和Token项,这里的内容只会显示一次,一定要保存好。 已经能在总览看到相关API已申请成功。 2. 配置nginx proxy manager并申请SSL证书点击SSL Certificates,转到SSL Certificates页面;再点击右上角Add SSL Certificate,选择Let’s Encrypt。 如下图,Domain names填写自己的域名,Email Address for Let’s Encrypt填写自己的邮箱。 打开Use a DNS Challenge,DNS Provider选择DNSPod,将dns_dnspod_email中的email@example.com替换为DNSPod的邮箱,dns_dnspod_api_token中的id,key对应填入(即在上一步申请得到的id和token),注意不要删掉英文双引号,且id与token用英文逗号连接。 12dns_dnspod_email = "[email protected]"dns_dnspod_api_token = "id,key" 勾选I Agree to the Let’s Encrypt Terms of Service同意Let’s Encrypt相关条款,点击保存。 可以看到SSL证书已经申请完成,有效期3个月,到期会自动续期。 · CloudFlare1. 获取api key打开个人资料-API令牌,找到API 密钥,查看并复制Global API Key。 2. 配置nginx proxy manager并申请SSL证书同上,不过要将申请信息进行替换(初始的只有api token的形式申请会有问题)。something@hotmail.com替换为cloudflare的邮箱,0123456789abcdef0123456789abcdef01234567替换为上面得到的Global API Key。 123# Cloudflare API tokendns_cloudflare_email = [email protected]_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567 附录需要开启Websockets Support的应用/网站Proxmox VE:不开启会导致novnc连接错误jlesage/jdownloader-2:不开启会无法进入webui管理页面truenas:不开启会导致webui无法登录portainer/portainer-ce:不开启无法对容器使用console 参考资料Nginx Proxy Manager验证方式 - Let’s Encrypt【Docker系列】一个反向代理神器——Nginx Proxy Manager【Docker系列】一个反向代理神器——Nginx Proxy Managercertbot dns插件Cannot get Let’s Encrypt cert via cloudflare dns challange使用Docker安裝Nginx-ProxyManager進行SSL反向代理","categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"}],"tags":[{"name":"反向代理","slug":"反向代理","permalink":"https://sunjx97.github.io/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/"},{"name":"SSL","slug":"SSL","permalink":"https://sunjx97.github.io/tags/SSL/"}]},{"title":"Transmission 2.94升级3.00 跳过启动校验","slug":"Transmission-2-94升级3-00-跳过启动校验","date":"2021-12-18T12:13:22.000Z","updated":"2022-03-11T04:11:21.421Z","comments":true,"path":"posts/402aacbe/","link":"","permalink":"https://sunjx97.github.io/posts/402aacbe/","excerpt":"将transmission升级到了3.00,发现每次启动都会对升级前的旧种子重新校验,然后就是数十个小时的校验过程,实在让人头大。经过多次尝试,终于找到可以跳过启动校验(只校验一次)的方法了,现记录如下。","text":"前言将transmission升级到了3.00,发现每次启动都会对升级前的旧种子重新校验,然后就是数十个小时的校验过程,实在让人头大。经过多次尝试,终于找到可以跳过启动校验(只校验一次)的方法了,现记录如下。 教程transmission在3.00使用40位hash记录种子文件的信息(之前是16位),在torrents和resume文件夹中新生成的文件都是用40位hash值命名的。要解决每次启动都重复校验的问题,需要将旧种子的信息更新。主要有以下几步: 等待transmission第一次校验完生成新的40位hash命名的resume文件并将旧种子的的resume文件删除 将对应的旧种子的torrent文件更名为相同的40位hash。 等待初次校验完成 等待校验完成并删除旧resume文件(很好分辨,2.94版本是【种子名+前16位hash】的命名方式,而3.0版本生成的新resume文件都是【40位hash】命名方式) 对旧torrent文件重命名停止docker中的transmission服务,将旧torrent文件重命名为新40位hash形式。因为旧torrent文件名称包含前16位hash,所以可以直接将16位hash字符串与resume文件夹内所有文件进行匹配,如果匹配上前16位,则修正命名。 写了段代码解决命名问题: 123456789101112131415161718192021222324252627import osimport retorrents_src = input('请输入torrents文件夹绝对路径:')resume_src = input('请输入resume文件夹绝对路径:')torrent_list = os.listdir(torrents_src)resume_list = os.listdir(resume_src)count = 0for torrent in torrent_list: # 从16位hash值开始,到后缀名结束 # 如果是新版文件40位hash,则会截取后16位,在下面match起始位置匹配匹配失败 pattern = torrent[-24:-8] for resume in resume_list: if re.match(pattern, resume[:-7], re.I): print('Ok, find the files!') print('torrent:', torrent) print('resume:', resume) os.rename(torrents_src+'\\\\'+torrent, torrents_src+'\\\\'+resume[:-7]+'.torrent') print(f'{torrent} 已更名为 {resume[:-7]}.torrent') print('==========================') count += 1print(f'已成功命名{count}个种子文件') 运行结果如下,一切顺利。 启动transmission,可以看到已经没有在校验了。 注意事项 在操作前备份好torrents和resume文件夹 初次校验完成后建议停止transmission服务后再操作。 参考资料【原创】Transmission 手动跳过校验 教程.mdMove a half downloaded file from Android to Windows/LinuxReinstall Transmission and moving data to avoid torrent recheck","categories":[{"name":"pt","slug":"pt","permalink":"https://sunjx97.github.io/categories/pt/"}],"tags":[{"name":"transmission","slug":"transmission","permalink":"https://sunjx97.github.io/tags/transmission/"},{"name":"pt","slug":"pt","permalink":"https://sunjx97.github.io/tags/pt/"}]}],"categories":[{"name":"selfhosted","slug":"selfhosted","permalink":"https://sunjx97.github.io/categories/selfhosted/"},{"name":"家庭网络","slug":"家庭网络","permalink":"https://sunjx97.github.io/categories/%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C/"},{"name":"DIY","slug":"DIY","permalink":"https://sunjx97.github.io/categories/DIY/"},{"name":"pt","slug":"pt","permalink":"https://sunjx97.github.io/categories/pt/"}],"tags":[{"name":"transmission","slug":"transmission","permalink":"https://sunjx97.github.io/tags/transmission/"},{"name":"docker","slug":"docker","permalink":"https://sunjx97.github.io/tags/docker/"},{"name":"Shadowsocks","slug":"Shadowsocks","permalink":"https://sunjx97.github.io/tags/Shadowsocks/"},{"name":"Openwrt","slug":"Openwrt","permalink":"https://sunjx97.github.io/tags/Openwrt/"},{"name":"ipv6","slug":"ipv6","permalink":"https://sunjx97.github.io/tags/ipv6/"},{"name":"ddns","slug":"ddns","permalink":"https://sunjx97.github.io/tags/ddns/"},{"name":"防火墙","slug":"防火墙","permalink":"https://sunjx97.github.io/tags/%E9%98%B2%E7%81%AB%E5%A2%99/"},{"name":"端口转发","slug":"端口转发","permalink":"https://sunjx97.github.io/tags/%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/"},{"name":"密码管理","slug":"密码管理","permalink":"https://sunjx97.github.io/tags/%E5%AF%86%E7%A0%81%E7%AE%A1%E7%90%86/"},{"name":"vaultwarden","slug":"vaultwarden","permalink":"https://sunjx97.github.io/tags/vaultwarden/"},{"name":"bitwarden","slug":"bitwarden","permalink":"https://sunjx97.github.io/tags/bitwarden/"},{"name":"光猫","slug":"光猫","permalink":"https://sunjx97.github.io/tags/%E5%85%89%E7%8C%AB/"},{"name":"陕西广电","slug":"陕西广电","permalink":"https://sunjx97.github.io/tags/%E9%99%95%E8%A5%BF%E5%B9%BF%E7%94%B5/"},{"name":"webdav","slug":"webdav","permalink":"https://sunjx97.github.io/tags/webdav/"},{"name":"内网穿透","slug":"内网穿透","permalink":"https://sunjx97.github.io/tags/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"},{"name":"frp","slug":"frp","permalink":"https://sunjx97.github.io/tags/frp/"},{"name":"pt","slug":"pt","permalink":"https://sunjx97.github.io/tags/pt/"},{"name":"smb","slug":"smb","permalink":"https://sunjx97.github.io/tags/smb/"},{"name":"sqlite","slug":"sqlite","permalink":"https://sunjx97.github.io/tags/sqlite/"},{"name":"蜗牛星际","slug":"蜗牛星际","permalink":"https://sunjx97.github.io/tags/%E8%9C%97%E7%89%9B%E6%98%9F%E9%99%85/"},{"name":"DIY","slug":"DIY","permalink":"https://sunjx97.github.io/tags/DIY/"},{"name":"反向代理","slug":"反向代理","permalink":"https://sunjx97.github.io/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/"},{"name":"SSL","slug":"SSL","permalink":"https://sunjx97.github.io/tags/SSL/"}]}