---
title: 服务器SSH防爆破最简单的两种方案
published: 2025-02-27
tags: [运维, 教程]
category: 运维
draft: false
---

### 前言
互联网上有黑客无时无刻都在扫端口，我也看到过很多网友的惨痛经历，服务器的SSH密码被黑客爆破后进入服务器捣乱或者植入后门，所以网络安全要牢记心中。本篇文章为大家分享防止SSH被爆破的两种方案，并且最简单方便。

### 方案一：关闭密码登录改为使用私钥登录

简介：通过关闭SSH密码登录，改用公钥认证，只有拥有对应私钥的用户才能登录。
服务器存储用户的公钥，客户端使用私钥进行身份验证，非对称加密确保安全性，彻底杜绝密码暴力破解。

1：生成`ED25519`类型的 SSH 密钥对

```
ssh-keygen -t ed25519
```
>一路回车即可，生成的`id_ed25519`文件为私钥，使用这个私钥文件连接服务器，`id_ed25519.pub`文件为公钥。


2：然后进入存储SSH密钥的目录，并配置公钥
```
cd /root/.ssh
cat id_ed25519.pub >> authorized_keys
```


3：修改SSH配置文件

文件路径在`/etc/ssh/sshd_config`
```
sudo vim /etc/ssh/sshd_config
```

4：找到对应的配置然后修改，这里仅展示需要修改的地方
```
# 修改SSH服务端口
Port 2222

# 启用公钥认证
PubkeyAuthentication yes

# 指定存储公钥的文件位置(增加此项)
AuthorizedKeysFile .ssh/authorized_keys

# 禁止使用空密码登录
PermitEmptyPasswords no

# 禁止使用密码认证登录
PasswordAuthentication no
```

5：重启SSH服务
```
sudo systemctl restart ssh
```

---

### 方案二：端口敲门

:::note[注意]
请先看完教程再配置，配置后记得先测试一下，免得把自己关在门外了。
:::

简介：端口敲门通过关闭SSH端口，服务器监听预设的端口序列，当客户端按正确顺序`敲门`后，防火墙规则动态开放SSH端口，仅允许敲门成功的IP访问，阻止未授权访问。

1：安装`iptables`

大部分常见的Linux发行版已经默认安装了，无需额外安装，并且你安装了Docker后也是肯定安装了`iptables`。可以运行`iptables --version`查看版本。如果没有安装，可以执行这个命令安装：
```
sudo apt update && sudo apt install iptables -y
```


2：安装端口敲门程序`knockd`
```
sudo apt update && sudo apt install knockd -y
```

3：配置`knockd`

`knockd`的默认配置文件路径在`/etc/knockd.conf`

```
[options]
    UseSyslog
    logfile = /var/log/knockd.log

# 开启SSH访问 - 只允许敲门的IP访问
[openSSH]
    sequence    = 5003,5001
    seq_timeout = 15
    start_command = /sbin/iptables -C INPUT -s %IP% -p tcp --dport 22 -j ACCEPT || /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn
    cmd_timeout = 10

# 关闭所有SSH访问 - 阻止所有IP
[closeSSH]
    sequence    = 7001
    seq_timeout = 15
    start_command = /sbin/iptables -C INPUT -p tcp --dport 22 -j DROP || /sbin/iptables -I INPUT 1 -p tcp --dport 22 -j DROP && /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT 2>/dev/null
    tcpflags    = syn
    cmd_timeout = 10
```

4：启动`knockd`
```
sudo systemctl enable knockd
sudo systemctl start knockd
```

5：关门

网页访问`7001`端口关闭SSH服务，阻止所有IP访问SSH

6：敲门

按顺序网页访问`5003`和`5001`端口，需要15秒内完成动作，敲门后会自动放行敲门的IP允许连接SSH。

Liunx可以使用wget等命令敲门


#### （可选）关闭端口敲门

停止并禁用`knockd`
```
sudo systemctl stop knockd
sudo systemctl disable knockd
```

清除防火墙所有的自定义规则
```
sudo iptables -F
```

- 端口敲门不仅限于SSH端口，还能实现更多玩法。
