公网服务器22端口会被扫描器暴力破解,查看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
ssh-keygen -t ed25519 -C "你的名字-服务器加固"
Windows查看公钥:type $env:USERPROFILE\.ssh\id_ed25519.pub
Mac/Linux查看公钥:cat ~/.ssh/id_ed25519.pub
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 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 可用"
sudo vi /etc/ssh/sshd_config
修改/新增配置项:
PubkeyAuthentication yes 启用公钥认证PasswordAuthentication no 关闭密码登录PermitRootLogin no 禁止root远程登录MaxAuthTries 3 最大认证尝试次数ClientAliveInterval 300ClientAliveCountMax 2AllowUsers study teacher 白名单允许登录用户sudo sshd -t sudo systemctl reload sshd
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload sudo firewall-cmd --list-all
ICMP协议没有端口概念;安全组ICMP显示“任何”不是开放全部端口,用于ping连通性测试。
sudo ss -tlnp
sudo dnf install -y epel-release sudo dnf install -y fail2ban sudo vi /etc/fail2ban/jail.d/sshd.local
[sshd] enabled = true backend = systemd maxretry = 3 findtime = 600 bantime = 3600
sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
sshd -t校验配置再reload.ssh目录700、authorized_keys文件600,属主正确@:裸域名 example.com;www代表www.example.comnslookup 你的域名 nslookup www.你的域名
阿里云安全组入方向开放TCP 80;主机防火墙配置:
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
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
阿里云Rocky镜像SELinux默认Disabled;其他环境403需要排查SELinux。
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
本地scp上传:
scp index.html study@服务器公网IP:/var/www/mysite/
服务器直接编辑:vi /var/www/mysite/index.html
💡原理:Nginx依靠HTTP请求头Host字段匹配server_name;IP访问没有域名Host,匹配默认站点,展示Nginx默认页面。
curl -H "Host:你的域名" http://127.0.0.1
ls -l核对权限,查看nginx错误日志/var/log/nginx/mysite_error.logsudo tail -f /var/log/nginx/mysite_access.log
sudo dnf install -y tcpdump sudo tcpdump -i any -A -nn 'tcp port 80' | grep -a -E "GET |Host:|User-Agent|<title>"
HTTP所有传输明文,可以被中间设备抓取请求、页面内容。HTTPS加密业务载荷,但SNI会明文传输访问域名。
/.well-known/acme-challenge/安全组TCP443放行;防火墙配置:
sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload sudo firewall-cmd --list-services
⚠️80端口不能关闭:①访问者http跳转https;②证书续期仍然需要80端口验证。
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:证书私钥,严禁泄露!#80端口,跳转https,保留acme验证路径
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
sudo systemctl enable --now certbot-renew.timer systemctl list-timers 'certbot*'
编写deploy钩子脚本,续期成功自动重载nginx:
sudo vi /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'
业务内容密文乱码;但访问域名SNI明文可见。HTTPS加密传输内容,不加密访问的目标域名。