CentOS下搭建WebSSH并配置密码访问
自己平时比较喜欢折腾,手上有一些linux系统的vps,有的时候不在家里或者办公室没有SSH客户端,管理这些vps比较麻烦。这几天在网上逛,发现可以通过搭建网页版的SSH客户端,这下就方便了。只要把webssh放在一台网络比较友好的vps上,那么几乎可以实现随时随地方便地连接和管理我的vps了。今天,就尝试着把网上看到的一些东西整合一下,记录自己搭建网页端webssh的全过程。
安装docker和docker-compose
# 下载docker安装脚本 $ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh $ sudo systemctl start docker $ sudo systemctl enable docker # 下载docker-compose二进制文件 $ curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 $ sudo chmod +x /usr/local/bin/docker-compose # 创建软链接 $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 测试是否安装成功 $ docker-compose version
设定docker-compose设置文件并运行
# 用lnmp vhost add命令新增网站,进入网站目录,创立并编辑docker-compose.yml文件 $ vim docker-compose.yml
将以下配置写入文件中
version: '3' services: webssh: image: dbcawa/webssh container_name: webssh ports: - 9008:8888 restart: always privileged: true
运行docker-compose
# 启动docker-compose $ docker-compose up -d
这时候,理论上来说,访问域名的9008端口,就可以看到webssh的界面了。但实际上,为了安全考虑,webssh是不允许公网上非加密访问的,明文传输很容易被嗅探失去安全。这时,会出现如下错误页面
查看docker-compose的日志文件,提示如下的错误
# 查看日志 $ sudo docker-compose logs -f
配置反向代理
这个时候需要我们配置https加密访问。为了一步到位,我准备使用反向代理,把9008端口的访问转发到80端口上,再使用301跳转强制https访问
# 进入lnmp的网站配置文件目录,备份原配置文件 $ cd /usr/local/nginx/conf/vhost $ cp webssh.yourdomain.com.conf webssh.yourdomain.com.con.bak # 修改配置文件 $ vi webssh.yourdomain.com.conf
将以下一段代码写入配置文件中(网站需提前开启https访问)
location ^~ / { proxy_pass http://127.0.0.1:9008; 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 REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 300; proxy_http_version 1.1; # proxy_hide_header Upgrade; add_header X-Cache $upstream_cache_status; }
这时候,再访问你的域名http://yourdomain.com,就会出现webssh的页面,也不用带9008端口这个尾巴了,而且直接跳转到了https
但是,好像,这样有问题。为什么?因为这样所有人都可以访问这个页面,意味着谁都可以用你的webssh,一来你的服务器暴露在公网上会被入侵,更重要的是坏人肯定会拿你的webssh做跳板搞入侵干坏事,要是这样你就麻烦了。所以,必须给webssh上一道锁,也就是设置用户名和密码访问
设置用户名和密码访问
# 安装密码生成工具 $ sudo yum install httpd -y # 生成用户和密码文件 $ sudo htpasswd -c /usr/local/nginx/password username ## 其中username是用户名,自己可以随便命名 ## 回车后根据提示连续输入两次密码 # 删除指定的用户 $ htpasswd -D /usr/local/nginx/password username #修改用户名和密码 $ htpasswd -D /usr/local/nginx/password username $ htpasswd -b /usr/local/nginx/password username pass ## -D 删除指定的用户 ## -b htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码 ## -p htpassswd命令不对密码进行进行加密,即明文密码
修改Nginx配置文件
# 进入lnmp的nignx配置文件夹,修改相应的配置文件yourdomain.com.conf $ cd /usr/local/nginx/conf/vhost $ vi yourdomain.com.conf
在配置文件中的server
加上认证配置,加入auth_basic和auth_basic_user_file两个项目。这里需要注意,如果你的网站是开启了https的,这两个项目需要加到https的配置中,也就是第二个server中。
server { listen 80; server_name localhost; # ... auth_basic "请输入用户和密码"; # 验证时的提示信息 auth_basic_user_file /usr/local/nginx/password; # 认证文件 location / { root /var/www; index index.html index.htm; } # ... }
# 配置文件修改完成后,重新启动nginx $ sudo service nginx restart
访问刚才的页面,就会弹出对话框,要求进行认证。输入正确的用户名和密码,就可以进入,放心地使用了
贴一个我自己服务器上的配置文件
server { listen 80; #listen [::]:80; server_name yourdomain.com ; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/yourdomain.com; #include rewrite/other.conf; #error_page 404 /404.html; # Deny access to PHP files in specific directory #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } include enable-php-pathinfo.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /.well-known { allow all; } location ~ /\. { deny all; } location / { return 301 https://$host$request_uri; } access_log /home/wwwlogs/yourdomain.com.log; } server { listen 443 ssl http2; #listen [::]:443 ssl http2; server_name yourdomain.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/yourdomain.com; auth_basic "请输入用户和密码"; auth_basic_user_file /usr/local/nginx/password; ssl_certificate /usr/local/nginx/conf/ssl/yourdomain.com/fullchain.cer; ssl_certificate_key /usr/local/nginx/conf/ssl/yourdomain.com/yourdomain.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048 ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem; location ^~ / { proxy_pass http://127.0.0.1:9008; 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 REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 300; proxy_http_version 1.1; # proxy_hide_header Upgrade; add_header X-Cache $upstream_cache_status; } include rewrite/other.conf; #error_page 404 /404.html; # Deny access to PHP files in specific directory #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } include enable-php-pathinfo.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /.well-known { allow all; } location ~ /\. { deny all; } access_log /home/wwwlogs/yourdomain.com.log; }
最后,贴一个登陆进去以后的效果图,简洁朴素大方,使用起来很有感觉。虽然sshwifty似乎功能更多,界面也更好看一些,但它配置起来也更麻烦,还不如这个简单的webssh来的实在。