应使用iptables/nftables或firewalld限制Cockpit仅允许可信IP访问9090端口,禁用cockpit.conf的ListenAddress做白名单;TLS须用真实CA证书或严格匹配CN的自签名证书;禁用SSH密码登录后需确保PAM支持密钥代理或配置SSO;改cockpit.socket为Accept=no可防会话中断,但影响并发性能。

如何限制Cockpit只允许特定IP访问
默认安装的Cockpit会监听所有接口(0.0.0.0:9090),直接暴露在公网等于敞开SSH权限。必须从网络层收紧,不能只靠登录密码。
- 最可靠的方式是用
iptables或nftables拦截非授权IP,例如只放行办公网段:sudo iptables -A INPUT -p tcp --dport 9090 ! -s 192.168.10.0/24 -j DROP
- 若用
firewalld,需明确指定source而非仅加端口:sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="9090" protocol="tcp" accept'
- 别依赖
cockpit.conf里的ListenPort或ListenAddress——它不支持IP白名单,只控制绑定地址;设成127.0.0.1后必须配合反向代理,否则本地也连不上
Cockpit启用TLS但证书不受信怎么办
浏览器报NET::ERR_CERT_AUTHORITY_INVALID不是配置失败,而是你用了自签名证书——这本身是正常现象,关键是如何安全地用下去。
- 生产环境务必用真实CA签发的证书,路径填进
/etc/cockpit/cockpit.conf:[WebService] CertDir = /etc/cockpit/ws-certs
,然后把cert.pem和key.pem放进去 - 测试环境若坚持用自签,别用
openssl req -x509生成通配符证书——Cockpit不认*.example.com,必须用实际访问的域名(如cockpit.internal)作为CN,并在客户端hosts里固定解析 - 重启服务后检查
journalctl -u cockpit -n 50,出现Failed to load TLS certificate说明路径或权限错(证书文件需root:root且600)
为什么禁用密码登录后Cockpit登不进去
Cockpit底层调用的是系统PAM和SSH逻辑,禁用密码不等于禁用Web登录——但配置冲突时会静默失败。
- 确认
/etc/ssh/sshd_config中PasswordAuthentication no生效后,Cockpit仍需能调用pam_ssh_agent_auth或密钥代理;否则会卡在登录页无提示 - 更稳妥的做法是保留密码登录,但用
cockpit.conf强制走SSO:[Session] Sso = kerberos
,再配合krb5.keytab和mod_auth_gssapi - 如果已用
authselect(RHEL 8+/CentOS Stream),执行authselect select sssd --force后,Cockpit才能读取SSSD缓存的用户信息,否则即使LDAP用户存在也会显示“Login failed”
systemd服务被自动重启导致会话中断
Cockpit会话本质是WebSocket长连接,而cockpit.socket默认启用Accept=yes,每次新连接都拉起新进程,旧进程被systemd回收——用户正在操作时突然断开,不是Bug,是设计如此。
- 改成单实例模式:编辑
/usr/lib/systemd/system/cockpit.socket,把Accept=yes改为Accept=no,再sudo systemctl daemon-reload && sudo systemctl restart cockpit.socket - 注意副作用:并发连接数受限于单进程处理能力,高负载下响应变慢;若真需要横向扩展,得上
cockpit-bridge+ 多节点负载均衡,而不是改socket配置 - 检查是否误启了
cockpit-ws的多个实例:ps aux | grep cockpit-ws,多余进程要停掉,否则日志里反复出现Address already in use
真正难搞的从来不是配TLS或写防火墙规则,而是当Cockpit和SSSD、Kerberos、SELinux三者同时介入认证链时,某一层默默拒绝了请求,却只在journal里吐一行Failed to authenticate——这时候得开journalctl -u sssd -f和setsebool -P cockpit_manage_system 1一起看。

















