利用 nginx 反向代理 cockpit

cockpit 是什么

cockpit 是 RedHat 维护的一套 linux 服务器管理面板,具备很强的开放能力,可以集成各种应用到管理面板菜单上。

通过 cockpit,运维人员能够以直观的图形化界面管理 podman 容器、监控服务器状态、开关防火墙等。

如何使用

sudo apt install cockpit # debian 系 linux 安装 cockpit。
systemctl enable cockpit.socket --now # 开启 cockpit 服务并设置开机自启。

cockpit 启动后,防火墙开放 9090 端口。

访问 https://host:9090,host 为服务器 IP 或域名。

为什么要反向代理

服务器的管理接口一方面可以使运维人员便捷地管理服务器,一方面也增大了服务器的可攻击面。

一个好的管理接口应该是运维人员能够访问,而其他人不能(或很难)访问。

cockpit 的 9090 端口具有明显的特征,如果对外开放,其他人能轻易地访问到该管理接口。

nginx 通常监听的 80 或 443 端口没有明显的管理接口特征,因此可用以反向代理 cockpit 实现隐藏管理接口的目的。

注意: 请勿在 http 协议下反向代理 cockpit。

前置知识

阅读本篇内容,你需要具备:

  • linux: 了解基本的服务器管理命令。

  • nginx: 了解基本的配置格式。

  • cockpit: 了解基本的使用方法。

操作环境

本文基于 debian 12, nginx/stable 1.22.1-9, cockpit/stable 287-1。

其他系统或软件版本,配置大同小异,设计具体差异处,可参考官方文档。

实现思路

  1. 利用 nginx 的 location 配置指定 cockpit 面板的访问地址。

这里以 /manager/cockpit/ 为例。

  1. 在nginx 的 location 配置节中将流量转发到 cockpit。

可以通过 proxy_pass https://127.0.0.1:9090 实现。

  1. 修改 cockpit 的根页面地址为 /manager/cockpit/。

可以通过 /etc/cockpit/cockpit.conf 文件中的 UrlRoot 字段配置。

  1. 重启软件,验证效果。

提示

修改 cockpit 的根页面地址目的在于,当 location 下的 proxy_pass 将流量转发到 cockpit 时,请求的是以 /manager/cockpit/ 开头的页面。

然而在 cockpit 中是不存在这个页面的。如果不修改 cockpit 的根页面地址,访问 cockpit 会报 404 错误。

具体配置

这里仅提供关键配置,请将配置插入相应的配置节中。

nginx.conf

请在 https 协议的 server 配置节中写入以下内容,请勿将该配置直接写入 http 协议的 server 配置节。

# 反向代理 cockpit
location ^~ /manager/cockpit/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass https://127.0.0.1:9090;
}

提示

  • 上面的配置主要做了三件事,匹配 /manager/cockpit/ 开头的请求并不在继续向下匹配,设置代理请求头,将流量转发到 cockpit。

  • 配置写入后,请用 nginx -t 检测配置格式是否正确。

  • 确认无误后使用 nginx -s reload 重载配置。

cockpit.conf

如果 /etc/cockpit/cockpit.conf 不存在,请执行 sudo touch /etc/cockpit/cockpit.conf 创建该配置文件,并写入以下内容:

[WebService]
Origins = https://127.0.0.1:9090 https://YourDomain
UrlRoot = /manager/cockpit/

提示

  • /etc/cockpit/cockpit.conf 是可选的配置文件,默认不创建,因此可能需要手动创建。

  • Origins 是可接受的域,请将 YourDomain 替换成你的域名,如 www.example.com

  • 配置无误使用 systemctl restart cockpit.socket 重启 cockpit 服务。

  • 更多配置可参看 cockpit.conf

扩展内容

对于某些敏感页面,可使用 nginx 的 basic auth 设置访问密码,主要依靠 auth_basic 和 auth_basic_user_file 两个配置。

值得一提的是 cockpit 的管理面板是不能用 basic auth 加以保护的。原因在于 cockpit 和 basic auth 都使用了 Authorization 这个请求头,因此两者无法兼容。

需要提醒的是,请勿在 http 协议下使用 basic auth,因其用户名和密码仅采用 base64 编码后放入请求头中明文传输。

反向代理的作用是隐藏 cockpit 的访问入口,若想进一步保护该入口,可利用 nginx 的 $cookie_ 开头的变量,判断客户端是否具有相应的 cookie,并加以放行或阻断。

例如在 nginx 的相应 location 配置节中增加:

if ( $cookie_isallow != "ok" ) { return 404; }

以上配置可使没有 isallow 这个cookie,或该 cookie 值不为 ok 的客户端访问该地址报 404 错误。

配合特定的 php 程序下发 cookie,可实现最大化保护 cockpit 管理面板不被未经授权的访问。

以上所述的保护措施,可应用于 nginx 托管的绝大多数页面,例如博客的管理后台、私人网盘的登录页、敏感的不想被他人访问的页面等。

若有不当之处,欢迎批评指正

文章始发于本人博客 雾芽,欢迎造访我的博客。

标签: none

添加新评论