说实话,看到 CentOS 6 这三个字的时候,我心里是有点复杂的。这个系统早在 2020 年就正式停止维护了,官方源都已经下线,但现实是,还有不少老企业、老项目、老服务器依然倔强地运行在它上面。可能是历史包袱重,可能是迁移成本太高,也可能是”能用就行”的心态。
作为在运维圈摸爬滚打多年的老兵,我见过太多因为远程配置不当导致的惨案——要么是黑客破门而入,要么是管理员把自己锁在门外。今天咱们就老老实实、仔仔细细地把 CentOS 6 的 SSH 远程连接和权限管理讲透,不管你是新手还是想复习的老手,都能有些收获。
先搞清楚 SSH 在 CentOS 6 里是怎么跑的
SSH,全称 Secure Shell,是 Linux 世界里远程管理的基石。它的工作方式很直观:你通过客户端发起连接,服务器端的 SSH daemon(也叫 sshd)负责验证你的身份,验证通过后建立一个加密的通道,你的一切操作都在这条加密管道里传输。
在 CentOS 6 里,这个守护进程叫 sshd,它的核心配置文件是 /etc/ssh/sshd_config。记住这个路径,后面所有的操作都绕不开它。
让我先带你看看这个文件里哪些东西最关键。你可以通过以下命令来查看当前配置:
# 查看 SSH 主配置文件
cat /etc/ssh/sshd_config
# 或者用 vim 编辑(推荐,可以实时注释掉不需要的行)
vim /etc/ssh/sshd_config
一个标准的、经过安全加固的 sshd_config 文件,长这样:
# 监听地址和端口
ListenAddress 0.0.0.0
Port 22
# 协议版本,CentOS 6 默认支持 v2,这是好的
Protocol 2
# 主机密钥,用于服务器身份认证
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
# 密钥长度,越安全越推荐
KeyRegenerationInterval 3600
ServerKeyBits 1024
# 日志级别,调试排错时调到 INFO,日常用 VERBOSE
SyslogFacility AUTH
LogLevel VERBOSE
# 认证相关,这是安全的核心
LoginGraceTime 60
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5
# 密钥认证(推荐,比密码更安全)
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 密码认证(如果必须开启,务必配合其他限制)
PasswordAuthentication yes
PermitEmptyPasswords no
# 挑战响应认证
ChallengeResponseAuthentication no
# PAM 认证
UsePAM yes
# 其他安全加固
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
ClientAliveInterval 0
ClientAliveCountMax 3
UseDNS no
AllowTcpForwarding no
GatewayPorts no
PermitTunnel no
Banner /etc/issue.net
# 强制指定用户只允许用某些认证方式
AllowUsers deploy admin
AllowGroups wheel
DenyUsers root guest
DenyGroups nobody
看到了吗?这个文件里的每一行都不是摆设。PermitRootLogin no 这行小小的配置,能挡住至少 80% 的暴力破解攻击——因为绝大多数黑客扫描到的目标,第一个尝试的就是 root 登录。
防火墙,第二道生命防线
SSH 配置只是第一道门,CentOS 6 默认使用 iptables 作为防火墙工具。很多新手犯的错误是:SSH 配得再好,防火墙开着 22 端口对所有 IP 开放,那和没配有什么区别?
让我先带你看看 iptables 的基本结构。iptables 有五个内置链:INPUT(入站)、OUTPUT(出站)、FORWARD(转发)、PREROUTING(路由前)、POSTROUTING(路由后)。我们要关心的主要是 INPUT 链,因为它控制进入服务器的流量。
查看当前防火墙规则:
# 查看 INPUT 链的所有规则
iptables -L INPUT -n -v --line-numbers
# 查看 NAT 表
iptables -t nat -L -n -v
# 查看规则详情,包括匹配的数据包数量
iptables -L INPUT -n --line-numbers
一个合理的防火墙规则集应该是这样的顺序:
# 1. 先清空现有规则(生产环境慎用,最好在维护窗口操作)
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
# 2. 允许已建立和相关连接通过(状态跟踪)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 3. 允许本地回环接口(本机通信需要)
iptables -A INPUT -i lo -j ACCEPT
# 4. 允许 SSH 连接——但只允许特定 IP 段!
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
# 5. 允许 HTTP 和 HTTPS(如果你的服务器提供 Web 服务)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 6. 允许 ICMP(ping,用于诊断,但不必过于宽松)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 7. 拒绝其他所有入站连接
iptables -A INPUT -j DROP
# 8. 出站连接基本全放行(如果需要更严格可以限制)
iptables -A OUTPUT -j ACCEPT
注意第 4 步,我用 -s 参数指定了源 IP 段。这意味着只有 192.168.1.0/24 和 10.0.0.0/8 这两个网段的机器才能连接 SSH。如果你的办公 IP 是固定的,甚至可以精确到单个 IP:
# 只允许你的办公 IP 连接 SSH
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.45 -j ACCEPT
# 只允许你的跳板机连接 SSH
iptables -A INPUT -p tcp --dport 22 -s 10.20.30.40 -j ACCEPT
这是最有效的一道防线。配合 SSH 的 AllowUsers 配置,即使有人拿到了你的密码,如果 IP 不在白名单里,连 SSH 的门都摸不到。
持久化你的配置
很多新手在这里栽跟头:规则配得好好的,重启服务器后全没了。CentOS 6 的 iptables 规则默认是不持久化的,你需要手动保存。
# 保存当前规则到配置文件
service iptables save
# 或者手动保存到默认路径
iptables-save > /etc/sysconfig/iptables
# 查看保存的配置文件
cat /etc/sysconfig/iptables
开机自动加载规则也很关键:
# 确保 iptables 服务开机自启
chkconfig iptables on
# 查看开机启动服务列表,确认 iptables 在其中
chkconfig --list | grep iptables
同样的,SSH 服务也需要确保开机自启:
chkconfig sshd on
service sshd status
用户权限管理,比你想的更重要
SSH 配得再好,如果用户权限混乱,照样出大事。CentOS 6 的权限管理主要依赖用户组、sudo 配置和 SSH 的 AllowUsers/AllowGroups 指令。
创建一个专用运维用户
永远不要直接用 root 远程登录。创建一个专门的运维账号:
# 创建用户,指定家目录和默认 shell
useradd -m -s /bin/bash deploy
# 设置密码
passwd deploy
# 将用户加入 wheel 组(CentOS 6 中 wheel 组默认拥有 sudo 权限)
usermod -aG wheel deploy
# 验证用户所属组
id deploy
# 输出应该类似:uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),10(wheel)
配置 SSH 密钥认证
密码认证再配合强密码,也比不上密钥认证安全。生成密钥对:
# 在本地机器(客户端)生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 将公钥复制到服务器
ssh-copy-id deploy@your_server_ip
# 如果 ssh-copy-id 不可用,手动复制
cat ~/.ssh/id_rsa.pub | ssh deploy@your_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 确保权限正确
ssh deploy@your_server_ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
测试一下:
ssh deploy@your_server_ip
# 如果配置正确,应该不需要输入密码就能登录
登录成功后,回到服务器端修改 sshd_config:
# 禁用密码认证,只允许密钥认证
PasswordAuthentication no
PubkeyAuthentication yes
然后重启 SSH 服务:
service sshd restart
配置 sudo 权限
有时候 deploy 用户需要执行 root 命令,用 sudo 是最合适的方式。编辑 sudoers 文件:
# 使用 visudo 编辑,它会检查语法错误
visudo
找到这行:
%wheel ALL=(ALL) ALL
这表示 wheel 组的所有成员都可以执行所有命令。如果你希望 deploy 用户只能执行部分命令,可以这样配置:
# deploy 用户只能执行特定的几条命令
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/service, /usr/bin/less /var/log/*
注意:CentOS 6 用的是 service 命令而不是 systemctl,因为 6 版本还是 SysVinit,不是 systemd。
防爆破,加一层防护
即使你做了 IP 白名单,还是担心有人从其他路径尝试爆破?安装 fail2ban 是个好选择。它能监控日志,发现多次失败登录后自动封禁 IP。
# CentOS 6 的 EPEL 源安装 fail2ban
yum install epel-release -y
yum install fail2ban -y
# 创建配置文件
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑配置
vim /etc/fail2ban/jail.local
一个基础的 fail2ban 配置:
[DEFAULT]
# 忽略自己的 IP,防止把自己锁外面
ignoreip = 127.0.0.1 192.168.1.0/24 10.0.0.0/8
# banned 时间,86400 秒 = 24 小时
bantime = 86400
# 多少时间内失败多少次就封禁
# findtime = 600 表示 10 分钟内
# maxretry = 3 表示尝试 3 次
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
backend = pthread
启动并设置开机自启:
service fail2ban start
chkconfig fail2ban on
# 查看是否生效
fail2ban-client status
fail2ban-client status sshd
当有人多次 SSH 登录失败后,你会看到类似这样的输出:
Status for the jail: sshd
|- Connected clients: 0
|- Banned clients: 192.0.2.100 203.0.113.50
这时候那两个 IP 就已经被 iptables 自动封禁了,想解封:
fail2ban-client unset sshd 203.0.113.50
一个完整的实战场景
让我给你讲一个真实的场景。假设你有一个老项目,跑在 CentOS 6 的服务器上面,这台服务器位于内网,但需要让公司的几个运维同事远程管理。
需求分析
- 运维团队有 3 个人,各有办公 IP
- 需要禁止 root 直接登录
- 需要记录所有操作日志
- 需要防止暴力破解
- 防火墙只允许办公网段访问
完整配置步骤
第一步:创建运维用户
# 为三个运维人员创建独立账户
useradd -m -s /bin/bash zhangsan
useradd -m -s /bin/bash lisi
useradd -m -s /bin/bash wangwu
# 统一加入 wheel 组
usermod -aG wheel zhangsan,lisi,wangwu
# 设置复杂密码(临时使用,后续换密钥)
for user in zhangsan lisi wangwu; do
passwd $user
done
第二步:配置 SSH 密钥认证
# 在每个运维人员的本地机器生成密钥
# 然后在服务器上配置 authorized_keys
for user in zhangsan lisi wangwu; do
ssh $user@your_server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh"
# 将本地公钥追加到服务器对应用户的 authorized_keys
cat ~/.ssh/id_rsa.pub | ssh $user@your_server_ip "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
done
第三步:加固 sshd_config
vim /etc/ssh/sshd_config
Port 22
ListenAddress 0.0.0.0
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
# 日志详细一点,方便排查
SyslogFacility AUTH
LogLevel VERBOSE
LoginGraceTime 30
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
ClientAliveInterval 600
ClientAliveCountMax 3
UseDNS no
AllowTcpForwarding no
GatewayPorts no
PermitTunnel no
Banner /etc/issue.net
# 只允许这三个运维用户通过 SSH 登录
AllowUsers zhangsan lisi wangwu
AllowGroups wheel
创建欢迎标语文件:
cat > /etc/issue.net << 'EOF'
****************************************************************
* WARNING: Authorized Access Only *
* This system is for authorized users only. *
* Unauthorized access is prohibited and will be *
* prosecuted to the fullest extent of the law. *
****************************************************************
EOF
第四步:配置防火墙
# 清空现有规则(确认不会把自己锁在外面!)
iptables -F INPUT
# 允许已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 只允许三个运维人员的固定 IP 访问 SSH
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.11 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.12 -j ACCEPT
# 允许内网其他必要服务(比如 HTTP)
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -s 192.168.1.0/24 -j ACCEPT
# 拒绝其他所有
iptables -A INPUT -j DROP
# 保存并设置开机启动
service iptables save
chkconfig iptables on
第五步:安装 fail2ban
yum install epel-release -y
yum install fail2ban -y
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 /etc/fail2ban/jail.local:
[DEFAULT]
ignoreip = 127.0.0.1 203.0.113.10 203.0.113.11 203.0.113.12 192.168.1.0/24
bantime = 3600
findtime = 300
maxretry = 3
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
backend = pthread
service fail2ban start
chkconfig fail2ban on
第六步:配置操作日志审计
CentOS 6 可以使用 auditd 来记录所有命令执行:
# 安装 audit 工具
yum install audit -y
# 启动服务
service auditd start
chkconfig auditd on
# 配置记录所有用户的命令执行
# 编辑 /etc/audisp/plugins.d/syscheck.conf
vim /etc/audisp/plugins.d/syscheck.conf
或者更简单的方式,修改 bash 的历史记录配置:
vim /etc/bashrc
在文件末尾添加:
”`bash
记录所有命令到日志
export HISTTIMEFORMAT=“%F %T ” export HISTSIZE=10
