公网服务器会被扫描器7×24小时扫描,针对22端口SSH进行暴力破解,大量陌生IP尝试用户名密码登录。
# 查看ssh登录失败日志
sudo journalctl -u sshd | grep -i "failed" | tail -30
/dev/tty1;SSH登录伪终端为/dev/pts/0。密钥成对生成:私钥(留在本机绝不外传);公钥(放到服务器,可以公开)。服务器拿公钥出题,只有对应私钥可以解开完成登录。
sudo adduser study
sudo passwd study
sudo usermod -aG wheel study
加固后禁止root远程SSH登录,日常使用普通study账号操作。修改配置前,务必先用VNC登录一次验证后路可用。
ssh-keygen -t ed25519 -C "你的名字-服务器加固"
type $env:USERPROFILE\.ssh\id_ed25519.pubcat ~/.ssh/id_ed25519.pub复制公钥整行,上传到服务器study用户的 ~/.ssh/authorized_keys,严格设置目录、文件权限:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ls -l ~/.ssh
先验证密钥登录成功,再关闭密码登录!
ssh study@服务器公网IP
sudo adduser teacher
sudo mkdir -p /home/teacher/.ssh
sudo vi /home/teacher/.ssh/authorized_keys
sudo chmod 700 /home/teacher/.ssh
sudo chmod 600 /home/teacher/.ssh/authorized_keys
sudo chown -R teacher:teacher /home/teacher/.ssh
#配置免密sudo
echo "teacher ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/teacher
sudo chmod 440 /etc/sudoers.d/teacher
sudo visudo -c
sudo -u teacher sudo -n true && echo "teacher 免密 sudo 可用"
关键配置项:
PubkeyAuthentication yes 启用公钥认证PasswordAuthentication no 关闭密码登录PermitRootLogin no 禁止root远程登录MaxAuthTries 3 最大尝试次数3次ClientAliveInterval 300、ClientAliveCountMax 2 会话保活AllowUsers study teacher 白名单允许登录用户sudo vi /etc/ssh/sshd_config
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
#查看监听端口
sudo ss -tlnp
安全组入方向保留TCP22,删除不用端口;ICMP IPv4可保留。
#安装epel源与fail2ban
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
新建配置文件 /etc/fail2ban/jail.d/sshd.local,不要修改jail.conf主文件。Rocky9使用backend=systemd读取systemd日志,不要读取老的/var/log/secure。
[sshd]
enabled = true
backend = systemd
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
DNS:域名系统,相当于互联网通讯录,把域名翻译为服务器公网IP。
解析记录A记录(IPv4):
@:代表域名本体 example.comwww:代表www.example.com#验证解析
nslookup 你的域名
nslookup www.你的域名
安全组入方向添加TCP 80;firewalld放行http服务。
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
sudo dnf install -y nginx
sudo systemctl enable --now nginx
systemctl status nginx
nginx -v
创建网站目录,修改目录归属study用户:
sudo mkdir -p /var/www/mysite
sudo chown -R study:study /var/www/mysite
sudo chmod 755 /var/www/mysite
ls -ld /var/www/mysite
getenforce #阿里云Rocky默认SELinux=Disabled
server {
listen 80;
server_name example.com www.example.com;
root /var/www/mysite;
index index.html;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
location / {
try_files $uri $uri/ =404;
}
}
sudo nginx -t #语法检查
sudo systemctl reload nginx
主页底部必须放置ICP备案号,跳转工信部备案网站。
#本地scp上传
scp index.html study@服务器公网IP:/var/www/mysite/
#服务器直接编辑
vi /var/www/mysite/index.html
Nginx工作进程运行身份nginx用户;网页文件权限至少644,网站目录至少755;权限过小nginx无法读取文件返回403。优先查看错误日志:
sudo tail -3 /var/log/nginx/mysite_error.log
sudo tail -f /var/log/nginx/mysite_access.log
HTTP全部流量明文传输,中间网络节点可以直接抓取请求URL、User‑Agent、表单账号密码。HTTPS=HTTP+TLS加密;两件事:①传输内容加密;②身份认证(数字证书证明服务器身份)。
#抓包观察80明文http
sudo dnf install -y tcpdump
sudo tcpdump -i any -A -nn 'tcp port 80' | grep -a -E "GET |Host:|User‑Agent|"
/.well‑known/acme‑challenge/前提条件:域名解析正确;80端口开放;Nginx正确提供验证文件。证书有效期90天,未来缩短至45天,无到期提醒,必须配置自动续期。
两个理由:①用户输入http访问跳转https;②证书续期HTTP‑01验证依赖80端口。
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
阿里云安全组入方向放行TCP443。
sudo dnf install -y certbot
certbot --version
先用--dry-run演练,防止正式环境触发申请频率限制:
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 certificates
sudo ls -l /etc/letsencrypt/live/example.com/
fullchain.pem:证书+中间证书,发给浏览器privkey.pem:证书私钥,服务器保存,绝对不能泄露,泄露可以冒充网站。备份旧配置 sudo cp /etc/nginx/conf.d/mysite.conf /etc/nginx/conf.d/mysite.conf.bak
# 80端口:处理acme验证,其余全部301跳转https
server {
listen 80;
server_name example.com www.example.com;
location /.well-known/acme-challenge/ {
root /var/www/mysite;
}
location / {
return 301 https://$host$request_uri;
}
}
#443 HTTPS真正网站服务
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/mysite;
index index.html;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
location / {
try_files $uri $uri/ =404;
}
}
sudo nginx -t
sudo systemctl reload nginx
#启用certbot定时器
sudo systemctl enable --now certbot-renew.timer
systemctl list-timers 'certbot*'
编写deploy钩子脚本,证书续期成功自动重载nginx加载新证书:/etc/letsencrypt/renewal‑hooks/deploy/reload‑nginx.sh
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
sudo /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#演练续期
sudo certbot renew --dry-run
sudo tcpdump -i any -A -nn -c 40 'tcp port 443'