服务器多了,管理也是个麻烦,主流的集群运维工具——Ansible、Puppet、Saltstatck都是非常出色的工具。不过今天的主角是一个新秀——Teleport,这是一个使用Go语言编写的,高效的现代SSH管理工具。
源码:Teleport
Teleport 是一款可以替代 SSH 工具的新一代服务器集群管理工具,它不仅可以同时管理大量服务器还可以作为一个终端录制工具,它提供了一个直观的 Web 界面来显示终端,也就是说你可以在浏览器操作服务器,在浏览器录制、分享。它是开源的,它运行在你的服务器上。
0. 准备步骤
- 一台服务器
- 一个域名
- 一个SSL证书
服务器自己买,域名自己挑。证书申请:
- 克隆仓库:
首先你得安装git,然后把源码仓库拉回到服务器本地。
$ git clone https://github.com/certbot/certbot.git
- 申请证书:
接下来,你需要关闭所有占用80和443端口的服务,比如Nginx、Apache等。然后执行下面命令,大概会等一会。
$ ./certbot-auto certonly -d shell.zuolan.me
然后会问你:
How would you like to authenticate with the ACME CA?
# -------------------------------------------------------------------------------
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
# -------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
如果你确保你的80和443端口没有被占用,那么选择第二种方式(简单),否则选择第一种,然后按照它的提示操作(祝你好运)。
如果你已经申请过证书会有这种提示(没有就算了):
What would you like to do?
# -------------------------------------------------------------------------------
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
# -------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
选择E,回车,搞定。
1. 安装Teleport
从下面地址中下载最新版本的 Teleport:
https://github.com/gravitational/teleport/releases
解压之后就可以用了,你也可以使用它的安装脚本安装到系统相关 bin 目录,方便直接使用 Teleport 命令。
Teleport 一共有三个小工具,使用过程比较复杂,有机会单独写一篇文章介绍都可以。
直接启动即可:
$ sudo teleport start
[AUTH] Auth service is starting on 0.0.0.0:3025
[PROXY] Reverse tunnel service is starting on 0.0.0.0:3024
[PROXY] Web proxy service is starting on 0.0.0.0:3080
[SSH] Service is starting on 0.0.0.0:3022
[PROXY] SSH proxy service is starting on 0.0.0.0:3023
现在再运行一个 Nginx 前端负载,用于反代后端的Teleport,怎么作自己百度,毕竟每个人使用Nginx习惯都不一样,我直接贴配置意义不大(但我还是要贴上来)。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name shell.zuolan.me;
server_tokens off;
location /generate_204 { return 204; }
# ssl on;
################
# SSL 配置
################
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
################
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
################
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5:!MEDIUM:!LOW";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/nginx/certs/dhparam.pem;
################
# SSL END
################
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
location / {
client_max_body_size 50M;
proxy_pass http://172.16.168.200:3080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
}
}
打开shell.zuolan.me就可以访问到UI界面了。
这个工具提供的 Web 界面是强制使用 HTTPS 访问的,使用 HTTP 将无法打开网页,此外它还使用了谷歌二步验证(离线工具,不用翻墙)作为登录验证,因此你需要手机安装谷歌二步验证应用。
留个链接给不会翻墙的小白:酷安
虽然使用麻烦,但是安全而且界面优雅。
如果你没有域名,也可以打开 Web 界面,输入 https://<你的IP地址>:3080
开头的地址会看到下面的界面:
点击继续前往就可以看到登录界面,如果你要建立私密连接,你必须购买一个域名和申请SSL证书。
打开之后二步验证工具扫描二维码,输入验证码就可以登录了。
现在看到的是服务器列表,因为是一个集群管理工具,所以你可以添加很多服务器进来。
点击其中一台服务器,会直接连接到那台服务器(在这个工具中所有的操作都会被记录下来,你可以回放你的操作):
Teleport 处理特殊符号效果不是很好的感觉,建议使用终端的tsh连接,网页这个只做为备选登录方式。
退出就结束本次会话,结束录制,你可以在界面中查看之前的录制内容:
2. 创建一个用户
这里的用户是指Teleport的用户。
> tctl users add $USER
Signup token has been created. Share this URL with the user:
https://shell.zuolan.me/web/newuser/96c85ed60b47ad345525f03e1524ac95d78d94ffd2d0fb3c683ff9d6221747c2
在浏览器打开返回的链接,输入密码完成新用户注册。
3. 添加节点
> tctl nodes add
The invite token: n92bb958ce97f761da978d08c35c54a5c
Run this on the new node to join the cluster:
teleport start --roles=node --token=n92bb958ce97f761da978d08c35c54a5c --auth-server=shell.zuolan.me
在你的节点服务器执行:
teleport start --roles=node --token=n92bb958ce97f761da978d08c35c54a5c --auth-server=shell.zuolan.me
查看节点(在管理节点执行):
> tsh --proxy=shell.zuolan.me ls
Node Name Node ID Address Labels
--------- ------- ------- ------
localhost xxxxx-xxxx-xxxx-xxxxxxx 10.0.10.1:3022
new-node xxxxx-xxxx-xxxx-xxxxxxx 10.0.10.2:3022
修改节点信息(在节点服务器执行):
teleport start --roles=node \
--auth-server=shell.zuolan.me \
--nodename=db \
--labels "location=virginia,arch=[1h:/bin/uname -m]"
4. 登录
登录到某个服务器
tsh --proxy=shell.zuolan.me ssh new-node
分享操作会话:
> tsh --proxy=teleport.example.com ssh db
db > teleport status
User ID : joe, logged in as joe from 10.0.10.1 43026 3022
Session ID : 7645d523-60cb-436d-b732-99c5df14b7c4
Session URL: https://teleport.example.com:3080/web/sessions/7645d523-60cb-436d-b732-99c5df14b7c4
别人加入当前会话(简单来说就是围观你的操作):
> tsh --proxy=teleport.example.com join 7645d523-60cb-436d-b732-99c5df14b7c4
5. 本地分享
如果你是在一个需要认证网络的内网,申请SSL什么的不太方便。
自己电脑启动,指定服务器角色:
> teleport start --roles=node --proxy=teleport.example.com
然后继续在自己电脑执行:
> tsh --proxy=teleport.example.com ssh localhost
localhost> teleport status
和上面一样你会得到一个会话ID,把它分享给别人,然后你就可以在本地共享终端操作了。
这个办法可以用于分享一堆服务器,并且记录用户的操作。管理起来很方便~