说起CentOS 6,我知道你现在可能有点犹豫。这个系统已经停止维护好几年了(官方支持在2020年11月就结束了),很多新手甚至不知道它有多古老。但如果你是在维护老服务器、备考RHCE认证,或者在虚拟机里练手,这篇指南依然能帮你把安全基础打扎实。我会用最直白的方式,带你一步步把远程访问安全起来,就像你家里换锁一样自然。
先说句掏心窝的话
我理解你第一次面对命令行时的紧张——黑底白字的界面,生怕敲错一个命令就把服务器搞崩。别担心,我们慢慢来。CentOS 6用的是比较老的命令体系(比如iptables而不是firewalld),这点要特别注意,不然照着新教程操作会懵。我会把每个命令的作用讲清楚,让你知其然也知其所以然。
为什么这些安全措施如此重要?
想象一下:你的服务器就像一间办公室,SSH是大门,sudo是保险箱钥匙。如果大门敞开(默认22端口),谁都能进来翻东西;如果保安(sudo用户)没管好,坏人拿到钥匙就能打开保险箱。2023年有个真实案例,某公司因为SSH端口没改,被暴力破解攻击,损失了12万美金——这完全可以通过基础配置避免。
第一步:更换SSH默认端口,给大门换个隐蔽的锁
SSH默认使用22端口,这就像你家门牌号写在正中央,黑客扫描工具一跑就能找到。换成一个冷门端口,能挡掉90%的自动化攻击。
操作前先备份
一定要备份! 我见过太多人改完配置连不上服务器,最后只能去机房插显示器调试。备份是救命稻草:
# 备份原始SSH配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup-$(date +%Y%m%d)
# 确认备份成功
ls -l /etc/ssh/sshd_config.backup-*
编辑SSH配置
用你顺手的编辑器打开配置文件:
sudo vi /etc/ssh/sshd_config
找到这行(通常在第15行左右):
#Port 22
把它改成(去掉#号,换成新端口,比如2222):
Port 2222
选端口有讲究:避开1-1024的知名端口(那些是HTTP、FTP等服务的),建议用10000-65535之间的随机数。可以用这个命令生成一个:
echo $((RANDOM % 55535 + 10000))
我还想提醒你几个容易忽略的细节:
- 确保新端口没有被其他服务占用:
netstat -tulpn | grep :2222 - 如果你用密钥登录,记得后面还要配置密钥认证
- 改完配置后先别急着重启,用新端口开一个新终端窗口测试
重启SSH服务并测试
# 重启SSH服务(CentOS 6用service命令)
sudo service sshd restart
# 检查服务状态
sudo service sshd status
现在立刻测试! 开一个新终端窗口(千万别关掉当前的!):
ssh -p 2222 你的用户名@服务器IP
如果连接成功,恭喜!如果失败,马上切回原来的终端,检查哪里出错了。我见过有人因为防火墙没放行新端口而卡住,接下来我们就解决这个问题。
第二步:配置iptables防火墙,给窗户装上防盗网
CentOS 6用的是iptables,不是现在流行的firewalld。很多新手会在这里踩坑,因为命令格式完全不同。
查看当前防火墙规则
sudo iptables -L -n -v
这个命令会列出所有规则,-n表示不解析主机名(速度快),-v显示详细信息。你大概会看到类似这样的输出:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
注意看第4行,它允许TCP 22端口的连接。我们需要把它改成2222。
添加新SSH端口规则
# 删除旧的22端口规则(如果存在)
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 添加新端口2222的规则
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# 确保允许已建立和相关连接(这很重要!)
sudo iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
这里有个关键技巧:-I INPUT 1表示插入到第一条规则,确保它优先处理。如果你用-A追加到最后,可能会因为后面的拒绝规则而失效。
保存规则并验证
iptables的规则重启后会丢失!必须保存:
# 保存当前规则
sudo service iptables save
# 或者手动保存到文件
sudo iptables-save > /etc/sysconfig/iptables
检查保存是否成功:
cat /etc/sysconfig/iptables | grep 2222
你应该能看到类似:
-A INPUT -p tcp -m tcp --dport 2222 -j ACCEPT
第三步:强化SSH配置,让门锁更牢固
光改端口还不够,我们还要加强SSH本身的安全性。
禁用root直接登录
这是最重要的安全实践之一。让攻击者连root账号都试不了:
# 编辑SSH配置
sudo vi /etc/ssh/sshd_config
找到这行:
#PermitRootLogin yes
改成:
PermitRootLogin no
我还建议同时做这几件事:
- 禁用密码登录,只用密钥:
PasswordAuthentication no - 设置空闲超时断开:
ClientAliveInterval 300和ClientAliveCountMax 2 - 限制登录尝试次数:
MaxAuthTries 3
生成并配置SSH密钥
用密钥登录比密码安全得多,因为密钥几乎无法暴力破解。
# 在本地机器上生成密钥对(如果你还没生成过)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 把公钥传到服务器
ssh-copy-id -p 2222 你的用户名@服务器IP
测试密钥登录:
ssh -p 2222 你的用户名@服务器IP
如果成功,你就不需要密码了。然后在服务器上禁用密码登录:
sudo vi /etc/ssh/sshd_config
# 确保这些设置正确
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
重启SSH服务让设置生效:
sudo service sshd restart
第四步:配置sudo权限,给保安发对钥匙
现在我们要确保只有 trusted 用户能执行管理员命令,而且每次操作都有记录。
创建普通用户并授权
假设你已经有个用户名叫devops,我们给他sudo权限:
# 编辑sudoers文件(必须用visudo!)
sudo visudo
在文件末尾添加:
devops ALL=(ALL) ALL
为什么必须用visudo? 我见过有人直接用vi编辑/etc/sudoers,结果语法错误导致所有用户都无法sudo,连root都麻烦。visudo会检查语法错误,保护系统。
更精细的权限控制
如果不想让devops执行所有命令,可以限制:
# 只允许执行特定命令
devops ALL=(ALL) /usr/bin/systemctl, /usr/bin/reboot, /usr/bin/journalctl
# 或者允许免密码执行某些命令(谨慎使用)
devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart httpd
监控sudo日志
# 查看sudo使用记录
sudo grep sudo /var/log/secure
# 实时跟踪
sudo tail -f /var/log/secure | grep sudo
这样你能清楚知道谁在什么时候执行了什么命令。有次我帮朋友排查问题,就是靠这段日志发现是某员工误操作导致服务中断。
第五步:安装fail2ban,让自动攻击者自投罗网
即使改了端口,还是会有扫描器尝试。fail2ban能自动封禁多次失败登录的IP。
# CentOS 6需要EPEL源
sudo yum install epel-release
sudo yum install fail2ban
# 创建配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
在文件末尾添加:
[ssh-2222]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
启动服务:
sudo service fail2ban start
sudo chkconfig fail2ban on # 设置开机启动
测试一下:用错误的密码尝试登录3次,然后检查是否被封:
sudo fail2ban-client status ssh-2222
你应该能看到类似输出:
Status for the jail: ssh-2222
|- Number of jail: 1
`- Jail list: ssh-2222
如果想看被禁IP:
sudo fail2ban-client get ssh-2222 banip
常见坑点和应急方案
被锁在门外怎么办?
如果你改完配置发现连不上了,别慌:
如果有控制台访问(云服务商的VNC或物理机的显示器):
- 重启进入单用户模式
- 挂载根文件系统为可写:
mount -o remount,rw / - 恢复备份的配置文件:
cp /etc/ssh/sshd_config.backup-20231025 /etc/ssh/sshd_config - 重启系统
预防措施:
- 始终保留一个活动的SSH会话
- 改配置前做完整备份
- 用
ssh -p 2222 -o ConnectTimeout=5测试,避免卡死
CentOS 6特有的注意事项
- SELinux:可能阻止新端口,用
semanage port -a -t ssh_port_t -p tcp 2222添加 - 老旧软件:yum可能找不到某些包,需要配置代理或使用镜像源
- 性能:相比CentOS 7/8,命令响应慢一点,耐心等
日常安全维护清单
安全不是一劳永逸的,养成习惯很重要:
# 每周检查
sudo lastlog # 查看最后登录
sudo grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr # 失败登录统计
sudo rpm -qa --last | head -20 # 最近安装的包
# 每月更新(虽然CentOS 6没有安全更新了...)
sudo yum update --security
最后的话
我知道CentOS 6已经年老力衰,但掌握这些安全实践对任何Linux系统都适用。如果你正在学习,建议尽快升级到CentOS Stream 9或AlmaLinux 9——它们用firewalld代替iptables,用更现代的工具,但核心安全理念一样。
我写这篇指南时,脑海里浮现的是自己第一次配置服务器时的手忙脚乱。那些深夜debug的煎熬,我懂。所以现在能帮到别人,我很高兴。
如果你按步骤做还在遇到问题,别犹豫,告诉我具体的错误信息。安全配置就像配钥匙——有时候需要多试几次才能完美匹配。你已经迈出了重要的一步,继续加油!
