本文最后更新于 2025-07-25,文章内容可能已经过时。

当你的云服务器部署完成拥有了公网IP开始,便会被脚本小子的脚本扫描登录端口,尝试对其进行破解,一个月就能受到几万次撞库。这种攻击是不间断的、无差别的。一旦密码被破解,你的机器就会被黑客操控,轻则机器数据被清空,重则成为菠菜网站。所以服务器的安全是搭建网站的重中之重,那么如何操作才能使服务器不容易被破解呢?

一、服务器防火墙

国内大多数主流云服务商(如阿里云、腾讯云、华为云、AWS、Azure 等)在平台层面已经提供了基础的网络安全防护机制,这是服务器安全的第一道防线,主要包括:

1. 安全组(Security Group)

类似于虚拟防火墙,控制进出云服务器的流量。

可以设置入方向(Inbound)规则,出方向(Outbound)规则一般默认允许所有请求。

支持按协议(TCP/UDP/ICMP)、端口、IP地址进行过滤。当你需要给自己的网站开放端口时,还需要来平台开放该端口才能通行。

2. 网络访问控制列表(ACL,Network ACL)

在子网级别控制流量,比安全组更粗粒度。

通常用于补充安全组策略。

3. DDoS 防护

多数云服务商提供基础的 DDoS 防护服务(如清洗流量)。

高级防护需要额外付费。

但是一般用户只能获得最基础的防御,想要获得暴力破解、数据库攻击、可视化分析、病毒蠕虫、反弹shell、恶意外联等高级功能都是需要昂贵的付费。

庆幸的是即便只有基础功能的防火墙,一般来说也是够用的,但是对于公司与机构来说还是要按需购买的。这是国内主流平台的云服务器所提供的功能,还有一些小服务器商和国外vps商并不提供平台级别的防火墙。这就只能依靠Linux系统级别的防火墙了,例如iptables、firewalld、ufw。当你首次登录服务器时应当检查防火墙是否开启。

#Ubuntu、Debian:
  ufw status

#RHEL、Centos、Rocky Linux/AlmaLinux:
 systemctl status firewalld

显示 active 则表示防火墙开启。

显示 inactive 则表示防火墙未开启。

如果防火墙未开启,需要及时开启防火墙,但是在这之前必须要先开启常用端口,特别是SSH的22,一旦未放行该端口便启用了防火墙,就会导致SSH无法访问,如果没有其他访问方式的话就只能重装系统了。

Ubuntu、Debian:
 ufw status                 # 查看防火墙状态及规则列表
 ufw status verbose         # 详细模式(显示规则序号、日志状态等)
 ufw status numbered        # 带编号的规则列表(便于删除规则)
 ufw enable                 # 启用防火墙(开机自启)
 ufw disable                # 禁用防火墙
 ufw reset                  # 重置所有规则(恢复默认配置)
 ufw allow 22/tcp           # 允许TCP 22端口
 ufw allow 22/udp           # 允许UDP 22端口
 ufw allow SSH              # 放行SSH端口也就是 22端口,该命令更简单

RHEL、Centos、Rocky Linux/AlmaLinux:
 firewall-cmd --add-port=22/tcp --permanent      # 放行 22端口,需要重载
 firewall-cmd --list-ports                       # 查看当前放行的端口
 systemctl start firewalld                       # 启动防火墙
 systemctl stop firewalld                        # 停止防火墙
 systemctl restart firewalld                     # 重启防火墙
 systemctl enable firewalld                      # 设置开机自启
 systemctl disable firewalld                     # 禁止开机自启

如果你的服务器使用了1Panel面板,可以登录面板,在系统防火墙下进行防火墙操作。防火墙位置如下图:

在1Panel界面能够对端口进行可视化操作,不需要再进行命令行操作了。如果有部署网站需要放行其他端口的也可以在此操作或使用防火墙命令。

注意!!!在进行端口放行操作时,一定不要动SSH端口(22)和1Panel访问端口,如果关闭这些端口将导致你无法再访问你的服务器。

二、SSH登录方式更改

SSH登录是最常见的远程连接服务器手段。第一次使用SSH连接服务器时一般只支持用户名与密码登录,用户名固定为root,访问端口也固定为22,登录获得的权限极高,所以是黑客照顾的重点对象。国内主流的云服务器商由于有平台级别防火墙,能够帮忙过滤一些明显的攻击行为,而小服务器商和国外的vps每时每刻都在受到攻击。防火墙未开的话,一天便能收到几万次攻击,即便你不是设置的弱密码,这种高强度爆破也非常吓人。为了防止密码被爆破出来,我们需要采取其他措施来保护我们的服务器。

1、使用命令行修改SSH登录方式。

SSH除了使用密码登录之外,还可以使用密钥登录,并且可以直接关闭掉密码登录,这样可以从根本上解决掉密码被爆破的问题。

使用finalshell登录服务器之后使用命令生成密钥对:

#指定密钥类型为 RSA,指定密钥长度为 4096 位,可以自己添加保存位置,如果没有添加,私钥和公钥则默认保存在~/.ssh/id_rsa,设置私钥密码(私钥密码保证了私钥就算暴露没有密码也无法登录)。生成后,会得到一个私钥文件(id_rsa)和一个公钥文件(id_rsa.pub)。
SSH-keygen -t rsa -b 4096   

#将公钥添加至服务器,user为用户名,server_ip为服务器ip。执行后,系统会提示你输入服务器密码,验证通过后会自动将公钥添加到服务器的~/.ssh/authorized_keys文件中。
ssh-copy-id user@server_ip -i /home/root1/.ssh/id_rsa.pub

#如果无法使用ssh-copy-id命令,可以输出公钥内容,将输出内容复制到服务器的~/.ssh/authorized_keys文件中。
#输出公钥。
cat ~/.ssh/id_rsa.pub 
            
#使用nano修改authorized_keys文件,将输出内容复制进去,保存退出。
nano ~/.ssh/authorized_keys       

在finalshall里找到私钥位置下载到本地,然后删除服务器中的私钥。私钥需要妥善保存,私钥丢失可能导致服务器无法登录或者被黑。

2、1Panel面板设置SSH登录方式:

进入SSH管理,开启密钥认证,关闭密码认证,在root用户管理里面选择只能密钥登录。

点击密钥信息,点击随机密码自动生成一个随机密码,复制保存。点击生成密钥,在密钥栏会生成密钥,生成之后再下载到本地。

3、在finalshell里设置秘钥登录。

选取公钥认证方法,点击浏览选取私钥。没有导入私钥的话就先导入私钥,如果已经导入就选择已经编辑好的私钥。

点击浏览,选择刚刚下载好的私钥,输入服务器(或者自己能区分)的名字,输入自己设置的私钥密码。保存后就可以使用密钥登录了。

但是现在服务器即可以通过密钥登录也可以通过密码登录,我们需要禁止密码登录。

sudo nano /etc/ssh/sshd_config    #使用nano在服务器上编辑SSH配置,

将“# PasswordAuthentication yes”中的yes修改成no,并删除掉注释#。ctrl+X,保存退出。

重启SSH服务:

# Ubuntu/Debian
sudo systemctl restart ssh

# CentOS/RHEL
sudo systemctl restart ssh.service

退出SSH链接窗口,再次使用密码登录,验证是否生效,如果无法正常登录需要输入密码就代表生效成功。如果还能正常登录则表明未生效或者有其他配置文件覆盖了修改的配置文件。使用以下命令检查:

#使用 sshd -T 命令查看 SSH 服务器实际加载的所有配置(包括默认值),输出PasswordAuthentication yes,则未生效。
sudo sshd -T | grep -i passwordauthentication

#显示PasswordAuthentication 的配置,应当输出PasswordAuthentication no.如果输出yes,则是该配置未修改.按照上述操作修改.
sudo grep -i passwordauthentication /etc/ssh/sshd_config.d/50-cloud-init.conf

#递归搜索所有 SSH 配置文件中的密码认证设置,应当输出PasswordAuthentication no.如果输出yes,则是该配置未修改.按照上述操作修改.
sudo find /etc/ssh -name "*.conf" -exec grep -i passwordauthentication {} \; 2>/dev/null

#如果 50-cloud-init.conf 文件存在密码认证配置,可能是云环境(如 AWS、Azure)的初始化脚本覆盖了你的设置。直接编辑查看确保其中没有 PasswordAuthentication yes 或类似配置.
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
#所有的修改完之后都需要进行服务重启再检查是否生效。

三、Fail2ban

Fail2ban 是一款用于保护服务器免受暴力破解、恶意登录等攻击的开源安全工具。它通过监控系统日志(如 SSH、HTTP、FTP 等服务的日志),识别出重复失败的登录尝试或异常请求,然后根据预设的规则自动采取屏蔽措施(如禁止特定 IP 地址访问),从而提高服务器的安全性。

工作原理

监控日志:Fail2ban 会持续监控指定的日志文件(例如 /var/log/auth.log 用于记录 SSH 登录信息),从中筛选出与失败尝试相关的日志条目。

匹配规则:通过预设的过滤规则(称为 “过滤器”),识别出符合攻击特征的行为,例如短时间内多次 SSH 登录失败。

触发动作:当失败尝试的次数达到预设阈值(例如 5 分钟内 5 次失败),Fail2ban 会执行预设的 “动作”,最常见的是通过防火墙(如 iptables、firewalld)临时禁止该 IP 地址访问服务器。

自动解封:经过指定的时间(例如 10 分钟)后,Fail2ban 会自动解除对该 IP 的屏蔽,避免误封导致的长期访问问题。

核心组件

过滤器(Filters):定义如何从日志中识别失败尝试,通常以正则表达式编写,位于 /etc/fail2ban/filter.d/ 目录,例如 sshd.conf 用于匹配 SSH 失败日志。

动作(Actions):指定检测到攻击后执行的操作,常见的有防火墙屏蔽(如 iptables-multiport)、发送邮件通知等,配置文件位于 /etc/fail2ban/action.d/

监狱(Jails):是 Fail2ban 的核心配置单元,将过滤器和动作关联起来,并设置阈值(如最大失败次数、屏蔽时长等)。例如,sshd 监狱会监控 SSH 日志,使用 sshd 过滤器和指定动作。

1、命令行安装Fail2ban

在主流 Linux 发行版中可通过包管理器安装。

#Ubuntu/Debian
sudo apt install fail2ban

#CentOS/RHEL
sudo yum install fail2ban

#Fedora
sudo dnf install fail2ban

修改配置文件

#主配置文件:/etc/fail2ban/jail.conf(建议不要直接修改,而是通过 jail.local 覆盖配置)。
#自定义配置:创建 /etc/fail2ban/jail.local,在其中添加或修改监狱配置。
sudo touch /etc/fail2ban/jail.local

#添加配置
sudo nano /etc/fail2ban/jail.local

#配置内容复制进去保存退出,按需修改。
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5  # 最大失败次数
bantime = 600  # 屏蔽时长(秒)
findtime = 300  # 检测时间窗口(秒,5分钟内超过5次失败则屏蔽)

#启动服务
sudo systemctl start fail2ban

#设置开机自启
sudo systemctl enable fail2ban
#常见命令
#查看状态
sudo fail2ban-client status(查看所有监狱状态)或 sudo fail2ban-client status sshd(查看指定监狱)

#手动解封 IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

#手动屏蔽 IP
sudo fail2ban-client set sshd banip 192.168.1.100

#其他常见服务配置示例
#Nginx
[nginx-botsearch]
enabled  = true
port     = http,https
filter   = nginx-botsearch  # 需要创建对应的过滤器
logpath  = /var/log/nginx/access.log
maxretry = 10
bantime  = 86400  # 1天
findtime = 3600   # 1小时

#FTP
[vsftpd]
enabled  = true
port     = ftp,ftp-data,ftps,ftps-data
filter   = vsftpd
logpath  = /var/log/vsftpd.log
maxretry = 3
bantime  = 3600

#Postfix SMTP 
[postfix]
enabled  = true
port     = smtp,ssmtp,submission
filter   = postfix
logpath  = /var/log/mail.log
maxretry = 5
bantime  = 3600

2、1Panel安装Fail2ban

在1Panel面板的工具箱里可以找到Fail2ban。默认状态下是没有安装的,点击快速跳转至安装界面。

勾选安装Fail2ban,点击执行。

执行完之后返回至工具箱Fail2ban界面,按需设置,IP黑名单内是已经被拉黑的IP地址。

完成这些设置之后,可以杜绝绝大部分的攻击。只需要再定期上线查看日志,检查authorized_keys 是否有被添加异常的公钥,基本上可以保证服务器的安全。