首先说一下这几天踩过的坑:
根据 lala 的教程,编译安装,装完无法连接,找了很久才发现要看 Tomcat 的错误日志,文件路径在/var/log/tomcat9/catalina.out
,这里面有报错的原因,不过这图里不是英语,如果你是中文界面的话,是讲内部发生了一个错误,而 catalina.out 里出错的原因是 websoket 无法建立。
- Creation of WebSocket tunnel to guacd failed
根据这个错误信息,搜到了 Dae’s blog,他说,由于双栈 IP 的缘故,需要自己建一个 /etc/guacamole/guacd.conf 文件,内容如下:
[server]
bind_host = 127.0.0.1
bind_port = 4822
最好再把 /etc/guacamole/guacamole.properties 这个文件里也指定一下监听地址为 127.0.0.1
guacd-hostname: 127.0.0.1
guacd-port: 4822
照葫芦画瓢这么一搞,果然不再提示 websoket 错误,也能使用 VNC 连接了。
接下来再解决 SSH 只能使用密码而不能使用密钥登陆的问题。
我一直用的 Private Key 是之前用 Termius 生成的,RSA 格式,没想到这个问题让我耗费了一整天的时间。昨天根据 Apache 官方的指南安装的时候恍惚看到对 SSH Private Key 有特殊要求,但这个事已经是我投降躺到床上的时候猛然想起来的,今早起床再翻指南,果然要求必须是 OPENSSH 格式的 Private Key,我当时偷了个懒,想把之前一直用的 RSA Key 给转换成 OPENSSH key ,结果搞来搞去都失败,还不如直接重新生成新 Key 来得快,所以在一台 VPS 上使用下面的命令重新生成了 Key。
mkdir /root/newkey
ssh-keygen -b 4096 -C "admin@gotototo.com" -f /root/newkey/mykey
回答问题后会在 /root/newkey 目录下生成 mykey 和 mykey.pub 这两个文件。
替换 /root/.ssh/authorized_keys ,为了保险起见,先把老的 authorized_keys 做个备份,然后修改 /etc/ssh/sshd_config ,打开允许密码验证登录的选项,重启 sshd 服务,再替换 Key,做这一步是为了以防万一,假如新 Key 无法登录,也不至于失去对 VPS 的管理权:
cd ~/.ssh
cp authorized_keys authorized_keys.old
cat /root/newkey/mykey.pub > ./authorized_keys
nano /etc/ssh/sshd_config
# 找到 PasswordAuthentication no 并在前面加一个 #
#PasswordAuthentication no
Ctrl + X, Y ,回车
systemctl restart sshd
现在下载 mykey 到 Windows,或者查看里面的内容直接在 Windows 主机上新建一个 key 文件,先尝试用 ssh client 软件以密钥登录一下 VPS ,能顺利登入,再到 Guacamole 里新建 SSH 主机,使用密钥登录,结果又不成功。
catalina.out 里面出现了大量 DEBUG 日志,我此刻已经失去了耐心,想再试试 Docker 版能不能继续用,因为之前使用 Docker 版的时候出的问题就是 Webcoket 同样的错误,既然我现在找到了解决的办法,那就再试试 Docker 版。
结果之前在 Docker 里出现过的无法连接的问题没有再出现了,真是玄学!
尝试在 Docker 版里以密钥登录 SSH 成功!
到了这里我已经懒得折腾了,就让我这样不求甚解吧。
下面给出我成功运行的 Docker 配置,要分两次运行:
version: "3"
services:
guacamole:
image: flcontainers/guacamole
container_name: guacamole
# environment:
# EXTENSIONS: 'auth-totp'
volumes:
- ./postgres:/config
- /etc/localtime:/etc/localtime:ro
ports:
- 127.0.0.1:8080:8080
volumes:
postgres:
driver: local
使用 docker compose up -d
启动容器成功之后使用 certbot 签一个证书,然后使用 guacadmin/guacadmin
登录后台,要么修改默认用户的密码为高强度密码,要么新建一个管理员账户,退出重新用新管理员账户登录后删掉 guacadmin 用户。然后该添加 VPS 之类的就添加,测试,成功之后 docker compose down
停掉这个容器,给它加上 totp 认证。
version: "3"
services:
guacamole:
image: flcontainers/guacamole
container_name: guacamole
environment:
EXTENSIONS: 'auth-totp'
volumes:
- ./postgres:/config
- /etc/localtime:/etc/localtime:ro
ports:
- 127.0.0.1:8080:8080
volumes:
postgres:
driver: local
现在再次运行容器,登录后台后就会要求你用 Authenticator App 来扫码,搞定之后,除了使用密码登陆之外还会要求使用 Authenticator App 上的 6 位数字才能登陆,安全性不用再担心了,只是记得别掉了扫码的手机啊!
参考资料:
Guacamole 1.4: “Creation of WebSocket tunnel to guacd failed”