技术积累
日进一寸

NAS全平台同步神器Rsync

imajeason阅读(365)

nas玩久了,数据就多起来了,还有些数据非常重要

之前跟大家分享过,数据备份的三二一原则,三份相同的数据,我们需要让nas自行的进行完整的备份,至少每天一次。

对于普通文档类数据,备份只是把数据备份出来,不需要考虑文件的属性

但是对于一些应用类数据,比如docker用到的文件,如果备份的文件权限变了,等你需要复制回去进行应用恢复的时候就会发现各种权限带来的问题

所以备份是需要专用工具的,而不是直接的复制粘贴

rsync正是数据同步的神器,而且在大部分的nas系统上,rsync几乎是标配,我们只需要学会使用它

Rsync是一款开源的、快速的、多功能的、可实现全量及增量(全量备份是指全部备份,增量备份是在上一次备份的基础上只备份更新的内容)的本地货远程数据同步备份的优秀工具。Rsync可以在大部分的操作系统上安装运行,包括windows。

rsync可以根据同步文件的大小和修改时间等信息来判断文件是否需要同步,从而实现增量备份,而且能够同步文件的属性信息来确保文件的元信息一致。

rsync有三种模式

1、本地模式比较简单,跟我们的复制粘贴一样,但是不同处在于它可以复制文件的属性、属主等权限类信息,非常牛批

2、shell模式,就是通过ssh命令实现文件的同步,这里的ssh命令特指linux系的操作系统,也就是说通过ssh命令获取对端的shell权限来进行同步

这个模式是linux系统中比较常用的同步模式,因为这种同步不需要对端做任何的修改,只需要开放ssh即可

3、daemon模式,是守护进程的方式传输数据,需要搭建服务

daemon模式是nas上比较常用的模式,但是ssh模式也是可以的

全局域网只需要有一台rsync服务,就可以让所有的rsync客户端实现数据的定时同步,非常方便

OMV中rsync使用

首先是omv,就是点点点就行

创建用户,创建目录,赋予权限

开启服务,设置账户和目录

rsync -av gits/ [email protected]::backup

群晖中rsync使用

首先需要开启ssh

群晖比较简单,打开后台,找到文件服务的rsync,开启22,注意,这里开启的是ssh模式

这样就开启了rsync服务

如果将群晖作为客户端使用需要去套件中间,安装backup

在shell中测试,gits是需要备份的目录,后面是目标路径,这里是群晖

rsync -av gits/ [email protected]::backup

不过还是建议使用daemon模式,群晖开启daemon模式也需要去命令行里操作

# 创建用户
rsync_backup
注意还要让用户对需要同步的目录有读写权限
/volume1/storages/omv_backup/ 

配置文件


uid             = rsync_backup
gid             = 0
use chroot      = no
max connections = 4
pid file        = /var/run/rsyncd.pid
timeout         = 600
auth users = rsync_backup
secrets file = /etc/rsync.password
[backups_synology]
    path = /volume1/storages/omv_backup/
    comment = Backups_omv
    read only = FALSE

创建密码文件/etc/rsync.password,权限600

rsync_backup:123456

然后去控制面板关闭rsync,再开启,实现重启。

unraid中rsync使用

unraid内置了rsync,但是没有提供操作界面,我们可以通过命令行来启动rsync服务

具体的操作也要去命令行里操作

考虑到unraid系统的特殊性,建议将unraid作为服务器使用

创建目录

mkdir -p /boot/custom/etc/
mkdir -p /boot/custom/etc/rc.d

 将rsyncd.conf文件同时放到/boot/custom/etc/etc下,两份一样内容。

rsyncd.conf文件,内容:

uid             = rsync_backup
gid             = rsync_backup
use chroot      = no
max connections = 4
pid file        = /var/run/rsyncd.pid
timeout         = 600
auth users = rsync_backup
secrets file = /etc/rsync.password

[backups_synology]
    path = /mnt/user/backup/synology
    comment = Backups_synology
    read only = FALSE
[backups_omv]
    path = /mnt/user/backup/omv/
    comment = Backups_omv
    read only = FALSE

创建密码文件

useradd rsync_backup -s /sbin/nologin -M
mkdir /mnt/user/backup/omv -p

chown rsync_backup.rsync_backup /mnt/user/backup

echo "rsync_backup:123456">/etc/rsync.password

chmod 600 /etc/rsync.password # 注意权限

将配置持久化(unraid操作)

touch /boot/custom/etc/rc.d/S20-init.rsyncd

内容如下:
S20-init.rsyncd

#!/bin/bash
if ! grep ^rsync /etc/inetd.conf > /dev/null ; then
cat <<-EOF >> /etc/inetd.conf
rsync   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/bin/rsync --daemon
EOF
read PID < /var/run/inetd.pid
kill -1 ${PID}
fi
cp /boot/custom/etc/rsyncd.conf /etc/rsyncd.conf

这是初始化文件,因为unraid在重启后会丢失配置,需要将配置初始化到flash中。

编辑初始化文件

vi /boot/config/go

将下面的内容放在末尾,后续每次执行初始化,都会初始化rsync服务端的配置

/boot/custom/etc/rc.d/S20-init.rsyncd

如果此时rsync没有运行

ps aux|grep rsync
# 如果没运行
rsync --daemon

大家可以根据自己的nas系统与操作系统组合,选择合适的rsync搭配方案

选择能够方便的进行定时任务的设备作为客户端,客户端可以作为数据源推送数据到服务器,也可以从rsync服务器拉取数据进行同步

也就是说,rsync客户端的选择与源数据在哪台设备上并没有关系

windows中rsync使用

我们首先安装windows版,方便没有linux客户端的朋友进行测试

windows系统安装rsync服务

cwRsync4.2.0下载地址:https://www.jb51.net/softs/39404.html?spm=a2c6h.12873639.article-detail.5.1aa02876MqUwGv

https://www.itefix.net/cwrsync

链接:https://pan.baidu.com/s/1CnY_6DQPLWahb9OqY9Xr4g 
提取码:5r2a 

下载rsync

下载解压后,得到server和client,根据需要安装

windows版rsync server,安装完成后,进入安装的目录,安装路径下默认配置rsyncd.conf

# C:\Program Files (x86)\ICW

use chroot = false
strict modes = false
hosts allow = *   #允许任意IP
lock file = rsyncd.lock 
max connections = 5
port = 28950   #指定端口号
charset=UTF-8  #指定字符集
#pid = 0
uid = 0    #运行rsync守护进程的用户 0为不限制
gid = 0    #运行rsync守护进程的组   0为不限制
log file = rsyncd.log  #日志文件存放位置
 
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
#[test]
#path = /cygdrive/c/work
#read only = false
#transfer logging = yes
 
[data]
path = /cygdrive/f/backup
auth users = zhangdaqi       #指定授权用户名
secrets file = etc/rsyncd.secrets  #指定密码存储文件
read only = no         
transfer logging = yes
hosts allow = *

特殊之处在于路径,这里要注意。确保指定的path存在,我这里设置的是F:\backup

/cygdrive/c/work 相当于c:/work 

通过 菜单–cwRsyncServer–02. Prep a Dir for Upload 设置目录权限,需要设置成600,也就是指定的用户可以读写,其他用户和用户组都没有权限。

密码文件rsyncd.secrets的格式是 用户名:密码

rsyncuser:rsyncpass

需将其权限设置为600,即其他组没有读权限。同时要保证用户cwRsyncServer既是该文件拥有者又对其具有读写权限。

此处需要确保账户zhangdaqi存在,如果没有就创建一个

修改完毕后,win+R 跳出输入框,输入services.msc就可以打开服务,去win 的服务中启动cwrsync。

windows客户端

这里最好是把rsync 客户端(注意,不是服务端)的路径加到环境变量中,不然操作的时候需要带着rsync的绝对路径,不是很方便

在windows cmd中执行命令

rsync -vzrtopg --progress --delete [email protected]::test /cygdrive/d/rsyncBackup --password-file=/cygdrive/c/etc/rsyncd.secrets

(–password-file也可以写前边)

rsyncd.secrets密码文件,名字随便起,格式,只写密码

rsyncpass

设置密码访问权限chown.exe可从服务端拷贝过来

同样的,目录权限需要设置成600,也就是指定的用户可以读写,其他用户和用户组都没有权限。

chmod -c 600 /cygdrive/c/etc/rsyncd.secrets
chown administrator /cygdrive/c/etc/rsyncd.secrets

可访问局域网中所有的rsync服务,包括windows、unraid等标准rsync服务。

rsync -vzrtopg --progress --delete /cygdrive/d/rsyncBackup/ 192.168.1.82::test

rsync -vzrtopg --progress --delete /cygdrive/d/rsyncBackup/ [email protected]::test --password-file=/cygdrive/c/etc/rsyncd.secrets

掌握了rsync,定时同步重要数据,可保数据无忧

我是张大七,下期再见。

5分钟搭建AI机器女友

imajeason阅读(434)

这是一个AI女友的项目,可以在本地运行,也可以挂载到telegram机器人,实现一个基于gpt4的AI女友。

首先看效果,telegram聊天

原项目首页

https://github.com/EniasCailliau/GirlfriendGPT/

因为初始设定都是英文人设,我就fork了一下代码,修改成了中文人设

https://github.com/imajeason/GirlfriendGPT

这个项目可以本地直接运行

创建一个python环境

git clone

安装依赖

python main

会提示申请api,我们就去申请api

设置

export STEAMSHIP_API_KEY=xxxxxxxxxxxxxxx

python main

就可以聊天了

现在我们要部署到云上的话,需要申请telegram bot机器人token

打开telegram,搜索bot father

申请,复制token

python deploy

设置项目名称

打开steamship页面

填写token等

现在就可以在telegram中搜索机器人,跟它聊天了

简单聊两句

本项目实际部署在steamship,有一美元的免费额度,超了后就不能聊天了,如果你喜欢这个项目就去交钱吧

另外收到的语音讲英文很ok,但是讲中文实在蹩脚

这个项目中使用了elevenlabs的语音接口生成语音信息,如果你喜欢这个项目就去开会员,然后自己生成喜欢的语音风格,定制你的专属女友声音。

拿到elevenlabs的api在这里修改token和语音id

另外就是ai发送的照片信息

你也可以自己定制喜欢的女友长相

需要修改提示词,在代码的这里修改。

Tailscale高级功能篇(tailscale Funnel)——实现不需要独立ip的公网访问

imajeason阅读(716)

多朋友没有独立ip,但是又想把nas上的服务映射到公网上使用。

比较简单的方案是通过zerotier,tailscale,wireguard等虚拟内网工具,把需要访问的设备都加到虚拟内网中,通过穿透实现异地访问服务。

其实tailscale本身可以提供类似于群晖的公网访问。

这个工具叫Tailscale Funnel 

基本原理是在tailscale会给你的设备分配一个二级域名,你通过二级域名的访问会被转发到指定的内网服务上,来实现。

这个服务是免费的

下面开始配置

首先要去tailscale管理页面开启它,先登录你的tailscale

https://login.tailscale.com/admin/dns

系统会分配一个默认的二级域名

然后激活magicDNS

然后激活https

打开access controls页面,激活funnel

建议使用完整功能的linux系统操作,方便把局域网中其他设备的服务映射出去,我这里以ubuntu20为例。

首先安装tailscale,打开
https://pkgs.tailscale.com/stable/

找到对应的平台安装tailscale

申请证书

tailscale cert 
#会提示需要输入三级域名,格式是   node_name.tailxxx.ts.net
# 输入正确的节点域名,重新执行
tailscale cert g4560.tail471ed.ts.net

首先确保这台机器上的服务正常启动了,注意一定要localhost也就是127.0.0.1的本机服务,这是funnel的限制,不要问我为什么不能直接把127.0.0.1写成局域网的其他设备ip,tailscale不让!!!那如果想映射局域网的其他设备怎么办,后面讲。

tailscale serve https / http://127.0.0.1:9091
tailscale funnel 443 on
tailscale funnel status
#https://example.pango-lin.ts.net (Funnel on)

可以看到已经激活了

但是如果你现在访问它是访问不了的,因为域名生效是需要时间的,稍等片刻一般来说就能更新出来

不用等很久就可以访问了

如果我们想把局域网中其他的服务访问出去怎么办

要么你在有服务的节点上安装tailscale启用funnel

如果那台机器不方便使用funnel怎么办,比如它是一台群晖

办法总是有的,我们在一台可以安装tailscale的节点上,这台机器可以是虚拟机

通过nginx先把服务给代理一下,本机上就可以通过localhost访问到了

比如,我现在要把我的jellyfin服务映射出去。

http://192.168.188.167:8096

就需要nginx之类的反代工具了,其他的类似的caddy也是可以的,不过我个人是喜欢用nginx的。

首先安装nginx

sudo apt install nginx -y

创建并配置/etc/nginx/conf.d/jellyfin.conf


server {
    listen 8801;
    
    server_name _;
    charset utf-8;


    keepalive_timeout 70;

    location / {
        # proxy_redirect off;
        proxy_pass http://192.168.188.167:8096; # port
        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;
    }


}

重启nginx使配置生效

systemctl restart nginx

查看服务是否已经启动

netstat -nltp
# 看到8801已经启动了

重新配置funnel 443指向8096

tailscale serve https / http://127.0.0.1:8096
tailscale funnel 443 on
tailscale funnel status
#https://example.pango-lin.ts.net (Funnel on)

刷新你的页面,可以看到页面已经变成了jellyfin,至此就完成了内网服务到公网的映射。

速度取决于你的搭建tailscale的节点到tailscale的服务器的速度,并不快,但是免费的服务

这个funnel功能适合实在没有办法的朋友,可以用于一些文字类的内网服务或者用于临时的内网服务管理。

你可能要问能不能搭建一个中间服务器提速啊

你是不是傻,如果你能自己搭建中间服务器,你有一台独立ip的vps,你还需要这个东西做什么呢,直接搭建ngrok、frp等等,他不香么

给vps(linux)搭建一个漂亮美观的实时监控服务

imajeason阅读(531)

随着迷恋上各种服务自建,买了几台vps,配置都很低,动不动就出问题,等到使用的时候才发现服务坏掉了,我意识到一个监控服务是必须的。

在我的职业生涯中,linux监控服务使用过监控宝,后来是nagios,zabbix。

但是这两个东西的界面都非常简陋,甚至有些丑。

直到一个群友给我推荐了Prometheus+Grafana

Grafana是什么

Grafana是一跨平台的开源的可视化分析工具,目前网络架构和应用分析中最流行的时序数据展示工具,主要用于 大规模指标数据的可视化展示。 快速灵活、易用性强的客户端图表,丰富的仪表盘插件,让复杂的数据更加直观。

简单来说,grafana是一个界面,数据通过api接口读取展示

这里用的数据源是Prometheus,当然,其他的监控工具也可以使用grafana作为界面使用,但是相对来说prometheus占用资源更少

Prometheus 是什么

现在最常见的 Docker、Mesos、Kubernetes 容器管理系统中,通常会搭配 Prometheus 进行监控。 

Prometheus [prəˈmiθju:s] 普罗米修斯 Prometheus 基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供 HTTP 接口就可以接入监控系统,不需要任何 SDK 或者其他的集成过程。这样做非常适合虚拟化环境比如 VM 或者 Docker 。

输出被监控组件信息的 HTTP 接口被叫做 exporter。

目前互联网公司常用的组件大部分都有 exporter 可以直接使用,比如 Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等),具体支持的源看:https://github.com/prometheus。 

exporter ([ekˈspɔ:tə(r)] 出口商)对比主流的监控工具的操作界面:nagios 监控界面:

zabbix 监控界面

通过上面的界面,我们可以看出来 Grafana+Prometheus 展示界面更美观 1.1.2 Prometheus 架构图解普罗米修斯(Prometheus)及其一些生态系统组件的整体架构:

搭建过程

主服务器安装Prometheus+Grafana

操作系统:Centos7.6

安装Prometheus 

Prometheus 项目主页:https://github.com/prometheus/prometheus/

根据自己的操作系统选择合适的包

# 查看操作系统版本
cat /etc/os-release 

#NAME="CentOS Linux"
#VERSION="7 (Core)"

yum update
yum install wget

# 下载prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.40.2/prometheus-2.40.2.linux-amd64.tar.gz
tar zxf prometheus-2.40.2.linux-amd64.tar.gz -C /opt
mv /opt/prometheus-2.40.2.linux-amd64 /opt/prometheus

配置开机启动

vim /usr/lib/systemd/system/prometheus.service
# content #
[Unit]
Description=prometheus service
 
[Service]
User=root
ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --storage.tsdb.path=/opt/prometheus/data
 
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=multi-user.target

启动服务

systemctl daemon-reload
systemctl enable prometheus --now
systemctl status prometheus

开启防火墙端口9090

# 如果防火墙未开启就不用打开端口了#
firewall-cmd --zone=public --add-port=9090/tcp --permanent
firewall-cmd --reload

浏览器里访问 http://ip:9090

安装Grafana

设置官方源

vim /etc/yum.repos.d/grafana.repo

[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

如果是国内服务器最好是设置中文源

vim /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm
repo_gpgcheck=0
enabled=1
gpgcheck=0

安装

yum makecache -y
yum install grafana -y
systemctl daemon-reload
systemctl enable grafana-server --now
systemctl status grafana-server

开启防火墙端口3000

# 如果防火墙未开启就不用打开端口了#
firewall-cmd --zone=public --add-port=3000/tcp --permanent
firewall-cmd --reload

浏览器里访问 http://ip:3000

默认用户名密码都是admin,初次登录会要求修改默认的登录密码:

Grafana
Grafana

添加Prometheus数据源

点击主界面的“Add your first data source”并选择Prometheus:

Prometheus+Grafana

Dashboards页面选择“Prometheus 2.0 Stats”进行Import:

Settings页面填写普罗米修斯地址并保存:

切换到我们刚才添加的“Prometheus 2.0 Stats”即可看到整个监控页面:

安装配置 node_exporter

这是被监控端需要安装的,因为主服务器本身也要监控,所以也要安装

项目主页:https://github.com/prometheus/node_exporter

wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
tar xf node_exporter-1.4.0.linux-amd64.tar.gz -C /opt/

mv /opt/node_exporter-1.4.0.linux-amd64/ /opt/node_exporter

创建 node_exporter 系统服务启动文件

vim /usr/lib/systemd/system/node_exporter.service

#Prometheus Node Exporter Upstart script
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=root
ExecStart=/opt/node_exporter/node_exporter

[Install]
WantedBy=default.target

启动node_exporter

systemctl daemon-reload
systemctl enable node_exporter --now
systemctl status node_exporter
# 服务启动后可以用 http://localhost:9100/metrics 
# 如果防火墙未开启就不用打开端口了#
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --reload

浏览器里访问 http://ip:9100/metrics 测试 node_exporter 是否获取到节点的监控指标。

Prometheus配置文件添加监控项:

vim /opt/prometheus/prometheus.yml

# 务必注意格式,多少个空格就是多少个空格,不然会报错。

  - job_name: 'linux-master'
    static_configs:
    - targets: ['localhost:9100']
      labels:
        instance: linux-master

重启prometheus

systemctl reload prometheus.service

回到Grafana的主界面,grafana导入画好的dashboard:

下载json文件:https://picture-bed-iuskye.oss-cn-beijing.aliyuncs.com/prometheus/node-exporter_rev5.json

其他的exporter:

https://cloud.tencent.com/document/product/1416/56041

修改名字,选择我们前文创建好的数据源,点击导入即可:

下面这个提示是grafana缺少相关显示需要用到的插件piechart,grafana的默认插件目录是/var/lib/grafana/plugins,可以将下载好的插件解压到这个目录,重启grafana即可

安装插件

grafana-cli plugins install grafana-piechart-panel
grafana-cli plugins install digiapulssi-breadcrumb-panel
grafana-cli plugins install grafana-polystat-panel
 
systemctl restart grafana-server

查看已安装插件:

/usr/sbin/grafana-cli plugins ls
installed plugins:
grafana-piechart-panel @ 1.3.3

再刷新grafana页面,即可看到我们刚才设置好的node监控:

被监控主机:

其他被监控vps只需要安装node_exporter

打开防火墙,允许服务器访问Prometheus 端口

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="Pro主机的ip" port protocol="tcp" port="9090" accept"
firewall-cmd --reload

去grafana添加数据源

同上

报警设置

邮箱告警

ttelegram告警

Tailscale高级用法,route与exit-node实现局域网穿透与代理出口功能

imajeason阅读(2453)

之前给大家介绍过tailscale的基础用法,通过tailscale基础的虚拟组网功能,实现一个vpn网络。

组网成功后,每一个节点都可以分配到一个虚拟ip,通过虚拟ip就可以让网络中的设备实现点对点的互联,从而实现内网穿透。

但是tailscale能做到的远远不仅如此,它可以实现更加高级的功能,这些高级功能非常实用,对我来说不能没有的功能。

不看完亏死不负责,实现这些功能后你会感叹tailscale的强大。

tailscale高级组网

哪些高级功能

今天要给大家介绍的第一个是route功能,在之前的视频中有提到,通过虚拟路由实现通过一个节点访问到节点所在局域网的所有内网设备。

第二个是通过openwrt实现局域网里所有的设备都可以访问到节点能够访问的虚拟设备,实现整个局域网访问虚拟网络,而不是让所有的设备都加入虚拟网络。

第三个是通过exit-node出口节点功能实现设备的异地出口访问,让设备可以通过指定节点作为出口进行上网,比如科学上网功能,实现全局的代理功能。

继续观看提示

1、因为具体的配置要根据你的网络情况来决定,我下面会给出案例配置命令,但是千万不要直接复制,因为复制了过去配置出来肯定是错误的,你的网络不可能跟我的一模一样。

开始讲之前我先跟大家解释一下为什么这个视频的主要内容是讲解,而不是演示。

大家只要明白了这其中的原理,就很容易实现了,具体的配置就是几条命令。

2、在继续观看该视频之前请先观看我之前的tailscale篇,能够基本的使用tailscale。

至于derp篇,绝大部分人并不需要自行搭建,如果你不知道是否需要搭建那你肯定不需要搭建。

而headscale是tailscale的开源版,同样不是必须的,用tailscale就足够了,需要的人自然知道自己需要。

3、所有作为出入口或者路由节点使用的设备都需要开启转发,如果你设置好了功能但是无法成功访问的话就在对应节点上打开他们

echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf

现在我们去实现它们

1、路由功能route

tailscale 虚拟路由

这是两个局域网,a,b

现在设备A1要想访问B1,第一个方法是让这两台设备都加入虚拟网络,这也是tailscale等组网工具的基本功能。

加入虚拟网络后,通过tailscale的后台可以看到两台设备都会获取到虚拟ip,这个ip是tailscale给分配的,这两台设备通过虚拟ip可以实现访问。

现在A1也要访问B2,我们怎么办呢,是不是可以再让设备B2也加入虚拟局域网,同样通过虚拟ip可以访问。

那设备更多呢,是不是每台都要加入虚拟网络,这样不仅麻烦,还要你管理每台设备的虚拟ip,非常不方便。

更好的方案是我们去B网络中找一台不关机的设备B3,让他加入虚拟局域网,然后让他声明advertise-route=192.168.2.0/24。

tailscale up --advertise-route=192.168.2.0/24 --accept-routes=true --accept-dns=false
# 后面两个参数另有他用

意思是我可以作为192.168.2.0段的路由,为访问本局域网的请求做数据转发。

tailscale 虚拟路由

去tailscale后台,对设备B3的声明做许可

tailscale开启route

现在,任何加入虚拟局域网的设备,只要开启use tailscale subnet,就可以直接访问到B2段中所有的设备,访问的ip就是他们的内网ip,192.168.2.x

在windows客户端上勾选subnets

tailscale-windows客户端

这是如何实现的呢,一旦做完上面的操作,在所有加入虚拟网的设备都会获得一条route信息,让所有需要访问192.168.2.0的数据都通过设备B3来进行转发

这就实现了我们说的第一个虚拟路由功能。

2、局网穿透openwrt

我们实现了通过虚拟路由让所有的节点都可以通过内网ip访问到B网络的设备了

但是别忘了A网络里也有很多的设备,他们都想可以直接访问B网络的设备怎么办呢

tailscale 虚拟路由

我们也要一台台的把设备加到虚拟网络中么,太麻烦了啊

这时候就需要一台软路由了,让路由器A加入虚拟局域网,而且要accept-routes

tailscale up --accept-routes=true --accept-dns=false
# 后面你会看到,我们实际上也要执行下面的命令,让路由器A同时实现设备B3的功能
# 从而让路由器A即为网络b提供访问a网络的转发,又为网络a的设备提供到网络b的转发
# tailscale up --advertise-route=192.168.1.0/24 --accept-routes=true --accept-dns=false

这样,这台openwrt路由器就可以为通过这台路由上网的所有设备提供穿透服务了,这个路由器下面的所有设备都可以直接访问整个虚拟局域网里的资源了,现在的网络环境来说就是可以访问到b网络的所有设备。

如果你的主路由器不是openwrt怎么办,无法安装tailscale,也可以用旁路由,在主路由A上修改dhcp下发默认路由从192.168.1.1修改为192.168.1.2,这样a网络中所有设备自动获取ip的时候获取到的默认路由就是192.168.1.2,当然你可以通过设置静态地址,手动修改设备A1,A2的默认路由为192.168.1.2实现同样的功能。

tailscale exit-node

这样就完成了

你可能已经想到了,如果b网络的b或者B3也是openwrt,情况会是怎么样的呢

此时,两边的路由器都加入了虚拟局域网并声明了作为本网段的虚拟路由存在,就实现了两个局域网的彻底打通,实现了一个相当于三层交换的功能。

# a的openwrt路由器上#
tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.1.0/24
# b的openwrt路由器上#
tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.2.0/24

这时候,两个网络中的所有设备都如同在同一个网络中一样,均可以通过内网ip进行访问。

3、实现切换流量出口exit-node

因为种种原因,大家可能希望自己的流量通过自己所在网络之外的其他网络中出入。

我们继续拓展上面的网络结构,现在我们还有一台设备x远在香港,我们希望我们的一台设备可以通过这台机器作为上网出口。

以上两个高级配置可以与此操作共存,不冲突。

首先,我们让a网络中的一台a1安装tailscale加入虚拟网络。

tailscale exit-node

我们把香港的这台设备x加入节点,获取虚拟IP。

然后在x上声明advertise-exit-node,意思是它可以作为出口使用

tailscale up --advertise-exit-node

去tailscale的后台,许可这台设备作为exit节点,勾选exit node。

如果没有上面的操作,此处无法操作。

tailscale开启route

现在虚拟网络中的所有设备上就可以看到存在一个exit-node节点了,启用x设备的exit-node。

tailscale exit-node

a设备上所有的流量都会从香港的机器进行出入,也就是说无论你访问任意的网络服务,流量都是从香港的这台x设备进行了中转。

只要你的网络够好,体验还是很ok的。

注意了!!!

1、所有的流量都会从这台exit-node设备出入,这意味着你会耗费大量的带宽和流量,要知道这些都是要花钱的。

2、请遵守当地的法律法规,别做违法乱纪的事情,否则后果自负。

3、作为开源版tailscale的headscale也一样可以实现这些功能route与exit-node,自建headscale并不能为你带来速度上的提升,更多的是面向企业用户,毕竟它没有节点数量限制。

操作不同的地方在于打开route与exit-node许可需要命令行操作

4、zerotier来说,功能1与2都是可以实现的,但是功能3虽然也可以实现,但是设置非常繁琐,不建议使用。

# -i后面的数字是通过命令查看到的具体节点的id号
headscale nodes list
# 输出
11 | OpenWrt                     | openwrt-pkxogrh2                    | [C+q8S] | default   | 10.1.0.2, fd7a:115c:a1e0::2  | false     | 2022-11-07 01:53:12 | online  | no     
12 | lucid-cubes-6               | lucid-cubes-6-fodloxix              | [8NBJW] | default   | 10.1.0.4, fd7a:115c:a1e0::4  | false     | 2022-11-07 01:52:50 | online  | no     

# 打开route,许可
headscale routes enable -i 11 -r "192.168.1.0/24"
# 打开exit-node,许可
headscale routes enable -i 12 -a

好了,以上,大家点个赞不过分吧。

下期再见!

用NaïveProxy复活vps,一键安装脚本高完成度篇

imajeason阅读(1017)

自从上个视频发布后,许多网友对脚本提出了自己的意见,也给我反馈了不少执行的情况,我进行了相应的修改,所以再发一次视频

这次给大家解释一些疑问,包括为什么naive可以实现隐身以及一些常见问题的处理。

脚本更新后支持安装、修改用户名、更新以及显示证书信息、更新脚本、自动更新证书等

支持的系统是x86的almalinux、centos与debian、ubuntu,暂时不支持arm。

使用的方法也更新了

# 安装 naive命令
curl   https://raw.githubusercontent.com/imajeason/nas_tools/main/NaiveProxy/do.sh | bash
# 执行naive
naive

以后需要管理naive直接执行naive即可

关于naive的一些说明

1,naive如何实现隐身

是否还需要对数据包进行域名伪装,伪装成其他的网站

naive本身就是caddy的一个插件

我们通过安装caddy服务,启动caddy服务,启动一个需要证书的https服务的网站

这意味着它本身就是一个常规网站,正常来说caddy本身就可以为其他的梯子服务提供伪装,既然我们已经使用了caddy就不需要再额外的伪装一次了,脱裤子放屁啊

2、qv2ray无法启动

因为qv2ray很久没更新了,所以支持的v2ray可能版本较老,报错的去下载一个老版本的

3、证书有效期

90天,自动脚本给加了定时任务

可以通过命令 crontab -l查看

之前执行这个脚本的建议使用最新的安装命令重新安装一下,第一版问题不少

4、State: degraded 状态降级

这就是安装失败了,往回滚一下屏可以看到错误输出,根据错误输出进行处理,但是这里还是建议大家使用指定的系统和版本执行脚本

5、dns解析失败导致安装失败的问题

可以修改/etc/hosts文件,添加 一条  

#ip 域名
1.1.1.1   n.abc.com

再执行脚本

 6、ios能不能使用naive

小火箭可以支持,选http2

7、客户端配置

假如配置443端口,选择协议https对应的是tcp的443,quic对应的是udp的443

如果你的443已经被封了,就是https的443被封了,客户端可以选择quic协议继续使用443

但是此时的web网页还是打不开的,正常的。

8、openwrt客户端

passwall、passwall2都是可以用的,其他的我不清楚

大家再有问题就评论留言或者加群吧。

以下展示naive脚本功能

v2ray大面积被封解决方案

imajeason阅读(3456)

10.4号左右我发现我有2台v2ray服务器被墙了。

这两台服务器上搭建的是v2ray,通过nginx进行了ws伪装,通过443端口进行代理,稳定运行了许久,而且这个443端口本身是一个正常的网站

这就是大家常说的tls+ws伪装,被封的端口是443与80,其他端口均正常

然后我去找了一下,发现我的vps遭遇并非偶然

tls被封

许多人怀疑是否gfw具备了精准定位tls流量的能力,但实际上如果这是真的,那不应该出现部分而不是全部被封锁的情况,被封锁的基本上都是流量比较大的vps

但是根据更多的反馈来看,gfw进行的是模糊封锁,也就是说,发现基于tls的大流量访问请求会触发封锁,一旦被封锁服务器更换端口再次被侦测到的话那这个网站可以被确认为是代理服务,被封的可能就是ip了那就真的没救了

s所以大家如果有ip被封了,忍一忍,别换端口

那现在还有什么解决的办法么

  • 1、通过内网穿透,在vps端与客户端搭建一个虚拟局域网,也就是vpn,然后通过虚拟ip进行访问,因为主流的vpn都是udp的端对端加密流量,希望康审查能力会高一点点

但是这么做的缺点是明显的,因为没有隐藏真实ip,一旦审查力度加大也无法躲避被封

  • 2、更换tls协议为utls,但是我测试了一下,没调通,有知道的可以告知一下
  • 3、在443前面再加一层cdn,比如cloudflare的网站保护可以隐藏真实ip,而是通过公共ip访问网站

这个方法会极大降低网站的访问速度以及稳定性,但是相对于无法访问来说,慢点也不是什么缺点了

至于xray的xtls已经确认无效了,xtls作为xray的主流加密方案已经被gfw预判了,并不能有效避免被封,从这个角度来说,gfw识别tls流量用的可能真的不是流量特征,而是大数据审查之类的基于行为的识别,这就很可怕了,如果真的是这样,那么以后就不能24消失挂着梯子上网了,对我们高度依赖梯子的朋友来说可能会比较煎熬。

  • 最后一个方法就是以逸待劳了,这段时间先不要翻了,耐心等待,一段时间后可能会自动解封了

希望这段时间赶快过去,也希望更好的方案出现,要么就是马斯克对中国开放星链,让gfw成为历史

启用Cloudflare CDN

注册cloudflare账号

注册cloudflare的免费账号非常的方便,注册时只需要输入email地址和密码(登录cloudflare的密码,非email密码)即可,不会像国内网站那样要你填写各种个人信息的,基本上不用担心隐私问题。注册界面如下:

注册地址直达:https://dash.cloudflare.com/sign-up

首次注册成功后,会跳转到让你添加网站的界面,如下图所示:

选择free计划,继续

会检测你填写的域名已经有的dns解析

下图提示你需要去域名现有的注册商管理界面修改dns server为cloudflare指定的两个dns server

在域名服务商完成操作后,点击Done

可能需要等待一段时间才能生效

同时因为大概率你已经启用了tls,这意味着你的服务器上已经有了证书,不需要使用cloudflare提供的证书

这就需要去ssl选项,修改为完全

等待dns生效,你会发现你的域名解析目标ip已经不是你的服务器了,而是cdn提供的服务器

vps复活。

Headscale-ui使用

imajeason阅读(1078)

给Headscale搭建一个内网穿透设备管理界面,实现一个易用的开源版Tailscale

前面做了一期自建内网穿透工具headscale服务搭建的视频,有一些朋友反馈没有界面不方便后续使用

今天我们就给headscale一个界面,实现一个更加接近tailscale的管理后台

首先回顾一下headscale搭建过程

观看本期视频之前首先要看我之前搭建headscale服务的视频

需要derp服务的就看derp服务的视频

确保服务可用的情况下,继续

现在headscale服务器上有了nginx反向代理,将headscale的端口代理到了443端口,也就是默认的https端口上

打开浏览器显示是有证书的页面,且无任何错误信息

headscale-ui项目首页:https://github.com/gurucomputing/headscale-ui

根据项目描述得知,headscale-ui是静态网站,那就好说了,因为我们已经使用了nginx做headscale的反向代理

 再给ui也代理一下就可以了,打开release,找到最新的压缩包,复制下载地址

现在ssh到服务器,下载它

yum update
yum install unzip wget
mkdir -p /html/headscale-ui 
cd /html/headscale-ui
wget https://github.com/gurucomputing/headscale-ui/releases/download/2022.09.13-beta/headscale-ui.zip
unzip headscale-ui.zip
chown -R nginx:nginx /html/headscale-ui

 然后修改nginx配置,derper.conf从哪里来的,不知道的看我headscale服务搭建篇

cd /etc/nginx/conf.d/
vim derper.conf
# 增加配置
location /web {
        alias /html/headscale-ui/web;
        try_files $uri $uri/ /index.html;
}
# 

下面为完整配置

server {
    listen 80;
    server_name t.dongvps.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}

server {listen 443 ssl;
    
    server_name t.dongvps.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/t.dongvps.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/t.dongvps.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    keepalive_timeout 70;


    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8080; # port
        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;
    }
    location /web {
        alias /html/headscale-ui/web;
        try_files $uri $uri/ /index.html;
    }

}

按esc 输入:wq 保存后,重启nginx服务

systemctl restart nginx

打开浏览器输入 

https://t.dongvps.com/web

不出意外的话,你就能打开首页了

会提示输出apikey,点击settings

回到ssh,如果你是用的docker

docker container ls
# 获取到容器的id
 docker exec id headscale apikeys create
 # 获取到一个apikey

如果是go自行安装的headscale服务

那就直接执行

headscale apikeys create

得到apikey,得到的apikey填入设置,以及headscale的服务首页也填上

保存之后就可以了

这里就要注意了,重点说明

因为是静态站,所以服务端是不保存任何信息的,这意味着你刚才填写的apikey只在你当前浏览器上保存着,无论你更换一个浏览器还是更换一台电脑,都需要重新设置apikey

t同时也意味着这个页面只要开着谁都可以访问,只不过只有你可以生成apikey所以只有你自己可以管理你的headscale服务

基于以上情况,我建议大家尽量使用命令行来操作

下面简单说一下headscale-ui的使用

设置完apikey之后,userview可以查看namespace命名空间

headscale-ui

z在这个界面可以添加命名空间,每一个命名空间可以认为是一个虚拟子网,同一个命名空间的设备才能互通

device view可以查看已经加入的设备

此处可以修改设备名称,给设备加tag,选择是否允许该设备为指定网段启用虚拟路由

而新增设备的话,同样的需要先在设备上通过tailscale命令发起,获取到key

填写过来,选择命名空间,添加即可

好了,headscale ui的使用说明就这么多了

有问题的跟我留言,

自建知识管理平台trilium

imajeason阅读(428)

j今天跟大家聊聊笔记应用,最早的时候我们用系统自带的笔记本,只有文字,一个自带笔记本解决一切,然后就放在电脑硬盘里,那时候我觉得硬盘就是世界上最安全的文档居所

h后来有一个应用叫evernote,进入中国市场后,它得名字叫某象笔记,那时候无数人赞美它,给它钱,成为它的用户

一个随手笔记凭什么收我的钱,更多的人觉得免费账户就可以了,

eevernote官方对此表示了强烈不满,一再降低免费账户的终端限制数量,然后在运行中不停的校验连接的终端数量,极大的降低了用户体验,那段时间我是直接骂它娘的

再就是无处不在的广告,即使你交了会员费,广告也不会放过你,我不晓得evernote官方在想什么,或许它认为用户习惯已经养成,只能乖乖交钱

于是,这个应用成了一坨狗屎,不停的给用户喂,为你写诗

z在这期间有有道云笔记,为知笔记,但是他们只是evernote的模仿者,即使有一些自己的特色,但是并不足以取而代之

b不久后一个划时代的应用出现了,它叫notion,这个应用是如此的强大,

在整个架构上它是一个wiki,无线目录层级,每一层都可以存放内容

z在功能上,它有很多非常高级的特性,甚至有database功能,

但是在中国大陆你是打不开这个应用的,这是每一个涉及到内容分享功能的应用的宿命

d即使如此,notion依旧拥有巨大的用户群体,足以昭示它的强大

w我甚至为它掏了钱,还把evernote上所有的笔记一篇篇的放到了notion上,然后删掉了evernote

为什么我还在寻找笔记应用呢,

互联网发展太快,互联网的服务更新换代太快了,一代又一代

s商业公司的寿命是短暂的,而商业产品的寿命是更加短暂的,强大如谷歌,被杀死的应用也是不计其数

w未来比notion更加优秀的知识管理工具一定会出现,那时候我又要经历一次数据的大迁移,这个过程是痛苦的甚至是具有风险的

无论是学习还是工作,抑或是生活,我们都有很多需要记录的文字,这个需求确实永恒的,

从第一次摸到那排列奇怪的键盘,从第一次走入陌生的网易聊天室,从申请的第一个邮箱账号,从申请的第一个qq号

在互联网上,你的数据从来就不属于你,而是被用来叫价的筹码

w我需要一个可以由我掌控的应用,管理属于我的数据,

似乎markdown就可以帮我完成这一切

我试图使用vscode+git+gitlab的方案,通过markdown插件实现了图文笔记编辑展示,实现版本管理与数据备份

但是我很快意识到这样的方式只能实现基本的笔记应用,这远远不够

y于是我总在有意无意的关注笔记应用

z终于有一天,我发现了一个叫trilium的docker镜像

好奇心驱使下,我搜到了这样的评价:超高自由度的个人知识库

分层级的知识库

首先,它是一个分层级的知识库,同notion一样,在trilium中,文件夹的概念消失了,一切内容都是节点,一个节点可以是内容节点,同时也是父节点,每一层节点都可以有自己单独的内容格式存放单独的内容,并且组成更加复杂的结构

g更加神奇的是,trilium中节点可以被复用,同一个节点可以是不同节点的子节点,通过这种克隆和分支,trilium中的节点不是分支树,而是一个网状树

z这个功能有什么用呢,一个节点的不同维度可以成为一个特征节点,一个节点无论被多少节点引用,只要一次修改,所有的视图中都可以看到这个修改

b版本管理

trilium会把每次保存的内容保存成一个新的版本,这意味着你可以轻易找到被你删掉的内容,误删除,误修改都不是事。

在任何商业产品中,版本管理都是超高级的vip功能

j加密笔记

每一篇笔记都是可以单独加密的,这个功能有多好只有用的到的人才懂啊

w网页剪辑

z这个功能基本不需要多说,笔记应用必备,一键保存我们找到的文档到笔记中,也可以把网页截图保存

l另外,trilium会把内容自动保存在对应日期节点中,这个不知道能不能修改成可以自由选择,知道的朋友请告诉我

f富文本支持

通过markdown实现,笔记编辑使用的是ckeditor,支持直接粘贴markdown内容,如果你在使用其他的笔记应用,要想使用trilium是没有迁移困难的

d多媒体和文件管理

ttrilium的文件管理不依赖外部目录,这些多媒体文件也是节点的形式存在在trilium数据库中,这意味着,它可以很容易实现全平台同步

f值得一说的功能

btrilium中没有文件夹与笔记的区别,只有节点,而节点是有属性的

笔记类型,文本就是普通笔记

关系图,可以做类似族谱的东西

x渲染笔记,

h画布,顾名思义,画布可以直接用来画图,我测试了一下,这个画布甚至支持手写板压感。。。

s书,应该主要是做读书笔记之类的

w网页视图,

d代码,支持多种常见代码格式,码农应该很喜欢

以上是笔记相关的功能

多平台支持

ttrilium可以作为一个单独的本地笔记应用来使用,数据的备份可以通过把数据同步到网盘里来实现

d但是作为一个docker爱好者,对服务平台的搭建是必不可少的

ttrilium可以通过docker镜像搭建成一个服务,然后其他的终端可以直接与服务器定时的同步,来保证笔记数据的一致

l另外windows客户端也可以是可以作为服务端来使用,如果是单机使用 可以以此用来给浏览器剪辑插件使用

搭建trilium服务非常简单

docker run -d --restart unless-stopped --stop-timeout 300 \
	--name trilium \
	-p 8080:8080 \
	-v /srv/dev-disk-by-label-data/dockers/trilium:/home/node/trilium-data \
	-v /srv/dev-disk-by-label-data/dockers/trilium/backup:/home/node/trilium-data/backup \
	-e TZ=Asia/Shanghai \
zadam/trilium:0.54.3

z注意-v 后面的冒号前面的是你的nas或者linux服务器的真实目录,需要根据你的情况自行修改,冒号后面的是容器内的目录,不要修改

r然后在windows客户端,填上搭建的服务,http://ip:8080,提示同步成功后就可以了

每次修改完毕后,左下角的同步标识会标记星号,定时自动同步,也可以手动同步

e而浏览器插件剪辑也需要与服务器端进行同步,填写上服务器端的ip和端口以及密码

x现在就可以愉快的使用这个笔记应用了

s说实话,这个笔记应用对我来说几乎是一个完美的应用,除了它没有移动客户端

z在移动端如果想要使用的话,只能通过内网穿透然后在移动端通过浏览器打开服务端来使用,虽然颇有不便,但是应急还是可以的

r如果对此你颇有不屑,认为没有移动端的应用不是好应用,但我想说的是,对于一个功能如此强大的笔记应用,要完全在移动端复现它的功能并不容易

z做一个免费开源的笔记应用,它已经足够好了,如果您有足够的实力,请给它做一个移动端,如果它足够好用,我相信,会有足够多的人愿意为此付费。

从txt到markdown

c从某象到notion

w我们有很多需要记录的思维碎片,但互联网是不可靠的

j几乎没有可以永久为我们提供服务的互联网存在

s随着互联网基础设施的升级,互联网用户的需求也在快速的变化,那些曾经辉煌美好的应用慢慢的死掉,一起埋葬的还有我们人生的美好回忆

不知道从何开始我有了积攒数据的习惯,尽可能把一些重要的数据存放在我自己的手中,

硬盘1t不够就4t,4t不够就10t

1块不够就2块,2块不够就4块

nas一台不够就两台,两台不够就三台

r人们常说时间可以消磨一切,那是因为人无法记住很多东西,时间消磨得不是痛苦或者美好,而是记忆

有了那些不灭的记忆我才之所以是我

j就让nas中一块块的硬盘帮我们保存记忆

以上,请享受trilium为你准备的美好

别忘了关注,我是张大七

那下期再见了。

搭建derper服务给tailscale/headscale提高稳定性

imajeason阅读(1741)

为什么搭建DERP

tailscale以及headscale是当下最好的组网方案,是基于wireguard的优化实现,可以搭建私有的vpn网络实现,

derp relay server是tailscale设计来提高组网性能的服务,在点对点无法直连的情况下提供保底穿透

NAS讨论群:https://bit.ly/3BPV1vg
内容:
00:00 derp是什么
03:36 docker安装derp
05:20 golang编译安装derp
06:50 免费证书申请
07:38 nginx反向代理
08:41 tailscale使用derp
09:25 headscale使用derp
10:15 derp开启验证

用来内网穿透,用来神奇上网,用来组建异地集群,配图

对个人用户来说,所处的网络环境比较复杂,很多时候会无法建立点对点的直连,配图,连接失败

这就需要 derp relay server,derp不仅是一个中转服务器,它也有stun的功能

tailscale官方在许多国家都有derp 服务器,这是列表,如果没有条件自建的可以去挑官方的来使用,

https://login.tailscale.com/derpmap/default

一方面毕竟是异国他乡,一方面公共服务器带宽有限用的人多了就体验很差了。

为了保证穿透的可用性和体验,我们就要付出一些成本,搭建一个私有的中转服务 derp relay server

derp服务有一个特点

节点与节点进行连接时,会首先通过derp服务进行中转连接,以此让穿透立刻实现,因为中转服务是可以保证100%连接成功的,配图

然后,derp服务尝试让两个节点进行点对点的直连,如果直连成功,derp不再中转数据

否则,穿透会一直通过derp进行中转 

所以derp是可以极大的提高穿透体验的,但是,总要有个但是

derp服务搭建完毕后,别人只要知道了你的域名和端口就可以白嫖你的服务了,难受

搭建derp服务有两种办法

方案一是通过docker安装,但是需要下依赖包,速度会比较慢,甚至安装失败,最好的办法其实就是要么不停的重试,要么用神奇上网

一种是下载安装二进制文件,在服务器或者vps上配置golang环境,编译安装,但是如果你的服务器在中国国内,那安装依赖和编译都是非常痛苦的

docker安装

确保vps上docker运行正常

# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl start docker
systemctl enable docker
docker info

部署derper


  docker run --restart always \
  --name derper -p 81:12345 -p 3478:3478/udp \
  -e DERP_ADDR=:12345 \
  -e DERP_DOMAIN=域名 \
  -d ghcr.io/yangchuansheng/derper:latest
  
  # nginx会把81反代到443
  
  
  # 如果不是用nginx代理的话就要直接把证书申请好
  docker run --restart always \
  --name derper -p 12345:12345 -p 3478:3478/udp \
  -v /root/.acme.sh/xxxx/:/app/certs \
  -e DERP_CERT_MODE=manual \
  
  -e DERP_ADDR=:12345 \
  -e DERP_DOMAIN=域名 \
  -d ghcr.io/yangchuansheng/derper:latest
  
  # 查看容器运行情况
  docker logs -f derper
  

编译安装

上面是docker安装的过程,如果你不想用docker,也可以直接编译安装

安装golang环境,版本必须大于1.16

wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz 
# 注意 #
# 如果是升级golang,先删掉原来的go目录,不然可能会有问题#

在/etc/profile添加

export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
export PATH=$PATH:$GOPATH/bin

刷新

source /etc/profile

安装derp

go version
# 国内可以尝试代理
#go env -w GOPROXY=https://goproxy.cn,direct
#go env -u GOPROXY
go install tailscale.com/cmd/derper@main
derper -h

解析一个域名到这个vps,如果是国内的话域名必须备案才能用,香港的目前还不用备案

域名可以是二级域名,必须是A记录

使用supervisor守护

sudo yum install supervisor

/etc/supervisord.d/derper.conf

[program:derper]
command=/usr/local/gopath/bin/derper --hostname=域名  -c $HOME/derper.conf --stun -http-port -1   -a :81
autorestart=true
user=root
redirect_stderr=true
stdout_logfile=/var/log/supervisor/derper.log
stderr_logfile=/var/log/supervisor/derper-err.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=1

重启supervisord

sudo systemctl restart supervisord
sudo systemctl enable supervisord

申请证书

sudo yum install epel-release -y


sudo pip uninstall urllib3 -y
sudo pip uninstall requests -y
sudo yum remove python-urllib3 -y
sudo yum remove python-requests -y


sudo yum install python-urllib3 -y
sudo yum install python-requests -y
sudo yum install certbot -y



# 申请证书,注意此时vps上的80端口必须是未被占用状态,否则失败#
sudo certbot certonly --standalone -d 域名

# 证书路径为/etc/letsencrypt/live/域名/
# 证书有效期只有3个月,每次更新的时候要先关掉nginx服务,在执行#
certbot renew
systemctl start nginx

nginx反向代理

# centos7 为例
sudo yum install epel-release -y
sudo yum install nginx -y

添加/etc/nginx/conf.d/derper.conf,内容如下


server {
    listen 443 ssl;
    server_name 域名;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/域名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/域名/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    keepalive_timeout 70;


    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:81; # port
        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;
    }
}
systemctl start nginx

systemctl enable nginx

tailscale测试derp

derper搭建完毕,但是要注意,现在任何人都可以使用我们的derper服务,一会加个认证,在此之前,我们先测试下效果

确保你的vps的443端口与3478端口开放

如果你用的是tailscale,打开tailscale控制台,打开access controls

// Example/default ACLs for unrestricted connections.
{
  // Declare static groups of users beyond those in the identity service.
  "Groups": {
    "group:example": [ "[email protected]", "[email protected]" ],
  },
  // Declare convenient hostname aliases to use in place of IP addresses.
  "Hosts": {
     "example-host-1": "100.100.100.100",
  },
  "ACLs": [
    // Match absolutely everything. Comment out this section if you want
    // to define specific ACL restrictions.
    { "Action": "accept", "Users": ["*"], "Ports": ["*:*"] },
  ],
  "derpMap": {
    "OmitDefaultRegions": true,
    "Regions": { "900": {
      "RegionID": 900,
      "RegionCode": "mangoderp",
      "RegionName": "AliHongkong",
      "Nodes": [{
          "Name": "1",
          "RegionID": 900,
          "HostName":"域名",
          "DERPPort": 443
      }]
    }}
  }
}

以下是原内容备份

// Example/default ACLs for unrestricted connections.
{
	// Declare static groups of users beyond those in the identity service.
	"groups": {
		"group:example": ["[email protected]", "[email protected]"],
	},

	// Declare convenient hostname aliases to use in place of IP addresses.
	"hosts": {
		"example-host-1": "100.100.100.100",
	},

	// Access control lists.
	"acls": [
		// Match absolutely everything.
		// Comment this section out if you want to define specific restrictions.
		{"action": "accept", "users": ["*"], "ports": ["*:*"]},
	],
	"ssh": [
		// Allow all users to SSH into their own devices in check mode.
		// Comment this section out if you want to define specific restrictions.
		{
			"action": "check",
			"src":    ["autogroup:members"],
			"dst":    ["autogroup:self"],
			"users":  ["autogroup:nonroot", "root"],
		},
	],
}

headscale使用derp

修改主配置文件config.yaml

paths:
    - /etc/headscale/derp.yaml
    

/etc/headscale/derp.yaml添加内容

# /etc/headscale/derp.yaml
regions:
  900:
    regionid: 900
    regioncode: ahk 
    regionname: AliHongkong 
    nodes:
      - name: 900a
        regionid: 900
        hostname: 域名
        # ipv4: ip
        stunport: 3478
        # stunonly: false
        derpport: 443

重启headscale

# 查看节点#
tailscale netcheck

截止到目前,已经能够使用了

开启https验证

刚才说了,现在derp是没有加验证的,谁都可以白嫖我们的服务,这是不允许的

安装tailscale客户端

直接下载。例如:

https://pkgs.tailscale.com/stable/
wget <https://pkgs.tailscale.com/stable/tailscale_1.28.0_amd64.tgz>

解压:

tar zxvf tailscale_1.28.0_amd64.tgz x tailscale_1.28.0_amd64/ x

tailscale_1.28.0_amd64/tailscale x tailscale_1.28.0_amd64/tailscaled x tailscale_1.28.0_amd64/systemd/ x tailscale_1.28.0_amd64/systemd/tailscaled.defaults x tailscale_1.28.0_amd64/systemd/tailscaled.service

将二进制文件复制到官方软件包默认的路径下:

cp tailscale_1.28.0_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.28.0_amd64/tailscale /usr/bin/tailscale
chmod +x /usr/sbin/tailscaled
chmod +x /usr/bin/tailscale

将 systemD service 配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

将环境变量配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.defaults /etc/default/tailscaled

启动 tailscaled.service 并设置开机自启:

$ systemctl enable --now tailscaled

查看服务状态:

$ systemctl status tailscaled

修改derp启动,加上验证

command=/usr/local/gopath/bin/derper --hostname=域名  -c $HOME/derper.conf -http-port -1 -a :81 --verify-clients=true --stun 

这个验证只是验证是否是允许的域名,并不做身份验证,这意味着,别人只要知道了你的域名和端口,就可以白票你的derper服务,这一点请知晓

相比而言,zerotier的moon服务就没有这个问题了。