技术积累
日进一寸

开源版tailscale,headscale搭建

imajeason阅读(6927)

Headscale 是什么 上一期视频讲了tailscale,Tailscale 是一个收费的vpn服务,免费用户有诸多限制,为了破除这些限制,有开源项目重新把tailscale实现了一遍,项目名称叫headscale

是由欧洲航天局的 Juan Font 使用 Go 语言开发,在 BSD 许可下发布,实现了 Tailscale 控制服务器的所有主要功能,可以部署在企业内部,没有任何设备数量的限制,且所有的网络流量都由自己控制。

目前 Headscale 还没有可视化界面,所有的操作都需要在命令行中完成,但是命令并不多,操作也不复杂。

因为是自建服务,那能自定义的配置就多了,任意定义网段,任意定义命名空间

udp直连会被运营商限速,所以会出现速度骤降,但是ping非常稳定,传速速度页非常稳定。

Headscale 部署

Headscale 部署在 Linux 主机上,随便找台有独立ip的vps就可以了,但是要注意,如果需要穿透的内网无法打洞成功那么流量就会由服务器中转,这意味着穿透后的速度会直接的受限于节点跟服务器之间的网络情况,所以尽量选择离你近的服务器,即使打洞失败了,至少网络还是稳定的,通畅的。

项目主页:https://github.com/juanfont/headscale/

# 下载服务端
wget --output-document=/usr/local/bin/headscale \
https://github.com/juanfont/headscale/releases/download/v0.17.0-alpha4/headscale_0.17.0-alpha4_linux_amd64
# 设置执行权限
chmod +x /usr/local/bin/headscale

准备

#创建配置目录:
mkdir -p /etc/headscale

#创建目录用来存储数据与证书:
mkdir -p /var/lib/headscale

#创建空的 SQLite 数据库文件:
touch /var/lib/headscale/db.sqlite

# 从example 创建 Headscale 配置文件:
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
  • server_url 设置为 http://<PUBLIC_IP>:8080,将 <PUBLIC_IP> 替换为公网 IP 或者域名。
  • 可自定义私有网段,也可同时开启 IPv4 和 IPv6:
  • ip_prefixes: # - fd7a:115c:a1e0::/48 - 10.1.0.0/16
  • 随机端口要打开,否则同一个内网中多个终端会有问题
  • randomize_client_port: true

创建 SystemD service 配置文件:

# /etc/systemd/system/headscale.service
[Unit]
Description=headscale controller
After=syslog.target
After=network.target

[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5

# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale

[Install]
WantedBy=multi-user.target
# 创建 headscale 用户:

useradd headscale -d /home/headscale -m

# 修改 /var/lib/headscale 目录的 owner:

chown -R headscale:headscale /var/lib/headscale

#修改配置文件中的 `unix_socket`:


unix_socket: /var/run/headscale/headscale.sock

# Reload SystemD 以加载新的配置文件:

systemctl daemon-reload

#启动 Headscale 服务并设置开机自启:

systemctl enable --now headscale

# 查看运行状态:

systemctl status headscale

# 查看占用端口:

ss -tulnp|grep headscale

# 创建一个 namespace,以便后续客户端接入,例如:
headscale namespaces create default

# 查看命名空间:

headscale namespaces list

客户端安装

目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器,headscale仅仅是实现了tailscale服务端的功能。

OSSupports headscale
LinuxYes
OpenBSDYes
FreeBSDYes
macOSYes (see /apple on your headscale for more information)
WindowsYes docs
AndroidYes docs
iOSNot yet

Windows客户端

打开http://ip:8080/windows

下载一个注册表修改工具,执行一下

安装tailscale客户端

启动,登陆的时候就会去我们自己的服务器认证了

认证成功获取到ip,客户端就加入网络了

而且windows端做路由也是可以的,如果需要,加上参数–advertise-routes=192.168.188.0/24

打开cmd,执行

tailscale up  --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

再去服务器端查看route,激活路由

headscale routes list -i 1
headscale routes enable -i 1 -r "192.168.188.0/24"

linux客户端

直接下载。查看最新版本: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/

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

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

Tailscale 接入:

tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false
# 如果申请为虚拟网关,需要指定
tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24
# 打开转发
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

执行完上面的命令后,会出现下面的信息:

To authenticate, visit:

http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704

在浏览器中打开该链接,就会出现如下的界面:

https://jsdelivr.icloudnative.io/gh/yangchuansheng/imghosting3@main/uPic/2022-03-20-17-06-08qWbz.png

将其中的命令复制粘贴到 headscale 所在机器的终端中,并将 NAMESPACE 替换为前面所创建的 namespace。

headscale -n default nodes register --key d1614a1407b7554cd368db21f383197802d9c95249130d7b3db256458d9a4043
# 注册成功,查看注册的节点:
headscale nodes list
# 许可路由的话,通过上个命令就可以看到linux节点的id,就是1,2,3,……
# 查看改节点的路由,假如id是1
headscale routes list -i 1
# 许可网关
headscale routes enable -i 1 -r "192.168.188.0/24"
# 再次查看虚拟网关状态,id是1
headscale routes list -i 1
# enabled就是已经启用了

回到 Tailscale 客户端所在的 Linux 主机,可以看到 Tailscale 会自动创建相关的路由表和 iptables 规则。路由表可通过以下命令查看:

ip route show table 52

群晖客户端

项目地址:https://github.com/tailscale/tailscale-synology

下载安装包手动上传到webui,安装启用

登录到ssh命令行

tailscale up --login-server=http://ip:8080 --accept-dns=false

剩下的步骤跟linux一致

如果需要群晖做虚拟网关的话,添加参数–advertise-routes=192.168.199.0/24

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

openwrt客户端

项目地址:https://github.com/adyanth/openwrt-tailscale-enabler

按照项目的安装说明安装即可

安装完成,启动服务后,执行跟linux和群晖相同的命令

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

安卓客户端

稍微麻烦些,需要自己去github上生成release,这里就不写了,直接提供包出来

重点就是指定服务器的地址,如果不指定的话认证服务器是指向tailscale的

要想自己指定服务器需要从项目代码中自己生成一个

可以在github上操作,总体来说费劲一点,这不是本期视频的重点,我就直接把我生成的客户端放到蓝凑云了

https://wws.lanzouw.com/iRZcQ0als9sh 密码:dwsn

安装完成后别直接登录,

登陆页面,右上角有一个use login server,

打开,填上自己的服务器的ip和端口登录,同样会跳转到一个页面

复制给出的命令,修改namespace为default

去服务端命令行执行一下,认证成功

安卓端就搞定了

总体而言,除了安卓端麻烦些,openwrt端耗费的时间长一些,难度不高

zerotier的最佳替代者tailscale

imajeason阅读(3122)

闲话tailscale

前面讲了zerotier,我的评价是zerotier是最简单易用的内网穿透工具,上手容易,操作逻辑非常清晰。

但是没有一个产品会满足所有人的需求,在众多的同类产品中,tailscale无疑是最好的哪个,但是你要问我zerotier与tailscale哪个好,我只能说,我也不知道。

Tailscale 是什么

WireGuard 是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN,它可以轻松地在树莓派这类低端设备到高端服务器上部署。

但是不同于VPN,WireGuard 没有 VPN 网关,所有节点之间都可以点对点(P2P)连接,全互联模式(full mesh),效率更高,速度更快,成本更低。

wireguard图

简而言之,我们可以将 Tailscale 看成是更为易用、功能更完善的 WireGuard。

Tailscale 是一款商业产品,个人用户在接入设备不超过 20 台的情况下是可以免费使用的

(虽然有一些限制,比如子网网段无法自定义,且无法设置多个子网,只能配置一个虚拟路由)。

对于大部份用户来说, Tailscale 已经足够了,如果你有更高的需求,比如自定义网段,可以选择付费。

相比于zerotier,Tailscale更容易添加虚拟路由,任何一个节点就都可以被设置为路由,从而让所在内网被其他节点访问到。

如果你有更高的需求,更多的客户端数量,更多的虚拟网段,更多的虚拟路由,那就需要headscale,不过本期内容是tailscale,headscale等下期。

tailscale可以做什么

  • 让内网内所有的设备和服务都可以被其他节点访问到

使用tailscale

1、申请账户,可以直接使用谷歌账号、github账号

官方网站:申请账号 Tailscale

tips:建议使用微软账号,没有被墙。

登陆成功后,主页上赫然显示所有平台的客户端下载按钮

2、首先是windows,下载安装启动,一气合成。

点击会打开浏览器跳转到tailscale主页,登录状态的话会显示认证成功。

windows客户端就这么好了。

tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

3、linux客户端

直接下载。例如:

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

Tailscale 接入:

tailscale up --accept-routes=true --accept-dns=false
# tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS。如果你对 DNS 有需求,可自己研究官方文档,这里不再赘述。

打开后台

4、openwrt客户端,下载对应版本

https://github.com/adyanth/openwrt-tailscale-enabler

  • 解压到根目录:
tar x -zvC / -f openwrt-tailscale-enabler-v1.28.0-e707d17-autoupdate.tgz
  • 安装依赖:
opkg update opkg install libustream-openssl ca-bundle kmod-tun
  • 启动服务,第一次启动
/etc/init.d/tailscale start 
tailscale up --accept-dns=false --advertise-routes=192.168.188.0/24

因为是第一次启动,会下载 tailscale packag, 会非常慢,等待完成

设置自启动

/etc/init.d/tailscale enable

检查是否存在以下文件

ls /etc/rc.d/S*tailscale*

同样的,完成后去tailscale后台查看是否获取到ip了

设置为虚拟路由的情况

此时未完,打开openwrt的接口,查看是否由tailscale接口了,如果没有就创建一个,防火墙区域,设置为lan

https://yomis.blog/content/images/2022/04/Screenshot-2022-04-23-at-04.01.46.jpg

此时此刻,虚拟路由应该生效了,openwrt所在子网的设备均可被其他节点访问到

5、群晖客户端

https://github.com/tailscale/tailscale-synology

群晖客户端简单了,下载对应版本的包,手动安装

启动,打开tailscale登录页面,认证

群晖担任虚拟路由的情况,同样的,去ssh执行

tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

记得,启动虚拟路由必须去tailscale后端去打开,路由才会生效。

至于安卓与ios客户端就不说了,大同小异的,macos的请自行查找吧

结语

tailscale作为一款商业软件限制还是有的,无法自定义虚拟子网段,最多20台设备的额度,但是大部分人的需求已经足够满足了

至于打洞后的速度,除了打洞本身需要的时间有一些不同,zerotier与tailscale基本没有性能上的差异,他们都是最优秀的内网穿透工具。

本期视频到这里了,我是张大七,下期见。

[万能docker]优秀开源音乐服务器Navidrome

imajeason阅读(2295)

闲话

有朋友问有没有好用的自建音乐服务,答案显而易见是有的,他就是navidrome。

这期视频给大家展示一下基本的使用情况以及如何获取免费的mp3音乐资源。

它是一个全平台支持的音乐服务,服务可以安装在三大系统上,当然也可以直接docker中部署容器。

Navidrome特性

主要特性包括:

  • 处理非常大的音乐收藏库,
  • 几乎可播放任何音频格式
  • 读取并使用你精心标记的各种元数据
  • 多用户,每个用户都有自己的播放次数、播放列表、收藏夹等
  • 资源占用率非常低
  • 多平台,在 macOS、Linux 和 Windows 上运行。还提供 Docker 镜像
  • 适用于所有主要平台的即用型二进制文件,包括 Raspberry Pi
  • 自动监控你的库的变化,导入新文件和重新加载新的元数据
  • 基于 Material UI 的主题、现代和响应式的 Web 界面
  • 与所有 Subsonic/Madsonic/Airsonic 客户端兼容
  • 在传输中进行转码,可按用户/播放器设置,支持 Opus 编码
  • 支持中文界面

第三方客户端支持非常丰富

navidrome部署

申请lastfm api,用来同步红心

https://www.last.fm/api/authentication

docker安装

docker run -d \
   --name navidrome \
   --restart=unless-stopped \
   --user $(id -u):$(id -g) \
   -v /srv/dev-disk-by-label-data/musics/navidrome:/music \
   -v /srv/dev-disk-by-label-data/dockers/navidrome/data:/data \
   -p 4533:4533 \
   -e ND_LOGLEVEL=info \
   -e ND_LASTFM_SECRET=xxxx \
   -e ND_LASTFM_APIKEY=xxxx \
   -e ND_LASTFM_ENABLED=true \
   -e ND_LASTFM_LANGUAGE=zh \
   -e ND_TRANSCODINGCACHESIZE=200 \
   -e ND_ENABLETRANSCODINGCONFIG=true \
   -e ND_LOGLEVEL=info \
deluan/navidrome:latest

/srv/dev-disk-by-label-data/dockers/navidrome/data 用来存放配置文件,但是因为参数都写在生成docker的env里了,配置文件无所谓了

/srv/dev-disk-by-label-data/musics/navidrome 用来存放音乐文件,目录也可以扫描,直接网里丢就行

navidrome使用

部署完成后,浏览器打开ip:4533

注册账号,使用即可

文件放到音乐目录后刷新页面就可以看到音乐列表了

移动端,我使用了substreamer

服务器就是ip:4533,账号密码就是申请的密码

为了使用方便,建议配合内网穿透使用,否则出了家门就听不了歌,我们这个服务还有什么意义呢

音乐获取:产生的一切法律责任自行承担

mp3自建服务有了,辣么mp3从哪里来呀,答案是网易云音乐,但是下载要收费的,不要怕。

这时候你需要一个基于openwrt的路由器,软路由也是一样可以的。

https://github.com/maxlicheng/luci-app-unblockmusic/releases

这个插件的工作原理:

  • 其原理是采用 [QQ/虾米/百度/酷狗/酷我/咕咪/JOOX]等音源 替换网易云变灰歌曲链接
  • 通俗地理解就是通过脚本,将主流客户端的音乐链接汇集到一个客户端上

下载完成后,上传到openwrt,opkg install 逐个安装

安装完成后,打开路由器界面,就有unblock了

选择一下,启动

现在,如果你的这台pc的路由正是指向这台路由器,那么网易云音乐应该可以直接下载了,如果路由器是旁路由,你的pc并没有指向它

那就单独设置网易云音乐代理

自定义代理,旁路由ip,5200端口

重启网易云音乐,再次尝试下载,ok啦

想下就下吧,不过要悄悄的用哈,一般人我不告诉他。

supervisor守护进程,linux系统运维必备

imajeason阅读(1784)

我们的linux服务器上都会跑很多进程,有的是以服务的形式启动,有的是启动系统后自动启动的,但是在运行过程中会因为某些错误而退出,这时候我们就需要一个守护进程用来检查这些服务是否启动了,当然你可以自己的写个定时脚本定时检查,但是更好的方式是使用supervisor来守护他们。

supervisor是python写的,所以需要python环境。

现在的系统都带着python,如果没有的话需要先安装一下,建议使用python3.7.x

有了python,就可以直接通过pip安装,我这边使用的一般是centos

yum install python-setuptools
pip install supervisor

安装好后,配置文件的目录为/etc/supervisord/

echo_supervisord_conf > supervisord.conf
cp supervisord.conf /etc/supervisord.conf
mkdir /etc/supervisord.d/
mkdir -p /var/log/supervisor

然后编辑配置文件vi /etc/supervisord.conf

在文件中修改include,/etc/supervisord.d/*.conf

然后mkdir /etc/supervisord.d建立目录

vim /etc/supervisord.d/*.conf
[program:这里起个名字]
command=python /html/*.py -c /html/*.conf
autorestart=true
user=root
redirect_stderr=true          ; redirect proc stderr to stdout (default false)
stdout_logfile = /var/log/supervisor/name.log
stderr_logfile = /var/log/supervisor/name-err.log
stdout_logfile_maxbytes=50MB   ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)

然后启动即可

systemctl enable supervisord

systemctl start supervisord

可以添加任意数量的被守护进程,还可以打开web管理页面,非常方便。

安装mysqlclient的时候报错OSError: mysql_config not found处理

imajeason阅读(2722)

安装mysqlclient的时候报错了,只需要安装libmysql就可以了。

Complete output (12 lines):
/bin/sh: mysql_config: 未找到命令
/bin/sh: mariadb_config: 未找到命令
/bin/sh: mysql_config: 未找到命令
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/pip-install-todfbram/mysqlclient/setup.py", line 15, in <module>
    metadata, options = get_config()
  File "/tmp/pip-install-todfbram/mysqlclient/setup_posix.py", line 65, in get_config
    libs = mysql_config("libs")
  File "/tmp/pip-install-todfbram/mysqlclient/setup_posix.py", line 31, in mysql_config
    raise OSError("{} not found".format(_mysql_config_path))
OSError: mysql_config not found

安装mysql-devel

centos系统使用yum安装 mysql-devel

yum install mysql-devel

ubuntu 系统apt-get 安装libmysqlclient-dev

apt-get update
apt-get upgrade
apt-get install libmysqlclient-dev

debian 系统

apt install -y libmariadbd18
apt install -y libmariadbd-dev