将裸奔的 Rocky Linux9 服务器加固,实现密钥登录、两层防火墙防护、fail2ban自动封禁暴力破解,掌握VNC自救手段。
密钥分为私钥(存本地电脑,绝不外传)、公钥(上传服务器,可以公开)。服务器使用公钥出题,只有私钥可以解密完成登录。
# 查看ssh登录失败爆破日志
sudo journalctl -u sshd | grep -i "failed" | tail -30
# 新建普通用户并加入wheel管理员组
sudo adduser study
sudo passwd study
sudo usermod -aG wheel study
# 本地电脑生成ed25519密钥对
ssh-keygen -t ed25519 -C "名字-服务器加固"
# 服务器创建密钥目录,设置权限(权限过松ssh拒绝密钥登录)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 测试sshd配置语法,重载配置
sudo sshd -t
sudo systemctl reload sshd
# firewalld放行ssh服务
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
# 安装epel源与fail2ban
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
# 启动fail2ban开机自启,查看sshd防护状态
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
SSH锁门外:阿里云VNC登录服务器,修改sshd_config,执行语法校验后重载sshd服务。密钥登录输密码,大概率是.ssh目录与authorized_keys权限不对。
配置DNS域名解析,安装Nginx,发布带ICP备案号的静态个人主页;理解安全组+firewalld两层防火墙;排查403、404、访问超时。
DNS相当于互联网通讯录,将域名转换服务器公网IP。使用A记录指向IPv4。
@:代表主域名 example.comwww:代表 www.example.com# 测试域名解析
nslookup 你的域名
nslookup www.你的域名
# firewalld放行http 80端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
# 安装启动Nginx
sudo dnf install -y nginx
sudo systemctl enable --now nginx
systemctl status nginx
nginx -v
# 创建网站目录,修改属主权限
sudo mkdir -p /var/www/mysite
sudo chown -R study:study /var/www/mysite
sudo chmod 755 /var/www/mysite
# nginx配置语法检查,重载配置
sudo nginx -t
sudo systemctl reload nginx
# scp本地网页上传服务器
scp index.html study@服务器IP:/var/www/mysite/
# 实时查看网站访问日志
sudo tail -f /var/log/nginx/mysite_access.log
Nginx读取HTTP请求头Host字段,匹配server_name;IP访问没有域名Host,匹配不到自定义站点,返回系统默认Nginx页面。
Nginx工作进程以nginx用户运行;网页文件权限至少644,网站目录权限至少755;优先查看nginx错误日志排查Permission denied。
网站首页底部必须放置ICP备案号,跳转工信部备案查询官网。
理解HTTP明文风险,部署Let's Encrypt免费HTTPS证书;配置Nginx的80跳转HTTPS;配置证书自动续期。证书有效期仅90天。
CA机构在公网访问服务器上特定路径/.well‑known/acme‑challenge/验证文件,确认域名控制权,才颁发证书。
⚠️80端口不能关闭:①用户http访问跳转https;②证书续期依旧需要80端口验证域名所有权。
# 抓包观察80明文流量
sudo dnf install -y tcpdump
sudo tcpdump -i any -A -nn 'tcp port 80' | grep -a -E "GET |Host:|User-Agent|"
# firewalld放行https 443端口
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
# 安装certbot证书工具
sudo dnf install -y certbot
certbot --version
# certbot演练申请证书(测试环境,不消耗次数)
sudo certbot certonly --webroot -w /var/www/mysite \
-d example.com -d www.example.com \
-m 邮箱 --agree-tos --no-eff-email --dry-run
# 正式申请证书(去掉--dry-run)
sudo certbot certonly --webroot -w /var/www/mysite \
-d example.com -d www.example.com \
-m 邮箱 --agree-tos --no-eff-email
# 查看本机证书列表
sudo certbot certificates
# 启用certbot自动续期定时器
sudo systemctl enable --now certbot-renew.timer
systemctl list-timers 'certbot*'
# 模拟证书续期演练
sudo certbot renew --dry-run
证书更新只是修改磁盘文件,Nginx不会自动加载;部署deploy钩子脚本,证书续期成功后自动执行 systemctl reload nginx。脚本必须赋予执行权限。