Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

服务器初始化

用户

创建用户:

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
2
3
sudo chown -R user_name:user_name /home/user_name/.ssh
sudo chmod 700 /home/user_name/.ssh
sudo chmod 600 /home/user_name/.ssh/authorized_keys

SSH 加固配置

创建SSH附加配置文件:(其中99-hardening也可以改成其他名字)

1
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf

将内容修改为:

1
2
3
4
5
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers user_name

修改完后执行:(检查 SSH 配置有没有语法错误并让新配置生效)

1
2
sudo sshd -t
sudo systemctl restart ssh

注意:在关闭密码登录之前,一定要先确认公钥登录已经成功!


如果关闭密码登录后需要给用户添加新设备的ssh key,可以短暂开启一下密码登录。等到成功将公钥追加到服务器后再关闭即可,也就是暂时修改成这样:

1
2
3
4
5
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers user_name

开启UFW防火墙并收紧入站

1
2
3
4
5
6
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw logging on
sudo ufw enable
sudo ufw status verbose

命令依次实现:

  • 默认拒绝所有进入服务器的连接。
  • 默认允许服务器主动访问外部。
  • 放行 SSH 服务。
  • 开启防火墙日志。
  • 正式启用防火墙。
  • 查看当前防火墙详细状态。

配置虚拟内存(Swap)

查看当前内存:

1
free -h

如果服务器物理内存只有 1–2 GB,建议额外配置一定的 Swap 交换空间。否则在内存占用高峰时,系统可能因为可用内存不足触发 OOM,导致部分进程被强制终止,进而影响 SSH、编辑器服务或其他应用的正常运行。

添加4G swap:

1
2
3
4
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

然后开机自动启用:

1
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

如果需要修改swap大小,就先删除当前的然后用上面的命令重新添加:

1
2
sudo swapoff /swapfile
sudo rm /swapfile

常用python库安装

这种库是直接安装在系统自带的python3的下面,所以直接用python3来运行脚本即可。不依赖创建虚拟环境,会方便很多,但是版本可能比较老。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo apt install python3-pwntools

sudo apt install python3-requests

sudo apt install python3-numpy

sudo apt install python3-pillow

sudo apt install python3-elftools

sudo apt install python3-cryptography

sudo apt install python3-gmpy2

sudo apt install python3-pycryptodome

sudo apt install python3-z3

安全加固(非必要)

Fail2Ban最擅长拦截“反复尝试认证失败”的来源IP。而在关闭了密码登录(PasswordAuthentication)的情况下,不需要担心SSH密码爆破。

Fail2Ban

Fail2Ban 通过实时监控系统日志,自动识别并在防火墙中封禁那些在短时间内多次认证失败的恶意IP,从而阻断暴力破解攻击。

比如说如果IP 1.2.3.4 在5分钟内输错3次密码,则封禁该IP 24小时。

安装:

1
2
sudo apt update
sudo apt install fail2ban -y

启动并设置开机自启:

1
2
3
4
5
# 1. 允许服务开机自启
sudo systemctl enable fail2ban

# 2. 现在立刻启动服务
sudo systemctl start fail2ban

查看状态:

1
sudo systemctl status fail2ban

正常开启的情况应该会看到这样的内容:

image-20260111133505137

Jail

Fail2Ban 的 Jail(监狱) 是一个独立的防御策略单元。它将“日志监控规则”与“防火墙执行动作”绑定,用于保护特定的服务。

从技术实现角度,一个 Jail 包含以下三个核心闭环流程:

  1. 日志轮询 (Log Polling): Jail 持续读取并分析指定的系统日志文件(Backend,例如 /var/log/auth.log)。
  2. 正则匹配与计数 (Filter & Counter): 使用预设的 Python 正则表达式 (Regex) 实时匹配日志中的失败记录。Jail 会在内存中维护一个滑动时间窗口 (findtime),统计同一源 IP 的匹配次数。
  3. 动作执行 (Action Execution): 一旦计数达到设定的阈值 (maxretry),Jail 会立即调用系统层面的命令(通常是修改 iptablesnftables 防火墙规则),在网络层直接拒绝该 IP 的连接请求,并持续 bantime 设定的时长。

查看Jail情况:

1
sudo fail2ban-client status

如果显示:

1
2
3
Status
|- Number of jail: 0
`- Jail list:

则代表没有监控任何东西。

开启ssh监控:

1
printf "[sshd]\nenabled = true\n" | sudo tee /etc/fail2ban/jail.local

然后重启服务让它生效:

1
sudo systemctl restart fail2ban

这时候再检查就应该看到:

1
2
3
4
sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd