之前对于 ssh 做了一点初步的了解,但是还只是关于指令的了解,并不够深入,今天在尝试无密码连接服务器,或者树莓派终端的时候有了更深入的了解。
ssh 连接方式
在使用服务器的时候,肯定会使用 ssh 指令来连接,详情可以参见这篇博客,但是上面提到的连接方式都是最传统的 ssh 用户名@ip 地址,然后输入用户名的密码。 一方面这种方式效率很慢,如果密码是自己设置的常用的密码,可能连接还会比较顺手,但如果像我之前通过 vaultwarden 设置的强密码,每次连接服务器都要通过打开 vaultwarden 复制粘贴,那这样就麻烦很多了;另外,还有一个很明显的问题就是,这样通过输入用户名密码的方式,给人的感觉就是安全性很低,虽然 ssh 是加密传输的,但是直接把明文密码输入到终端,总感觉是容易被抓取到并破坏服务器的。于是便有了密钥连接。
使用方式
密钥,是通过 ssh-keygen生成的存储在本地的一对密钥值。比如通过以下指令:
ssh-keygen -t ed25519 -C "somnusmac"这样便会在当前用户的.ssh文件夹内生成以下文件夹的两个文件。
➜ somnus-blog git:(main) ✗ ls -l ~/.ssh/id_ed25519*
-rw------- 1 somnus staff 419 4月 27 11:06 /Users/somnus/.ssh/id_ed25519
-rw-r--r-- 1 somnus staff 108 4月 27 11:06 /Users/somnus/.ssh/id_ed25519.pub
➜ somnus-blog git:(main) ✗ 其中-t(type)后面的参数表明的是两个密钥的加密方式,主要有以下几种加密方式:
| 类型 | 生成命令 | 现在是否推荐 | 说明 |
|---|---|---|---|
| Ed25519 | ssh-keygen -t ed25519 | 最推荐 | 现代、快、安全、密钥短,OpenSSH 现在默认也是它。(OpenBSD Manual Pages) |
| RSA | ssh-keygen -t rsa -b 4096 | 可用,但不是首选 | 兼容性最好,老服务器也支持。建议至少 3072/4096 位。 |
| ECDSA | ssh-keygen -t ecdsa -b 256 | 可用 | 也是椭圆曲线算法,但一般现在不如直接用 Ed25519 简单。 |
| DSA | ssh-keygen -t dsa | 不推荐/基本淘汰 | 老算法,不建议再用。 |
| ed25519-sk | ssh-keygen -t ed25519-sk | 高安全场景可用 | 需要硬件安全密钥,比如 YubiKey/FIDO2。 |
| ecdsa-sk | ssh-keygen -t ecdsa-sk | 高安全场景可用 | 也是硬件安全密钥类型。 |
| 然后生成的两个文件呢,id_ed25519是私钥,id_ed25519.pub是公钥,前者是放在自己的电脑上,相当于“身份证”,后者则是你身份的登录信息,要放到服务器、树莓派、github、aur 的远程上。 |
你的电脑:我想用这把公钥登录
GitHub:我查一下这把公钥属于哪个账号
GitHub:给你一个随机挑战,你用私钥签名给我看
你的电脑:用私钥签名,但私钥本身不发出去
GitHub:用刚才那把公钥验证签名
GitHub:验证通过,确认你是这个 key 的持有者至于我提到的,会不会出现公钥很多导致查找速度慢,这个基本是不会的,因为在上传时会把公钥上传到服务器,先找到对应的公钥,然后服务器发一个数值,本地通过私钥对这个数值进行签名,然后把签名原数据发给服务器,再验证。
tailscale
记得当时在搭建那个树莓派上基于 jellyfin 的流媒体网站的时候,当时用的内网穿透方式是 cloudflare 的 tunnel。然后我在尝试在公网环境访问我的树莓派的时候第一时间也想到了使用 cloudflare 的 tunnel,然后也很顺利的连接上了,但是连接的延迟有点不堪入目,所以我把方案换成了另一个 tailscale,感觉这个效果也是非常之好,于是记录一下。
基本原理
tailscale是给所有设备建了一个独属于自己的虚拟局域网。标志就是这些以 100 开头的 ipv4 地址。

其大致的流程是这样的:
你的 Mac 登录 Tailscale
↓
树莓派也登录同一个 Tailscale 账号 / tailnet
↓
Tailscale 控制服务器告诉双方:
你们彼此是谁、公钥是什么、当前可能的网络地址是什么
↓
Mac 和树莓派尝试直接建立 WireGuard 加密连接
↓
成功后,你就可以 ssh 100.71.172.51tailscale 是基于 wireguard的自动组网工具,它能把 Mac、树莓派、服务器组成一个“私人虚拟局域网”,并自动处理密钥、IP、DNS、权限、NAT 穿透和中继。 通常来说,想要两个设备(非局域网)连接,要知道公网 ip、路由器端口有无转发、防火墙是否放行、ip 会不会变这些问题,但是 tailscale 把这些问题都抽象掉了,只需要你保证你的设备都连接进了 tailnet,这些问题都会由 tailscale 来解决。
层级划分
tailscale分为控制平面和数据平面,
控制平面
Tailscale coordination server
登录 / 设备列表 / 公钥分发 / ACL / DNS / NAT 协调
│
│ 只负责协调
│
MacBook ←──────── 数据平面 ────────→ 树莓派
WireGuard 加密通信,优先点对点直连控制层面负责“谁是谁”、“谁能访问谁”。而数据层面则是真正负责两个设备之间的加密通信的。
具体流程
当你执行连接的时候,tailscale 经历了一下过程:
- SSH 客户端准备连接 100.71.172.51:22
- 操作系统查路由表: 100.71.172.51 是 Tailscale 网络地址 所以这包流量交给 Tailscale 虚拟网卡
- Tailscale 客户端发现: 目标设备是 raspberrypi 你有权限访问它 对方的 WireGuard 公钥是 xxx
- Mac 和树莓派尝试建立 WireGuard 加密隧道
- 优先 NAT 穿透直连: Mac ←──── UDP 加密隧道 ────→ 树莓派
- 如果直连失败: Mac ←──── DERP 中继 ────→ 树莓派 但中继看到的仍然是加密包
- 树莓派收到包后解密
- 包被交给树莓派本机的 sshd 服务,也就是 22 端口
- 然后才进入正常 SSH 登录流程: 密码登录 / SSH key 登录 / 权限检查
使用
登录
# 登录(浏览器弹出授权页面)
tailscale up
# 登录并生成二维码(适合无桌面环境)
tailscale up --qr
# 使用 Auth Key 静默登录(适合服务器/自动化)
tailscale up --authkey=tskey-auth-xxxxx
# 登出(断开但保留账号)
tailscale down
# 完全登出并移除账号
tailscale logout状态
# 查看所有节点状态
tailscale status
# 只看活跃连接
tailscale status --active
# JSON 格式输出
tailscale status --json
# 查看本机 Tailscale IP
tailscale ip
tailscale ip -4 # 只看 IPv4
tailscale ip -6 # 只看 IPv6
# 查看某个 IP 对应的设备/用户
tailscale whois 100.x.x.x启用 tailscale
# 启动/停止/重启 daemon
sudo systemctl start tailscaled
sudo systemctl stop tailscaled
sudo systemctl restart tailscaled
# 查看 daemon 日志
tailscale debug daemon-logs
journalctl -u tailscaled --since="1 hour ago"安装
# linux
curl -fsSL https://tailscale.com/install.sh | sh
# macos
brew install tailscale安装后的流程
curl -fsSL https://tailscale.com/install.sh | sh
sudo systemctl enable --now tailscaled
sudo tailscale upcloudflare tunnel
对于 tailscale 你想要连接的每一个设备都需要登录自己的账号,但如果想要有一个公用的服务器(大家都能登录的),这时候 cloudflare 就会更方便。
使用方法
首先要有一个 cloudflare 账号,然后创建连接器(tunnel)💩翻译,我找了好久都没有找到 tunnel。

然后按照他的安装指令在服务器上安装对应的包:

评论
注册或登录后即可评论。