服务器初始化
用户
创建用户:
1 | sudo adduser user_name |
给sudo权限:
1 | sudo usermod -aG sudo user_name |
给用户设置/重置密码:
1 | sudo passwd user_name |
配置 SSH 公钥登录
生成SSH Key
Windows/Mac/Linux:
1 | ssh-keygen -t ed25519 -C "注释" |
注释可以任意填,但建议这样:
1 | ssh-keygen -t ed25519 -C "user_name@设备名" |
将公钥追加到服务器
Windows PowerShell:
1 | type $HOME\.ssh\id_ed25519.pub | ssh user_name@服务器ip地址 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" |
Mac/Linux:
1 | cat ~/.ssh/id_ed25519.pub | ssh user_name@你的服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" |
服务器上再确认权限:
1 | sudo chown -R user_name:user_name /home/user_name/.ssh |
SSH 加固配置
创建SSH附加配置文件:(其中99-hardening也可以改成其他名字)
1 | sudo nano /etc/ssh/sshd_config.d/99-hardening.conf |
将内容修改为:
1 | PermitRootLogin no |
修改完后执行:(检查 SSH 配置有没有语法错误并让新配置生效)
1 | sudo sshd -t |
注意:在关闭密码登录之前,一定要先确认公钥登录已经成功!
如果关闭密码登录后需要给用户添加新设备的ssh key,可以短暂开启一下密码登录。等到成功将公钥追加到服务器后再关闭即可,也就是暂时修改成这样:
1 | PermitRootLogin no |
开启UFW防火墙并收紧入站
1 | sudo ufw default deny incoming |
命令依次实现:
- 默认拒绝所有进入服务器的连接。
- 默认允许服务器主动访问外部。
- 放行 SSH 服务。
- 开启防火墙日志。
- 正式启用防火墙。
- 查看当前防火墙详细状态。
配置虚拟内存(Swap)
查看当前内存:
1 | free -h |
如果服务器物理内存只有 1–2 GB,建议额外配置一定的 Swap 交换空间。否则在内存占用高峰时,系统可能因为可用内存不足触发 OOM,导致部分进程被强制终止,进而影响 SSH、编辑器服务或其他应用的正常运行。
添加4G swap:
1 | sudo fallocate -l 4G /swapfile |
然后开机自动启用:
1 | echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab |
如果需要修改swap大小,就先删除当前的然后用上面的命令重新添加:1
2sudo swapoff /swapfile
sudo rm /swapfile
常用python库安装
这种库是直接安装在系统自带的python3的下面,所以直接用python3来运行脚本即可。不依赖创建虚拟环境,会方便很多,但是版本可能比较老。
1 | sudo apt install python3-pwntools |
安全加固(非必要)
Fail2Ban最擅长拦截“反复尝试认证失败”的来源IP。而在关闭了密码登录(PasswordAuthentication)的情况下,不需要担心SSH密码爆破。
Fail2Ban
Fail2Ban 通过实时监控系统日志,自动识别并在防火墙中封禁那些在短时间内多次认证失败的恶意IP,从而阻断暴力破解攻击。
比如说如果IP 1.2.3.4 在5分钟内输错3次密码,则封禁该IP 24小时。
安装:
1 | sudo apt update |
启动并设置开机自启:
1 | # 1. 允许服务开机自启 |
查看状态:
1 | sudo systemctl status fail2ban |
正常开启的情况应该会看到这样的内容:

Jail
Fail2Ban 的 Jail(监狱) 是一个独立的防御策略单元。它将“日志监控规则”与“防火墙执行动作”绑定,用于保护特定的服务。
从技术实现角度,一个 Jail 包含以下三个核心闭环流程:
- 日志轮询 (Log Polling): Jail 持续读取并分析指定的系统日志文件(Backend,例如
/var/log/auth.log)。 - 正则匹配与计数 (Filter & Counter): 使用预设的 Python 正则表达式 (Regex) 实时匹配日志中的失败记录。Jail 会在内存中维护一个滑动时间窗口 (
findtime),统计同一源 IP 的匹配次数。 - 动作执行 (Action Execution): 一旦计数达到设定的阈值 (
maxretry),Jail 会立即调用系统层面的命令(通常是修改iptables或nftables防火墙规则),在网络层直接拒绝该 IP 的连接请求,并持续bantime设定的时长。
查看Jail情况:
1 | sudo fail2ban-client status |
如果显示:
1 | Status |
则代表没有监控任何东西。
开启ssh监控:
1 | printf "[sshd]\nenabled = true\n" | sudo tee /etc/fail2ban/jail.local |
然后重启服务让它生效:
1 | sudo systemctl restart fail2ban |
这时候再检查就应该看到:
1 | sudo fail2ban-client status |