首页
关于
Search
1
AdGuardHome 安装及部署教程
40,707 阅读
2
搭建基于telegram的无限网盘
10,100 阅读
3
关于微软Azure学生白嫖指南
9,714 阅读
4
Oracle开放全部端口并关闭防火墙
9,497 阅读
5
最新Cloudflare免费自选IP教程(非Partner)
9,329 阅读
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
登录
Search
标签搜索
docker
张至顺
PHP
图床
Cloudflare
金刚长寿功
PT
qBittorrent
阿里云
onedrive
telegram
代理
青龙
python
内网穿透
一键
telegraph
ipv6
cf_workers
serv00
myedunote
累计撰写
101
篇文章
累计收到
1
条评论
首页
栏目
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
页面
关于
搜索到
84
篇与
技术搬砖
的结果
2023-12-03
Linux挂载硬盘并自启动
一、查看当前已经分配磁盘的空间情况df -hroot@******# df -h Filesystem Size Used Avail Use% Mounted on udev 126G 0 126G 0% /dev tmpfs 26G 35M 26G 1% /run tmpfs 126G 0 126G 0% /dev/shm /dev/sdb1 454G 31G 401G 8% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 126G 0 126G 0% /sys/fs/cgroup tmpfs 26G 28K 26G 1% /run/user/117 tmpfs 26G 28K 26G 1% /run/user/1000发现新加的硬盘并没有挂载上来, 其中,系统默认磁盘是在/dev/sdb1上二、查看当前磁盘的大小fdisk -lroot@****# fdisk -l Disk /dev/sda: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdb: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe8caedc1 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 968802303 968800256 462G 83 Linux /dev/sdb2 968804350 976771071 7966722 3.8G 5 Extended /dev/sdb5 968804352 976771071 7966720 3.8G 82 Linux swap / Solaris其中/dev/sda磁盘发现并未使用三、对该磁盘进行分区并格式化fdisk /dev/sda1、通过提示,command,输入m2、根据提示,输入n,新增一个分区这里的 /dev/sda 是步骤(1)中 查询出来的硬盘识别文件地址。如果你在步骤(1)中要格式化的硬盘存在于其他地址请相应改变。在提示信息引导下,我选择(n) “add a new partition” 将硬盘划分为一个新分区。然后选择(e) “extended” 作为扩展分区。因为我整个硬盘只作为一个分区,所以接下来的Partition number,我默认(1)。指定柱面直接默认回车,接下来其他操作也默认回车即可,如果自己有需求自行按照说明选择。最后再输出(p)确认下自己创建的分区表信息是否正确。确认无误后(w)保存。*如果成功,系统会提示“The partition table has been altered” 分区表已更改完毕 。*3、再次查看磁盘分区情况,已经有一个/dev/sda1的磁盘fdisk -l4、对磁盘进行格式化,使用ext4格式,该操作耗时几分钟,耐心等待结束;mkfs -t ext4 /dev/sda1四、挂载新硬盘到文件目录1、新建文件夹我将其保存在本地用户目录下新建文件夹中。创建文件夹命令样例为:mkdir <文件夹路径>2 、挂载硬盘到目录mount /dev/sda1 <文件夹路径>但是发现文件夹权限不足,因此赋予其和其他普通文件夹相同权限:chmod 777 <文件夹路径>权限如有需求相应调整,777是最高权限,然后进入文件夹新硬盘已经可以正常操作使用。五、开机自动挂载1、查看硬盘UUID:blkid这里/dev/vda1的UUID为468f89f6-32b7-432f-bd98-34d6fd8ad375,文件系统类型为ext42、向/etc/fstab写入文件系统的信息echo UUID=468f89f6-32b7-432f-bd98-34d6fd8ad375 <挂载文件夹路径> ext4 defaults 0 0 >> /etc/fstab3、查看新分区信息cat /etc/fstab最后reboot重启,验证开机是否自动挂载
2023年12月03日
91 阅读
0 评论
0 点赞
2023-11-28
搭建一个自己的IP信息工具箱
这是一个完全开源的 IP 信息查看器,可以查询本机 IP、查询任意 IP、查询国内外网站可用性等。这是我第一次用 Vue.js 练手的项目。如果你看着 https://ip.skk.moe 眼馋,那就用这个程序搭建一个属于自己的吧。主要功能看自己的 IP:从多个 IPv4 和 IPv6 来源检测显示本机的 IP看 IP 信息:显示所有 IP 的相关信息,包括国家、地区、ASN、地理位置等可用性检测:检测一些网站的可用性:Google, Github, Youtube, 网易, 百度等WebRTC 检测:查看使用 WebRTC 连接时使用的 IPDNS 泄露检测:查看 DNS 出口信息,以便查看在 VPN/代理的情况下,是否存在 DNS 泄露隐私的风险暗黑模式:根据系统设置自动切换暗黑/白天模式,也可以手动切换简约模式:为移动版提供的专门模式,缩短页面长度,快速查看最重要的信息查任意 IP 信息:可以通过小工具查询任意 IP 的信息根据可用性检测结果,返回目前是否可以访问全世界网络的提示搭建教程建立站点 我这里用的是宝塔面板,其他面板或者裸 nginx 自行添加即可。填写你的域名,并且做好解析和 SSL 证书。注意这里 PHP 版本选择纯静态即可,因为此项目是一个 Vue.JS 纯前端项目,不涉及 PHP。2.上传源代码源代码下载地址: https://github.com/jason5ng32/MyIP远程 URL 直链: https://github.com/jason5ng32/MyIP/archive/refs/heads/main.zip进入到网站根目录,删除掉宝塔自动创建的文件后下载代码包。我的服务器是有宝塔面板,所以我这里直接使用 远程下载 功能。3.解压代码,安装步骤即完成。非常简单,开箱即用。4.访问你的解析域名地址 查看预览效果。优化调整对接 Bing Map也可以选择使用对接 Google Map 是永久免费的,但是 Google Maps 因为长城的缘故也无法国内使用。所以我选择去申请一个 Bing Maps 的 API,也是免费的,但是一年只能发起 12 万次请求,个人公益使用完全够用。如果想做更大的请求的话,去使用 Google Map 或者国内的 API 吧~a.进入到 Bing Maps 官网,使用 Microsoft 登录,但是注意 Bing 是单独的部门,还是要注册的。b.注册登录之后来到 My Keys 选项卡。 c.填写信息创建一个 key。d.复制 Key 并且添加到 app.js 中。e.现在我们就可以在主界面中看到地图了。2、IP数据显示错误这应该是一个小 Bug,原作者的编写平台可能是 MacOS,这是一个 emoji 表情,但是在 Windows 平台上会显示一个小方块。解决办法也很简单,在 index.html 中搜索 IP 数据。将
2023年11月28日
381 阅读
0 评论
2 点赞
2023-11-26
Debian一键换源
一键切换国内源网站教程:网站:https://linuxmirrors.cn/开源:开源:https://github.com/SuperManito/LinuxMirrorsbash <(curl -sSL https://linuxmirrors.cn/main.sh)海外使用:bash <(curl -sSL https://linuxmirrors.cn/main.sh) --abroad 一键安装Docker:bash <(curl -sSL https://linuxmirrors.cn/docker.sh)一键切换官方源cp -r /etc/apt/sources.list /etc/apt/sources.list.bak;echo -e "deb http://deb.debian.org/debian buster main\ndeb-src http://deb.debian.org/debian buster main\ndeb http://security.debian.org/debian-security buster/updates main\ndeb-src http://security.debian.org/debian-security buster/updates main" > /etc/apt/sources.list;cat /etc/apt/sources.list;apt-get update;如果出现问题:1、Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'apt-get --allow-releaseinfo-change update2、GPG error: http://deb.debian.org/debian buster-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131E: The repository 'http://deb.debian.org/debian buster-backports InRelease' is not signed.说明仓库没有签名,缺PUBKEY,按以下方法解决apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUB_KEY1> <PUB_KEY2>……比如上面那个就可以这样:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E1313、添加PUBKEY时提示,gpg: failed to start the dirmngr `'/usr/bin/dirmngr'`: No such file or directory我们只需要在系统上安装dirmngr包apt install dirmngr --install-recommends -y4、如果出现E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation 那你还需要先装个gnupgapt-get install gnupg -y
2023年11月26日
130 阅读
0 评论
0 点赞
2023-11-24
OpenVZ、LXC实现类似dd重装换系统
OpenVZ/LXC作为容器技术是不支持dd重装的,但是可以实现类似dd重装换系统的效果特点支持OpenVZ和LXC虚拟化技术支持Debian/CentOS/Alpine等多种系统的相互转换(及原地tp原理对于容器而言,其内核共享宿主机内核,自身打包了操作系统,应用和函数库等所有依赖。原理上只要替换对应的数据就可以替换系统,只不过要注意操作顺序,避免依赖关系冲突注意会抹除数据,因此如果有重要数据自行备份支持openvz 7,不支持openvz 6仅支持openvz和lxc等容器虚拟化技术,不支持kvm等虚拟机技术使用wget -qO OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutation.sh && chmod u+x OsMutation.sh && ./OsMutation.sh或者curl -so OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutation.sh && chmod u+x OsMutation.sh && ./OsMutation.sh对于磁盘空间小于1GB的VPSwget -qO OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutationTight.sh && chmod u+x OsMutation.sh && ./OsMutation.sh参考文章:https://www.nodeseek.com/post-5159-1开源项目:https://github.com/LloydAsp/OsMutation
2023年11月24日
130 阅读
0 评论
1 点赞
2023-11-23
Podman容器管理搭建教程
什么是 Podmanpodman 是一个用于处理容器的开源 Linux 工具,是一个无守护进程容器引擎,用于在 Linux 系统上开发,管理和运行 Open Container Initiative(OCI)容器。它可以用于管理任何由兼容开放容器倡议的容器引擎(如 Docker)创建的 Linux 容器,Podman 提供了一个与 Docker 兼容的命令行前端,可以简单地为docker命令取别名为podman即可使用,所以说如果你会Docker的话可以轻松上手Podman。Podman 实现了除了 Docker Swarm 的相关指令外几乎所有的 Docker 命令,你可以用他实现除了 Docker Swarm 相关之外的所有 Docker 操作,并且他还是一个“无守护进程容器引擎”,这就意味着你可以脱离 Docker daemon, 不需要执行 systemctl start docker 了安装启动CentOS 8已经内置Podman,CentOS 7下需要自行安装。CentOS 7可以使用yum命令安装Podman;yum -y install podman安装成功后使用如下命令启动podman服务。systemctl start podmanpodman的镜像源机制引入了一个注册表的机制, 要将镜像源在文件/etc/containers/registries.conf中注册后才能使用国内直接用 podman pull 拉取镜像会很慢,所以需要配置国内镜像源来加速访问1.获取阿里的镜像源地址你只需要登录阿里云的容器 Hub 服务 https://cr.console.aliyun.com 的控制台,使用你的支付宝 帐号,第一次登录时,需要设置一个独立的密码,左侧的加速器帮助页面就会显示为你独立分配的加速地址。2.修改Podman的注册表配置文件vim /etc/containers/registries.conf修改内容unqualified-search-registries = ["docker.io"]增加内容[[registry]] prefix = "docker.io" insecure = false blocked = false location = "d1234.mirror.aliyuncs.com" [[registry.mirror]] location = "hub-mirror.c.163.com" [[registry.mirror]] location = "registry.docker-cn.com"3、重启podmansystemctl restart podman常用命令podman images查看正在运行的容器列表podman ps podman ps -a //所有容器可删除正在运行容器podman rm -f id安装 cockpit更新软件源apt update apt upgrade默认情况下,Cockpit 软件包在 Debian 11 默认存储库中可用。现在我们运行以下命令将 Cockpit 安装到您的 Debian 系统:apt install cockpityum -y install cockpit cockpit-podman cockpit-dashboard cockpit-storaged cockpit-packagekit安装 cockpit 及其依赖项后,使用以下systemctl命令启动其服务:systemctl start cockpit systemctl enable cockpit systemctl status cockpit成功安装后,打开 Web 浏览器并使用 URL 访问 Cockpit Web 界面。您应该会看到 Cockpit 登录页面:http://your-server-ip-address:9090我们将被要求输入登录详细信息,以便将它们输入到仪表板中。在这里,用户名和密码与我们用于登录 Linux 服务器的登录详细信息相同。
2023年11月23日
266 阅读
0 评论
0 点赞
2023-11-22
自建Sub-Store订阅管理转换教程
Github Peng-YM大佬的Sub-Store提供了几乎全平台的代理转换,Loon、Surge等可以安装其提供的模块直接使用,本教程是将Sub-Store搭建为网站,更方便clash等使用一、前期准备域名,托管到 cloudflare(其它地方也行,但是 CF 相对比较方便)证书,免费证书三个月,自动续订即可服务器vps,配置高点,不要太低服务器需要安装好nginx,建议小白安装好宝塔面板,部署好基本环境二、部署过程1、域名设置在 cloudflare 的域名 DNS 记录里面添加两个 A 记录,一个是 substore.domain.com, 一个是 subapi.domain.com (实际 A 记录的名字随意,只要你能区分就行)见下图例子:备注:后面的代理黄云勾不勾随意,如果你用其它第三方 ssl 证书可以不勾,如果用 CF 的证书就勾上。2、克隆项目名称地址前端 Sub-Store-Front-Endhttps://github.com/sub-store-org/Sub-Store-Front-End.git后端 Sub-Store/backendhttps://github.com/sub-store-org/Sub-Store.git使用 git clone + 地址的方式克隆3、安装 node和pnpm环境,pm2管理器①下载和安装 fnm(Node.js 版本管理器)curl -fsSL https://fnm.vercel.app/install | bash看上一步的提示复制粘贴 不要抄下面的②根据上一步提示执行命令:看上一步的提示复制粘贴 不要抄下面的③安装 node.jsfnm install v16.13.2④安装 PNPM 软件包管理器curl -fsSL https://get.pnpm.io/install.sh | sh -看上一步的提示复制粘贴 不要抄下面的⑤根据上一步提示执行命令:看上一步的提示复制粘贴 不要抄下面的⑥安装 pnpmnpm i pnpm -g⑦安装pm2项目管理器进入宝塔面板软件商店安装pm2项目管理器4、前端修改编译①修改后端接口地址宝塔自带文件管理器打开项目根目录 Sub-Store-Front-End文件夹下的.env.production文件,将文件里线上环境接口地址改为自己准备的域名,比如https://subapi.domain.com/token,token尽量复杂,下面Nginx配置需要用到,本文这里填https://subapi.domain.com/UV3yVmNYreAhkVgP②添加登录页面由于是要部署到服务器上,即为公开的,所以还需要一个登陆页面,阻止任何人访问在项目根目录下的src/views下新建Login.vue文件Login.vue代码如下:<template> <div class='wrapper'> <div>欢迎使用</div> <nut-form :model-value='formData' ref='ruleForm'> <nut-form-item label='用户名' prop='name' required :rules="[{ required: true, message: '请填写用户名' }]"> <input class='nut-input-text' @blur="customBlurValidate('name')" v-model='formData.name' placeholder='请输入用户名' type='text' /> </nut-form-item> <nut-form-item label='密码' prop='pwd' required :rules="[ { required: true, message: '请填写密码' }, // { validator: customValidator, message: '必须输入数字' }, // { regex: /^(\d{1,2}|1\d{2}|200000000)$/, message: '必须输入0-200000000区间' } ]"> <input class='nut-input-text' v-model='formData.pwd' placeholder='请输入密码' type='text' /> </nut-form-item> <nut-cell> <nut-button type='primary' size='small' style='margin-right: 10px' @click='submit'>登录</nut-button> <nut-button size='small' @click='reset'>重置</nut-button> </nut-cell> </nut-form> </div> </template> <script lang='ts'> import { Notify, Toast } from '@nutui/nutui'; import { ref, reactive } from 'vue'; import { useRouter } from 'vue-router'; export default { setup() { const router = useRouter(); const formData = reactive({ name: '', pwd: '', }); const validate = (item: any) => { console.log(item); }; const ruleForm = ref<any>(null); const submit = () => { ruleForm.value.validate().then(({ valid, errors }: any) => { if (valid) { console.log('success', formData); if (formData.name == 'name') { if (formData.pwd == 'password') { Notify.success('登录成功,欢迎回来!',{ duration: 1000 }); Toast.loading('', { cover: false // 透明罩 }); sessionStorage.setItem('token', 'token') // 临时存储,关闭标签后就清除 setTimeout(() => { router.push({path: '/sub'}); // router.replace('/sub') Toast.hide(); }, 1200); } else { Notify.danger('密码错误!'); } } else { Notify.warn('用户不存在!'); } } else { console.log('error submit!!', errors); } }); }; const reset = () => { ruleForm.value.reset(); }; // 失去焦点校验 const customBlurValidate = (prop: string) => { ruleForm.value.validate(prop).then(({ valid, errors }: any) => { if (valid) { console.log('success', formData); } else { console.log('error submit!!', errors); } }); }; // 函数校验 const customValidator = (val: string) => /^\d+$/.test(val); // Promise 异步校验 const asyncValidator = (val: string) => { return new Promise((resolve) => { Toast.loading('模拟异步验证中...'); setTimeout(() => { Toast.hide(); resolve(/^400(-?)[0-9]{7}$|^1\d{10}$|^0[0-9]{2,3}-[0-9]{7,8}$/.test(val)); }, 1000); }); }; return { ruleForm, formData, validate, customValidator, asyncValidator, customBlurValidate, submit, reset }; }, }; </script> <style lang='scss' scoped> .wrapper { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; h3 { padding-bottom: 24px; } } </style>修改代码中的用户名、密码、token示例:if (formData.name == 'zqzess') { if (formData.pwd == 'zqzess') { Notify.success('登录成功,欢迎回来!',{ duration: 1000 }); Toast.loading('', { cover: false // 透明罩 }); sessionStorage.setItem('token', 'code') // 临时存储,关闭标签后就清除此处sessionStorage.setItem('token', 'code')定义的token为code,一定要记住,后面路由会用到此处formData.name == 'zqzess'定义的zqzess即为用户名此处formData.pwd == 'zqzess'定义的zqzess即为密码这种明文写在代码里面账号密码其实也不安全,仅作为一个简单的认证,以后有机会再改写需要后端认证的登陆③修改路由接下来需要把登陆页面添加至路由里面,并加入拦截,没有token的需要跳转登陆页项目根目录,/src/router/index.ts,添加:import Login from '@/views/Login.vue';接着修改根路由,将如下代码修改为图片上的,就是将第一个path: '/'改为path: '/sub'接着添加登陆路由,在path: '/:pathMatch(.*)'代码后面添加{ path: '/:pathMatch(.*)', component: NotFound, meta: { title: 'notFound', needTabBar: false, needNavBack: true, }, }, { path: '/', component: Login, meta: { title: 'login', needTabBar: false, needNavBack: false, }, }在本页最后一行export default router;上面添加路由拦截此处if (token === null || token === '' || token !== 'code') {的code即为上面登陆页填写的tokenrouter.beforeEach((to, from, next) => { // let token = window.localStorage.getItem('token') // let type = window.localStorage.getItem('type') if (to.path === '/' || to.path === '/login' || to.path === '/error') { // console.log("允许直接访问") next(); } else { // let token = window.localStorage.getItem('token') // 长期存储 let token = window.sessionStorage.getItem('token') // 临时存储,关闭标签后就清除 // console.log("需要token") if (token === null || token === '' || token !== 'code') { // console.log("无token,跳转登录") next('/'); } else { // console.log("有token") next(); } } }); export default router;接着修改根目录,/src/views/SubEditor.vue,由于代码较多,可以直接搜索router.replace,会跳转到相应代码把router.replace('/')改为router.replace('/sub')④登陆页的命名与翻译根目录/src/locales/en.ts可以使用搜索notFound: '404 Not Found',,再此行下面添加login: 'Login',根目录/src/locales/zh.ts搜索notFound: '地址未找到',,再此行下面添加login: '登录',至此已经全部结束,接下来就是打包发布并部署服务器⑤前端打包在前端 Sub-Store-Front-End文件夹下执行,安装依赖pnpm install在前端 Sub-Store-Front-End文件夹下执行,执行打包命令pnpm build打包好后,根目录会多出dist文件夹,此文件夹就是打包好的网站文件,也是我们需要发布服务器的5、部署后端进入后端项目里的backend文件夹,进入开源后端项目最新Releases下载执行文件cd /root/Sub-Store/backend wget https://github.com/sub-store-org/Sub-Store/releases/download/2.14.99/sub-store.min.js之后,执行pnpm i完成后再执行:pm2 start sub-store.min.js完成后继续执行:pm2 save如果成功,至此后端已经成功启动pm2常用命令pm2 list pm2 log <name> pm2 stop id pm2 delete id6、配置网站宝塔面板添加站点,并配置好证书将之前打包好的dist文件夹里面的所有文件剪切到substore.domain.com站点根目录,不要复制整体dist文件夹,而是里面的单个文件subapi.domain.com域名配置反代,进入站点设置location /UV3yVmNYreAhkVgP/{ //API-token 也要根据需要修改,尽量复杂 proxy_pass http://127.0.0.1:3000/; }三、使用教程进入网站https://substore.domain.com,输入之前设置的用户名和密码进入我的——后端设置如果后端是之前设置的线上环境地址,就不用管了,可以直接转换节点了如果不是,需要手动添加新后端并保存好,名称随意,链接填刚刚反代的地址,https://subapi.domain.com/UV3yVmNYreAhkVgP参考文章:https://www.whitemoon.top/posts/e36e6bfe.htmlhttps://www.evan888.top/1974/
2023年11月22日
3,536 阅读
0 评论
2 点赞
2023-11-20
Joe主题添加文章侧边栏目录
环境说明:Typecho:正式版 V1.1-17.10.30-releaseJoe:V7.7.1一、安装插件Github 仓库链接:plugins/MenuTree at master · typecho-fans/plugins · GitHub下载链接:https://github.com/typecho-fans/plugins/releases/download/plugins-M_to_R/MenuTree.zip二、插件使用2.1、启用插件将下载好的插件放在 usr/plugins/ 目录中,确保文件夹名为 MenuTree;激活插件,设置内可勾选“嵌入模式”与“独立模式”:“嵌入模式”勾选时,编辑文章用按钮插入或手写 < !-- index-menu -->(插入按钮功能貌似是无效的,还有注意,别照抄这个标签,我在标签的 ! 前面加了一个空格,不然它就会被解析成目录了) 标签发布即可显示目录树;“独立模式”勾选时,修改模板文件如 post.php 中写入 <?php $this->treeMenu(); ?> 也可显示。需要注意的是,在文章中渲染出来的目录默认是没有任何样式的,所以需要我们自定义样式。为了使目录显示为侧边栏,并且样式与 Joe 本来的侧边栏风格保持一致,这里使用“独立模式”,并用相应的 CSS 与 JS 文件来定义其样式。2.2、CSS文件将以下 CSS 代码保存至文件中,文件名为 menutree.css,文件放到主题目录的 assets/css 文件夹下。.menutree { position:sticky; top:60px; width:15%; margin:15px 15px 15px 0px; /* 溢出内容添加滚动条 */ overflow-y:auto; overflow-x:auto; background: var(--background); } /** 父元素<ul>与其中的子元素<li> **/ .index-menu-item { margin: 10px 0px; } .index-menu-list { margin: 5px 0px 5px 10px; } /** 所有<a>标签 **/ .index-menu-link{ color: var(--main); transition:all 0.2s ease-in-out 0s; padding:5px 0px; } .index-menu-link:hover { color: var(--theme); text-shadow: var(--text-shadow); font-weight:500; background-color:#efefef; } /* 锚点跳转定位 */ .menu-target-fix { display: block; position: relative; /* 偏移量 */ top:-100px; } /* 在宽度小于1000px的设备上隐藏短划线,以使目录的标题正常显示 */ @media screen and (max-width:1000px) { .joe_aside__item-title > .line { display:none; } } /* 在宽度小于800px的设备上隐藏目录侧边栏 */ @media screen and (max-width:800px) { .menutree{ display:none; } }2.3、JS文件将以下 JS 代码保存至文件中,文件名为 menutree.js,文件放到主题目录的 assets/js 文件夹下。/* 获取渲染好的目录的高度 */ menuHeight = document.getElementsByClassName("index-menu")[0].offsetHeight; /* 获取容器高度 */ containHeight = document.getElementsByClassName("joe_aside__item-contain")[0].offsetHeight; /* 获取容器 title 的高度 */ titleHeight = document.getElementsByClassName("joe_aside__item-title")[0].offsetHeight; /* 获取整个目录侧边栏对象 */ aside = document.getElementsByClassName("menutree")[0]; // 定义一个函数来修改目录的显示长度,从而使侧边栏能自适应目录的高度,避免出现大片空白部分 function changeMenuHeight(){ /* 调整容器高度 */ aside.style.height = titleHeight + containHeight + "px"; } // 如果目录的高度小于500px,调用函数将目录修改为实际高度,反之则将侧边栏的高度固定为500px if(menuHeight < 500){ changeMenuHeight(); } else { aside.style.height = "500px"; }2.4、修改 post.php 文件建议修改之前先备份 post.php 文件,如果修改失败可以随时还原回来。总共需要修改两个地方:导入 CSS 文件在文件前面的导入 CSS 文件:<!-- 导入目录的css文件 --> <link rel="stylesheet" href="<?php $this->options->themeUrl('assets/css/menutree.css'); ?>"> 2.添加目录代码 然后在 <div class="joe_container"> 与 div class="joe_main joe_post"> 之间添加如下代码:<!-- 文章目录代码 --> <section class="joe_aside__item menutree"> <div class="joe_aside__item-title"> <svg t="1642997936013" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2169" width="128" height="128"><path d="M838.3 895.9H197.9c-53.9 0-97.7-43.8-97.7-97.7V236.7c0-53.9 43.8-97.7 97.7-97.7h640.3c53.9 0 97.7 43.8 97.7 97.7v561.4c0.1 53.9-43.7 97.8-97.6 97.8zM197.9 203.8c-18.1 0-32.9 14.8-32.9 32.9v561.4c0 18.1 14.8 32.9 32.9 32.9h640.3c18.1 0 32.9-14.8 32.9-32.9V236.7c0-18.1-14.8-32.9-32.9-32.9H197.9z" fill="#666666" p-id="2170"></path><path d="M695.1 455.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 578.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 701.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM379.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5zM657.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5z" fill="#666666" p-id="2171"></path></svg> <span class="text">目录</span> <span class="line"></span> </div> <div class="joe_aside__item-contain"> <?php $this->treeMenu(); ?> </div> </section> <!-- 导入的js文件,必须在这里导入,否则不生效 --> <script src="<?php $this->options->themeUrl('assets/js/menutree.js'); ?>"></script>保存,刷新文章页面即可看到左边的侧边栏目录。以上的样式代码经过一定时间的使用,可以完美契合 Joe 主题,并且加入了部分响应式布局的代码,在移动设备上目录会自动隐藏,不会影响内容阅读。当然,如果是非 Joe 主题,样式可能需要重新设计。
2023年11月20日
51 阅读
0 评论
0 点赞
2023-11-20
Docker搭建headscale和derp异地组网完整教程
目前国家工信部在大力推动三大运营商发展 IPv6,对家用宽带而言,可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址,也是个大内网地址,根本不是真正的公网 IP,访问家庭内网的资源将会变得越来越困难。部分小伙伴可能会选择使用 frp 等针对特定协议和端口的内网穿透方案,但这种方案还是不够酸爽,无法访问家庭内网任意设备的任意端口。更佳的选择还是通过 VPN 来组建大内网。至于该选择哪种 VPN,毫无疑问肯定是 WireGuard,WireGuard 就是 VPN 的未来。WireGuard 目前最大的痛点就是上层应用的功能不够健全,因为 WireGuard 推崇的是 Unix 的哲学,WireGuard 本身只是一个内核级别的模块,只是一个数据平面,至于上层的更高级的功能(比如秘钥交换机制,UDP 打洞,ACL 等),需要通过用户空间的应用来实现。Tailscale 是什么?Tailscale 是一种基于 WireGuard 的虚拟组网工具,和 Netmaker 类似,最大的区别在于 Tailscale 是在用户态实现了 WireGuard 协议,而 Netmaker 直接使用了内核态的 WireGuard。所以 Tailscale 相比于内核态 WireGuard 性能会有所损失,但与 OpenVPN 之流相比还是能甩好几十条街的,Tailscale 虽然在性能上做了些许取舍,但在功能和易用性上绝对是完爆其他工具:开箱即用无需配置防火墙没有额外的配置高安全性/私密性自动密钥轮换点对点连接支持用户审查端到端的访问记录在原有的 ICE、STUN 等 UDP 协议外,实现了 DERP TCP 协议来实现 NAT 穿透基于公网的控制服务器下发 ACL 和配置,实现节点动态更新通过第三方(如 Google) SSO 服务生成用户和私钥,实现身份认证简而言之,我们可以将 Tailscale 看成是更为易用、功能更完善的 WireGuard。Tailscale 是一款商业产品,但个人用户是可以白嫖的,个人用户在接入设备不超过 20 台的情况下是可以免费使用的(虽然有一些限制,比如子网网段无法自定义,且无法设置多个子网)。Tailscale 终究是第三方平台,如该平台发生数据泄露、异常崩溃、服务终止等,就无能为力。或许,我们可以自己建一个类似的私有平台?Headscale 是什么?Headscale 旨在实现一个自托管、开源的Tailscale控制服务器替代方案,可以实现较小范围内和实现单个Tailnet的功能,通常可用于设置为单个组织、家庭或个人使用。一、搭建headscale服务端Headscale 部署很简单,推荐直接在 Linux 主机上安装。<!--理论上来说只要你的 Headscale 服务可以暴露到公网出口就行,但最好不要有 NAT,所以推荐将 Headscale 部署在有公网 IP 的云主机上。-->1.创建相关文件并配置这里需要手动创建 db.sqlite,这是根服务器的数据库文件。另外,还需要下载官网给的配置文件示例,然后需要修改一部分。mkdir -p /home/docker/headscale/config && \ mkdir -p /home/docker/headscale/data && \ touch /home/docker/headscale/data/db.sqlite && \ wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /home/docker/headscale/config/config.yaml修改相关配置文件,比如配置文件中配置 127.0.0.1 的话,那么就只能本机访问。这里修改为 0.0.0.0 那么就所有的 ip 都能访问。sed -i 's/127.0.0.1/0.0.0.0/g' /home/docker/headscale/config/config.yaml这将修改以下几个地方# 1. server_url: http://0.0.0.0:8080 # 2. listen_addr: 0.0.0.0:8080 # 3. metrics_listen_addr: 0.0.0.0:9090 # 4. grpc_listen_addr: 0.0.0.0:50443<!--/* 修改配置文件两个注意地方:a、hs的监听端口号,要和docker-compose.yaml里定义的端口一致,默认是8080b、没有部署中继服务器,但derp部分不能删除,把enabled项设为fasle即可,否则后面headscale-webui进行overview时会出现服务器错误。-->其中server_url还需要另外修改:server_url是对外访问和登录的地址,如果你需要使用域名并开启https,那么照我如下配置。如果你仅仅使用ip,那么这个地址修改为ip+端口的方式即可。<!--如果是国内服务器,域名必须要备案-->域名填自己的sed -i 's#http://0.0.0.0:8080#https://headscale.yourname.com#g' /home/docker/headscale/config/config.yaml修改 dns 配置文件,如果不进行修改,那么登录时选择接受服务器的 dns 地址就会出现域名无法解析的情况。注意,这里的 dns 地址可以有多个,如果有需要自行添加即可。sed -i 's/1\.1\.1\.1/119.29.29.29/g' /home/docker/headscale/config/config.yaml客户端可以通过 主机名 + 用户 + 基础域名 访问任意一台终端,所以这里修改下基础域名[根域名],根据自己的实际域名进行填写。域名填自己的sed -i 's/example.com/yourname.com/' /home/docker/headscale/config/config.yaml设置客户端随机端口,这里是听见有说不开机随机端口可能出现只能加入一台客户端的情况,为了保险还是选择开启。sed -i 's/randomize_client_port: false/randomize_client_port: true/' /home/docker/headscale/config/config.yaml可自定义私有网段,也可同时开启 IPv4 和 IPv6:ip_prefixes: # - fd7a:115c:a1e0::/48 - 10.1.0.0/162、启动headscale服务端docker run -d \ --name headscale \ --restart always \ -v /home/docker/headscale/config:/etc/headscale/ \ -v /home/docker/headscale/data:/var/lib/headscale \ -p 8080:8080 \ -p 9090:9090 \ --restart always \ headscale/headscale:0.22.3 \ headscale serve下面是一些相关的命令:以前是 namespace 的概念,现在似乎改为 user 了# 查看用户 docker exec -it headscale headscale users ls # 创建用户 docker exec -it headscale headscale users create hz # 生成apikey docker exec -it headscale headscale apikey create # 查询apikey docker exec -it headscale headscale apikey ls3、搭建web-uidocker run -d \ --name headscale-webui \ --restart always \ -v /home/docker/headscale/config:/etc/headscale/:ro \ -v /home/docker/headscale/web-ui/data:/data \ -u root \ -p 5000:5000 \ -e HS_SERVER=https://headscale.amjun.com \ # -e DOMAIN_NAME=https://headscale.amjun.com \ # 反向代理后的域名,必须要先设置好! -e SCRIPT_NAME=/admin \ -e AUTH_TYPE=Basic \ -e BASIC_AUTH_USER=admin \ -e BASIC_AUTH_PASS=admin \ -e KEY="2uHP6BSVocX+wcWU5mzuXA7JvnZA70UaTadB8L1heOo=" \ --restart always \ ifargle/headscale-webui:latest其中 /home/docker/headscale/config 为上面服务端的映射目录,这两个目录需要一致。HS_SERVER 和 DOMAIN_NAME 填写自己的域名1。KEY 是用来加密待会需要保存的 apikey 的字符串,使用命令 openssl rand -base64 32 生成。接下来需要创建 headscale 服务器的 api-key,这里设置一个比较久的过期时间。4、配置nginx和web-uiNPM配置nginx在 Nginx Proxy Manager 中配置一下反向代理,并且配置下 SSL。需要注意的是,要把 Websockets Support 打开,否则客户端会无法登录。如果 webui 跟 Headscale 使用了同一个域名,需要配置一下 Custom locations。最后访问下 Headscale 的域名,如果返回了 404,说明部署成功。保存配置后重启 nginx,如果配置正确,那么通过 https://域名/admin 应该可以访问到 web-ui 界面,输入容器启动时配置的用户名密码即可进入。宝塔面板Nginx配置server { listen 443 ssl; listen [::]:443 ssl; server_name headscale.amjun.com; ssl_certificate /etc/nginx/conf.d/cert/amjun.com.cer; ssl_certificate_key /etc/nginx/conf.d/cert/amjun.com.key; location ^~/ { proxy_pass http://localhost:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $server_name; proxy_redirect https:// https://; proxy_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; } location ^~/admin/ { proxy_pass http://localhost:5000/admin/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 80; server_name headscale.amjun.com; rewrite ^(.*)$ https://$host:443$1 permanent; }配置web-ui上面提示输入 apikey,这个需要 headscale 服务端生成,这里设置一个比较长的时间,根据自己的需要即可。docker exec -it headscale headscale apikeys create -e 10000d运行命令后将生成的 key 输入,点击 save 即可,概览页面如下:5、创建用户和授权密钥headscale 个人理解是用户就是命名空间,进行网络隔离,所以需要先创建用户。# 创建用户 docker exec -it headscale headscale users create hz授权密码的作用是,客户端登陆时不需要再服务端进行确认,阿蛮君总是喜欢使用简单的方式,所以就选择这种方式了。# reusable 参数代表可以重复使用,不加的话密钥只能用来一个客户端加入 docker exec -it headscale headscale preauthkeys create -e 10000d --reusable -u hz # 查看密钥 docker exec -it headscale headscale preauthkeys list -u hz这里记得记录好授权密钥,下面将会用到。二、搭建Derp服务端由于 Tailscale 官方的 DERP 服务在中国大陆地区并没有服务提供,并且使用的人也非常的多,以至于中继的体验并不好,因此可以自建一个中继服务来改善这个问题。1、使用如下命令即可搭建 derp 服务器:docker run -d \ --name derper \ -p 12345:12345 \ -p 3478:3478/udp \ -e DERP_ADDR=:12345 \ -e DERP_DOMAIN=derper.your-domain.com \ -e DERP_VERIFY_CLIENTS=false \ --restart always \ yangchuansheng/derper有几点需要注意:能用 443 端口尽量用 443 端口,实在不行再用别的端口;默认情况下也会开启 STUN 服务,UDP 端口是 3478;防火墙需要放行端口 12345 和 3478;准备好 SSL 证书;derper.your-domain.com 修改为自己的域名。设置环境变量 DERP_VERIFY_CLIENTS 是为了验证域名,这里考虑到有些人不一定需要所以设置为 false,如果真正自己使用还是建议设置为 true。目前 derper 运行一段时间就会崩溃,暂时还没有更好的解决方案,只能通过定时重启来解决,比如通过 crontab 来设置每两小时重启一次容器:0 */2 * * * docker restart derper &> /dev/null2. 配置nginxserver { listen 443 ssl; listen [::]:443 ssl; server_name derper.your-domain.com; ssl_certificate /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.cer; ssl_certificate_key /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.key; location / { proxy_pass http://localhost:12345/; proxy_redirect https:// https://; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header Content-Security-Policy upgrade-insecure-requests; } } server { listen 80; server_name derper.your-domain.com; rewrite ^(.*)$ https://$host:443$1 permanent; }设置了强制跳转 https,如果有需要可以不设置,如果没有域名请不需要配置。配置修改后,记得重启下 nginx,这里需要使用域名或者 ip + 端口能够访问到 derp 页面。在 Nginx Proxy Manager 中配置一下反向代理,这个也需要开启 Websockets Support ,否则客户端中会无法连接 DERP 服务。如果自建了 DERP 服务,可以把 Tailscale 官方的公共服务禁用,只用自己的服务。修改 config.yaml3. 创建derp.yaml需要告诉 headscale 服务器我们创建的 derp 节点的地址,否则客户端不知道地址将无法使用。如果你是按照我之前的教程搭建的 headscale,那么运行如下命令,否则需要自己注意配置文件的位置。cat << EOF > /home/docker/headscale/config/derp.yaml regions: 900: regionid: 900 regioncode: ts regionname: Tencent Shanghai nodes: - name: 900a regionid: 900 hostname: derper.your-domain.com # ipv4: ip stunport: 3478 stunonly: false derpport: 443 EOF这里的域名替换为自己的域名,如果没配置域名就使用 ip。另外需要注意的是,如果你使用域名配置了 https,那么这里的 derpport 一般填写 443,否则应该使用上面启动容器时指定的 12345 端口。记得开放3478端口!!!regions 是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即 nodes。每个可用区的 regionid 不能重复。每个 node 的 name 不能重复。regionname 一般用来描述可用区,regioncode 一般设置成可用区的缩写。ipv4 字段不是必须的,如果你的域名可以通过公网解析到你的 DERP 服务器地址,这里可以不填。如果你使用了一个二级域名,而这个域名你并没有在公共 DNS server 中添加相关的解析记录,那么这里就需要指定 IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了)。stunonly: false 表示除了使用 STUN 服务,还可以使用 DERP 服务。regions: 901: regionid: 901 regioncode: jp regionname: Aliyun Japan nodes: - name: 901a regionid: 901 hostname: 'derper.yourdomain1.com' ipv4: '' stunport: 3478 stunonly: false derpport: 443 902: regionid: 902 regioncode: cn regionname: Aliyun Guangzhou nodes: - name: 902a regionid: 902 hostname: 'derper.youdomain2.com' ipv4: '' stunport: 3478 stunonly: false derpport: 4434. 修改headscale配置文件修改 config.yaml 文件,paths 指定 derp.yaml 文件的位置,urls 下面的链接是官方提供的中继服务器,根据自己判断是否需要注释。# /etc/headscale/config.yaml derp: # List of externally available DERP maps encoded in JSON urls: # - https://controlplane.tailscale.com/derpmap/default # Locally available DERP map files encoded in YAML # # This option is mostly interesting for people hosting # their own DERP servers: # https://tailscale.com/kb/1118/custom-derp-servers/ # # paths: # - /etc/headscale/derp-example.yaml paths: - /etc/headscale/derp.yaml # If enabled, a worker will be set up to periodically # refresh the given sources and update the derpmap # will be set up. auto_update_enabled: true # How often should we check for DERP updates? update_frequency: 24h修改文件后记得重启 headscale。docker restart headscale5、验证再次执行 netcheck 命令,可以看见自己搭建的 derp 节点,如果是使用国内的服务器搭建,那么一般这个服务器是最近的。# docker 运行的客户端 docker exec -it tailscaled tailscale netcheck # 非 docker 运行的客户端 tailscale netcheck三、客户端安装目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器。OS是否支持 HeadscaleLinuxYesOpenBSDYesFreeBSDYesmacOSYesWindowsYes 参考 Windows 客户端文档Android支持,参考 这个 PRiOS暂不支持1、Linux1.1脚本安装curl -fsSL https://tailscale.com/install.sh | sh && \ tailscale login --login-server https://headscale.amjun.com --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --accept-dns=false --accept-routes这里仅仅安装方式不同,登录的命令完全一样1.2Docker安装docker run -d \ --name=tailscaled \ -v /home/docker/tailscale/:/var/lib \ -v /dev/net/tun:/dev/net/tun \ -e TS_STATE_DIR=/var/lib/state/ \ --network=host \ --restart always \ --privileged tailscale/tailscale:v1.44.0 \ tailscaled --tun=tailscale0 -debug=:8088 -no-logs-no-support=true这里需要将 TS_STATE_DIR 指定的文件夹持久化,否则删除容器再新建后,在服务端能看见重复的设备。并且需要指定 --tun=tailscale0,不然似乎不能在宿主机创建网卡。然后使用如下命令进行登录:docker exec tailscaled tailscale login --login-server https://headscale.amjun.com --accept-dns=false --accept-routes=false --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --advertise-routes=172.21.9.0/24,172.30.1.0/24,172.26.1.0/24,172.20.2.0/23根据自己网络情况设置 --advertise-routes,我这是需要通过这台内网机器访问公司其他网络。如果出现如下错误:running [/sbin/ip6tables -t filter -N ts-input --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directoryip6tables v1.8.8 (legacy): can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)Perhaps ip6tables or your kernel needs to be upgraded执行以下命令:# 防止探测ip6table sudo modprobe ip6table_filter1.3 手动安装Tailscale 官方提供了各种 Linux 发行版的软件包,但国内的网络你懂得,软件源根本用不了。好在官方还提供了 静态编译的二进制文件,我们可以直接下载。例如:wget https://pkgs.tailscale.com/stable/tailscale_1.22.2_amd64.tgz解压:tar zxvf tailscale_1.22.2_amd64.tgz将二进制文件复制到官方软件包默认的路径下:cp tailscale_1.22.2_amd64/tailscaled /usr/sbin/tailscaled cp tailscale_1.22.2_amd64/tailscale /usr/bin/tailscale将 systemD service 配置文件复制到系统路径下:cp tailscale_1.22.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service将环境变量配置文件复制到系统路径下:cp tailscale_1.22.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled启动 tailscaled.service 并设置开机自启:systemctl enable --now tailscaled查看服务状态:systemctl status tailscaledTailscale 接入 Headscale:# 将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名 tailscale up --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS。如果你对 DNS 有需求,可自己研究官方文档,这里不再赘述。执行完上面的命令后,会出现下面的信息:To authenticate, visit: http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704 1150d8462、其他 Linux 发行版除了常规的 Linux 发行版之外,还有一些特殊场景的 Linux 发行版,比如 OpenWrt、威联通(QNAP)、群晖等,这些发行版的安装方法已经有人写好了,这里就不详细描述了,我只给出相关的 GitHub 仓库,大家如果自己有需求,直接去看相关仓库的文档即可。OpenWrt: https://github.com/adyanth/openwrt-tailscale-enabler群晖: https://github.com/tailscale/tailscale-synology威联通: https://github.com/ivokub/tailscale-qpkg3、AndroidAndroid 客户端从 1.30.0 版本开始支持自定义控制服务器(即 coordination server),你可以通过 Google Play 或者 F-Droid 下载最新版本的客户端。国内本地下载安装完成后打开 Tailscale App,会出现如下的界面:点开右上角的“三个点”,你会看到只有一个 About 选项:接下来就需要一些骚操作了,你需要反复不停地点开再关闭右上角的“三个点”,重复三四次之后,便会出现一个 Change server 选项:点击 Change server,将 headscale 控制服务器的地址填进去:然后点击 Save and restart 重启,点击 Sign in with other,就会跳出这个页面:将其中的命令粘贴到 Headscale 所在主机的终端,将 NAMESPACE 替换为之前创建的 namespace,然后执行命令即可。注册成功后可将该页面关闭,回到 App 主页,效果如图:docker exec -it headscale headscale nodes register --user hz --key nodekey:xxxx4、Windowstailscale 客户端下载地址:https://tailscale.com/download/4.1 安装客户端下载 windows 客户端并进行安装。4.2 安装注册表访问 https://headscale.amjun.com/windows,可以看见配置的教程。提示需要修改注册表,这里可以直接 curl https://headscale.amjun.com/windows/tailscale.reg 下载文件后,双击运行文件进行安装即可。4.3 登录在 tailscale 的安装目录下使用 cmd 打开,输入命令:tailscale login --login-server https://headscale.amjun.com --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --accept-dns=false --accept-routes这里的 authkey 是第四步生成的,然后在服务器使用命令查看。docker exec -it headscale headscale nodes ls总结目前从稳定性来看,Tailscale 比 Netmaker 略胜一筹,基本上不会像 Netmaker 一样时不时出现 ping 不通的情况,这取决于 Tailscale 在用户态对 NAT 穿透所做的种种优化,他们还专门写了一篇文章介绍 NAT 穿透的原理, 中文版翻译自国内的 eBPF 大佬赵亚楠,墙裂推荐大家阅读。放一张图给大家感受一下:
2023年11月20日
2,634 阅读
0 评论
1 点赞
2023-11-18
子比主题7.4版本绕过授权
子比主题7.4原版下载:直接下载,B2-PRO最新版5.2.0原版下载:直接下载伪站搭建(以Nginx为例)需要使用宝塔面板1.进入网站--添加站点, 新建一个网站,本文添加的是api.zibi.xx.com,子比主题7.4上传index.php,B2-PRO5.2.0上传b2_auth_api.zip到授权站点,本文是/www/wwwroot/api.zibi.xx.com,其他多余文件删除:2、子比主题7.4绑定api.zibll.com域名,B2-PRO5.2.0绑定7b2.com,并开启SSL并配置好伪静态location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php/$1 last; break; } }3、去除SSL验证将class-wp-http.php 上传到wordpress网站的wp-includes下替换(主要是去除了SSL验证)4、修改hosts子比主题7.4在/etc/hosts里面加一行127.0.0.1 api.zibll.comB2-PRO5.2.0在/etc/hosts里面加一行127.0.0.1 7b2.com5、登录后台,点击授权子比主题7.4登录后台,点击授权B2-PRO5.2.0安装好主题后,会员号随便填写一个点激活即可参考文章:https://bzlt.net/thread-426-1-1.html
2023年11月18日
88 阅读
0 评论
1 点赞
2023-11-17
Zerotier搭建私有根服务器及创建虚拟局域网
一、Zerotier 原理概念planet:核心角色,官方不允许自建私有,zerotier 的行星服务器,用于管理全球所有的 zerotier 客户端的地址信息,帮助建立客户端间的直接链接,以及在无法建立直接链接时,作为中继服务器转发设备间的流量。moon:官方允许自建私有,作为离客户端更近的中继服务器存在,可以使转发的效率更高。原理客户端注册在内网机器上启动一个 zerotier 客户端,使用 join 加入一个网络,在控制台对客户端进行授权,此时 planet 上有如下记录:10.0.0.1 - 150.0.0.1/15679 10.0.0.2 - 160.0.0.1/22226 2.尝试 p2p 连接当在 10.0.0.1 机器上访问 10.0.0.2,内网机器向 planet 查询到目标地址的公网 160.0.0.1,端口为 22226。10.0.0.1 尝试与 160.0.0.1的 22226 端口进行直接数据交互,这个过程称为 udp 打洞实现 p2p 直连。 3.planet 转发由于各种网络限制,p2p 不能直连。此时通过 planet 转发,如果还配置了 moon 节点,此时会通过速度快的 moon 节点进行转发。如上图则大概率从上海的 moon 节点进行数据转发,此时网络取决于 moon 的带宽。二、私有 zerotier-planet 的优势解除官方的设备连接数限制提升手机客户端连接的稳定性三、搭建私有 planet了解了 zerotier 的概念原理,那么大概了解搭建私有 planet 的重要性。1、运行控制器容器docker run -d \ --name zt-ui \ -v /home/docker/zt-ui/zerotier-one:/var/lib/zerotier-one \ -v /home/docker/zt-ui/ztncui/etc:/opt/key-networks/ztncui/etc \ -p 4000:4000 \ -p 9993:9993 \ -p 9993:9993/udp \ -e MYADDR=1.1.1.1 \ -e HTTP_PORT=4000 \ -e HTTP_ALL_INTERFACES=yes \ -e ZTNCUI_PASSWD=admin123 \ --restart=always \ hausen1012/ztncui这里需要注意的是传参需要将 1.1.1.1 修改为公网 ip。2、生成 planet 文件docker exec -it zt-ui bash /tmp/patch.sh && \ docker restart zt-ui如果 linux 内核版本太低,可能报错 FATAL: kernel too old,那么需要升级内核。当然,如果你觉得云服务器不太方便升级内核,那么完全可以用一台测试的虚拟机进行生成文件,文件生成后用 ftp 上传到 /home/docker/zt-ui/zerotier-one 目录,然后再启动容器。3、测试docker exec -it zt-ui zerotier-cli listmoons显示如下内容则表示搭建成功[ { "id": "00000004e3b1b4b0", "roots": [ { "identity": "04e3b1b4b0:0:ea0c548b45efcc701c052305f06568c749a4647b9a5b111e2b372c05f7c3ed56ae1009c29cb1aa51d95057bf1b65b3a2f7b01d129437f6b72efd08f68281fb52", "stableEndpoints": [ "1.1.1.1/9993" ] } ], "signature": "b4f539ef93e198203d9e270c155d091769408ff98489d83bcf6444d2a95112ca7369138b98d42512caa3c878f3eff2c27ecada28f549ea19e3a407e71bbeb008d51f6ba92af17e8b6e4c1b8eacbd4abc42f0f639746ea924cffb99b539f94e2b", "timestamp": 1665642068786, "updatesMustBeSignedBy": "7fcb120079801a1ddde8c1fb6657365351bca7279e8470728f4cf01fb5efc81b57cde03338b4ea76dfd39570f74f2654d8d52a22613e77ed2e4cbb46a648a42d", "waiting": false } ]1.1.1.1 为公网 ip 则搭建 planet 成功。四、创建私有网络访问 http://公网ip:4000,账号密码:admin/admin123。1、创建网络2、初始化网络点击 Easy setup设置网段和子网掩码五、安装 zerotier 客户端docker 安装既然已经搭建了私有的 planet,当然是使用自己的,需要先下载服务器 /home/docker/zt-planet/zerotier-one 目录下的 planet 文件。1、启动 zerotier 客户端docker run -d \ --name=zt-cli \ --device=/dev/net/tun \ --net=host \ --cap-add=NET_ADMIN \ --cap-add=SYS_ADMIN -d \ -v /home/docker/zt-client/zerotier-one:/var/lib/zerotier-one \ --restart unless-stopped \ hausen1012/zerotier2、替换 planet 文件将服务器下载的 planet 文件上传到客户端的 /home/docker/zt-client/zerotier-one 目录。3、重启客户端docker restart zt-cli4、查看 planetdocker exec -it zt-cli zerotier-cli listpeers可以看见 stableEndpoints 的配置是自己的公网 ip。5、加入网络docker exec -it zt-cli zerotier-cli join 8b8b9ed58a10bd456、授权ip 也可以自己设置,不过要在刚刚设置的网段内。Linux安装1、简单快捷,只要执行以下命令一键安装即可。安装完成后会自动在**/var/lib/zerotier-one/**下生成相关文件及目录curl -s https://install.zerotier.com | sudo bash2、替换planet文件需要先下载服务器 /home/docker/zt-planet/zerotier-one 目录下的 planet 文件将服务器下载的 planet 文件上传到客户端的 /var/lib/zerotier-one 目录3、添加开机自启systemctl enable zerotier-one.service4、启动zerotier-one.servicesystemctl start zerotier-one.service5、加入网络zerotier-cli join ################(networkid)6、查看加入的网络的信息,比如networkzerotier-cli listnetworks# 如果连接成功,并且管理页面中勾选此客户端,则会返回以下内容200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips> 200 listnetworks 830xxxxxxxx49 high_wozniak 4a:ce:1d:66:95:9b OK PRIVATE ztqu3hhgt3 10.147.18.122/247、退出加入的network网段zerotier-cli leave ################(networkid)8、卸载zerotieryum remove zerotier-one -y rm -rf /var/lib/zerotier-one/windows 安装1、下载客户端下载地址2、安装客户端双击安装即可3、替换 planet将下载好的 planet 文件复制到 C:\ProgramData\ZeroTier\One 目录下,(这个目录是个隐藏目录,需要运允许查看隐藏目录才行)4、重启服务如果仅仅只是重启 ui 是不行的,需要找到任务管理器 -> 服务 -> ZeroTierOneService,进行重启。5、查看 planet可以看见 planet 地址是自己的公网。6、加入网络点击右下角图标,join new network,输入刚刚创建的虚拟网络 id,我这边是 8b8b9ed58a0baa3d。7、授权和 dokcer 安装一样的操作,不再赘述Android安装有人制作了可以设置planet的版本:https://github.com/kaaass/ZerotierFix更新日志更新 Zerotier 核心更新 Zerotier 核心至 1.12.2改进消息提醒相关的用户体验在 APP 未获得通知权限时弹窗提示用户此弹窗提示可以被永久性关闭MIUI 机型在成功连接网络后无法弹出 Toast 提示更改通知类别名称为更具体的通知类型点击状态栏通知时无法跳转至 APP允许使用通过非官方 Planet ID 生成的 Planet 文件允许使用通过非官方 Planet ID 生成的 Planet 文件该功能应当能修复此前 APP 不识别部分自建 Planet 项目生成的 Planet 文件的问题六、测试通过上述方式将两台机器加入到网络,通过 ping 查看是否能打洞成功。其中 202 本地虚拟机,vps 是有公网 ip 的云服务器ping 检测在 10.0.0.202 机器上 ping 10.0.0.222listpeers 查看到只有自己的私有根服务器,ping 的延迟不到 100ms 和直接 ping 公网 ip 差不多,说明打洞成功。局域网 scp 检测speedtest 测速可以看见速度能达到十几MB,而我的根服务器是腾讯云的 3Mbps 服务器,如果通过根服务器转发肯定不可能达到这个速度,说明打洞成功。如果没有出现以上测试情况,Zerotier也无法保证能打通的,并且打洞成功也有可能有波动,能连接,但可能是根服务器腾讯云的 3Mbps的速度,无法点对点直连<u>参考文章:https://www.nodeseek.com/post-37619-1</u>
2023年11月17日
773 阅读
0 评论
0 点赞
1
2
3
4
...
9