服务器被暴力SSH爆破,如何防护与封禁IP

前言

公网服务器的22端口每天都会被机器人字典爆破,日志里满是 Failed password。口令弱就容易被撞库拿到root。本篇从"先排查→临时封禁→加固配置→自动防护"给出一套可落地的做法。

一、先确认是不是被爆破

# 统计失败次数最多的IP
lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head
# 或看secure日志里的失败记录
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head

出现大量同一IP的失败尝试,就是爆破。

二、手动封禁恶意IP(应急)

firewalld 临时/永久拉黑:

# 临时封禁
firewall-cmd --add-rich-rule='rule family=ipv4 source address=1.2.3.4 reject'
# 永久封禁
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=1.2.3.4 reject'
firewall-cmd --reload
# 查看已加规则
firewall-cmd --list-rich-rules
# 解除封禁
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=1.2.3.4 reject'

也可用 iptables -A INPUT -s 1.2.3.4 -j DROP。

三、加固sshd配置(根本)

编辑 /etc/ssh/sshd_config:

# 修改默认端口,别再用22
Port 2222
# 禁止root直接密码登录
PermitRootLogin no
# 禁用空密码
PermitEmptyPasswords no
# 建议改用密钥登录后关闭密码
PasswordAuthentication no
# 最大尝试次数
MaxAuthTries 3
# 10分钟无活动断开
ClientAliveInterval 600

改完 systemctl restart sshd,先保留当前会话再重启,防止把自己锁外面;新端口记得在防火墙放行。

四、自动防爆:fail2ban

自动统计失败次数并封IP,最省事:

yum install -y fail2ban fail2ban-firewalld

新建 /etc/fail2ban/jail.local:

[sshd]
enabled = true
port = 2222
maxretry = 5
findtime = 600
bantime = 86400

启动并自启:

systemctl enable --now fail2ban
# 查看封禁名单
fail2ban-client status sshd

五、常见坑

  1. 改端口只改sshd忘了防火墙放行:自己也连不上,务必先 firewall-cmd --permanent --add-port=2222/tcp;
  2. 关密码登录前没配好密钥:直接被锁门外;
  3. 只封一次IP:机器人换段继续扫,要用fail2ban自动封;
  4. 云安全组没限制:在安全组只放行你常用IP访问SSH端口,比本机防护更前置;
  5. 弱密码root:PermitRootLogin no + 密钥才是正解,改端口只是提高门槛。

总结

应急用firewalld拉黑,长期靠改端口、禁root密码、上密钥,再用fail2ban自动封高频失败IP,云安全组白名单兜底。层层叠加,爆破就很难成功。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-20 07:29 

Linux防火墙配置

Linux防火墙配置

引言

云服务器安全不能只靠系统防火墙,开通端口是上线必经步骤。CentOS 7以上默认使用firewalld,很多新手忘了放行端口,导致网站、SSH、数据库从外部连不上。

firewalld常用命令

#查看防火墙状态
firewall-cmd --state

#查看已放行端口
firewall-cmd --list-ports

#永久放行80、443端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp

#重新加载生效
firewall-cmd --reload

#移除某个端口
firewall-cmd --permanent --remove-port=3306/tcp

区域概念

firewalld分public、internal等zone,默认public。--permanent写入永久规则,不加只对当前会话生效,重启失效。改完必须reload。

常用放行场景

  • Web服务:80、443;
  • SSH远程:22(建议改非默认端口再放行);
  • 不要对公网开放3306、6379、27017等数据库端口;
  • 只允许指定IP访问管理端口更安全:
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=1.2.3.4 port port=22 protocol=tcp accept'

注意事项

  • 云服务器除了系统防火墙,还要在云厂商控制台安全组同步放行;
  • 改SSH端口前先确认新端口放行,避免把自己挡在门外;
  • 防火墙规则最小化,只开放必要端口。

总结

firewalld核心:查看列表、永久加端口、reload生效。记住系统防火墙和云安全组两层都要放行,数据库端口绝不暴露公网,管理端口限制来源IP。


emer 发布于  2026-10-18 07:22 

服务器SSH安全加固,改端口和密钥登录

前言

服务器刚买,SSH一直被暴力破解?默认22端口全是黑客在扫。本文讲怎么SSH安全加固:改端口、禁用密码登录、用密钥登录。

一、为什么要加固SSH

默认SSH配置太危险:

  • 端口22是公开的,黑客都扫
  • root密码登录容易被暴力破解
  • 密码可能被盗

二、第一步:改SSH端口

编辑SSH配置

vi /etc/ssh/sshd_config

找到:

#Port 22

改成:

Port 22222

(随便选个1024-65535之间的端口)

防火墙开放新端口

firewalld:

firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload

iptables:

iptables -I INPUT -p tcp --dport 22222 -j ACCEPT

重启SSH

systemctl restart sshd

注意: 改完端口后,连接SSH要用新端口:

ssh -p 22222 root@服务器IP

三、第二步:生成密钥对

在你自己电脑上生成

ssh-keygen -t rsa -b 4096

一路回车,生成两个文件:

  • ~/.ssh/id_rsa (私钥,自己留着)
  • ~/.ssh/id_rsa.pub (公钥,传到服务器)

把公钥传到服务器

ssh-copy-id -p 22222 root@服务器IP

或者手动传:

# 服务器上创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 把公钥内容追加到authorized_keys
vi ~/.ssh/authorized_keys
# 把id_rsa.pub的内容粘进去

chmod 600 ~/.ssh/authorized_keys

测试密钥登录

ssh -p 22222 root@服务器IP

不用输密码就能登录就对了。

四、第三步:禁用密码登录

编辑SSH配置

vi /etc/ssh/sshd_config

找到:

#PasswordAuthentication yes

改成:

PasswordAuthentication no

找到:

#PermitRootLogin yes

改成:

PermitRootLogin prohibit-password

(允许root用密钥登录,但不允许密码登录)

重启SSH

systemctl restart sshd

五、第四步:其他安全设置

限制登录尝试次数

防止暴力破解:

MaxAuthTries 3

登录超时时间

ClientAliveInterval 300
ClientAliveCountMax 2

禁止空密码登录

PermitEmptyPasswords no

只允许特定用户登录

AllowUsers root

六、安装fail2ban

自动封禁暴力破解的IP。

安装

yum install -y epel-release
yum install -y fail2ban

配置

vi /etc/fail2ban/jail.local

加内容:

[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 86400

启动

systemctl start fail2ban
systemctl enable fail2ban

七、完整配置文件参考

vi /etc/ssh/sshd_config
Port 22222
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
PermitEmptyPasswords no

改完重启:

systemctl restart sshd

八、常见坑

坑1:改完端口连不上了

原因: 防火墙没开放新端口。

解决:

  • 云服务器还要在控制台安全组里开放端口
  • 先开新窗口测试,别关旧窗口

坑2:密钥登录失败

原因: 权限不对。

检查:

ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys

正确权限:

  • .ssh目录:700
  • authorized_keys:600

坑3:禁用密码后进不去了

原因: 密钥没配好就禁用密码了。

解决: 一定先测试密钥登录成功,再禁用密码。

坑4:云服务器安全组没开

改了端口,防火墙也开了,但还是连不上。

原因: 云服务商的安全组没开。

解决: 去云控制台(阿里云/腾讯云)安全组里开放端口。

总结

记住:

  1. 改SSH默认端口(22改成别的)
  2. 生成密钥对,传公钥到服务器
  3. 测试密钥登录成功
  4. 禁用密码登录
  5. 安装fail2ban自动封IP
  6. 云服务器记得开安全组

安全加固顺序:

改端口 → 配密钥 → 测试登录 → 禁密码 → 装fail2ban

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:46 

服务器被暴力ssh爆破,如何防护与封禁IP

前言

刚装好的服务器没几天,一看登录日志吓一跳——全是各种IP在尝试SSH登录,用户名猜遍了root、admin、test,密码也是暴力破解。这就是典型的SSH暴力破解攻击。如果你的服务器密码又简单,很容易被破解进来。本文就讲一下怎么发现暴力破解、怎么封禁恶意IP,以及怎么从根本上防护。

第一步:查看SSH登录日志

先看看有没有被爆破。CentOS7 的SSH日志在 /var/log/secure:

tail -100 /var/log/secure

如果看到大量类似这样的记录,就是被爆破了:

Failed password for root from 1.2.3.4 port 12345 ssh2
Failed password for admin from 5.6.7.8 port 23456 ssh2

统计一下尝试登录的次数最多的IP:

grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -10

输出会列出尝试登录次数最多的10个IP。

防护方案一:使用 fail2ban 自动封禁

手动封禁太慢了,用 fail2ban 可以自动检测并封禁恶意IP。

1. 安装 EPEL 源

yum install epel-release -y

2. 安装 fail2ban

yum install fail2ban -y

3. 配置 fail2ban

vi /etc/fail2ban/jail.local

写入以下内容:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 86400
findtime = 600

参数说明:

  • enabled = true:启用这个规则
  • maxretry = 3:最多尝试3次
  • bantime = 86400:封禁24小时(单位秒)
  • findtime = 600:10分钟内的失败次数

4. 启动 fail2ban

systemctl start fail2ban
systemctl enable fail2ban

5. 查看封禁状态

fail2ban-client status sshd

防护方案二:手动封禁恶意IP

如果不想装 fail2ban,也可以手动用 firewall-cmd 封禁IP:

封禁单个IP

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.2.3.4' reject"
firewall-cmd --reload

查看已封禁的规则

firewall-cmd --list-rich-rules

解除封禁

firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.2.3.4' reject"
firewall-cmd --reload

防护方案三:修改SSH默认端口

SSH默认端口是22,所有人都知道,扫端口的机器人都会先扫22。改成一个不常见的端口能挡住90%的自动扫描。

1. 编辑SSH配置

vi /etc/ssh/sshd_config

找到 #Port 22,改成:

Port 22222

2. 防火墙开放新端口

firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload

3. 重启SSH服务

systemctl restart sshd

注意: 改完端口后,连接时要指定新端口:ssh -p 22222 root@你的服务器IP。千万不要关掉当前SSH窗口!新开一个窗口测试,确认新端口能连上了再关旧窗口。

防护方案四:禁止root密码登录,改用密钥登录

最彻底的防护就是不让密码登录,只用SSH密钥登录。

1. 生成SSH密钥对

在你本地电脑上执行:

ssh-keygen -t rsa -b 4096

一路回车,会生成两个文件:

  • ~/.ssh/id_rsa:私钥,放在你本地
  • ~/.ssh/id_rsa.pub:公钥,上传到服务器

2. 上传公钥到服务器

ssh-copy-id -p 22222 root@你的服务器IP

3. 配置SSH禁用密码登录

vi /etc/ssh/sshd_config

找到并修改:

PasswordAuthentication no
PermitRootLogin yes
PubkeyAuthentication yes

4. 重启SSH服务

systemctl restart sshd

注意: 改之前一定要确认密钥登录能正常用!不然改完就连不上了。

防护方案五:限制只允许特定IP登录

如果你自己的IP是固定的,可以只允许自己的IP登录SSH:

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='你的IP/24' port protocol='tcp' port='22' accept"
firewall-cmd --permanent --remove-port=22/tcp
firewall-cmd --reload

这样只有你指定的IP段才能连SSH,其他IP直接拒绝。

常见坑

坑1:改了SSH端口忘了开防火墙

改完SSH端口后,忘了在防火墙里开放新端口,结果新端口连不上,旧端口也关了,直接把自己锁在外面。

解决: 改完端口后,一定要先开防火墙再重启SSH,而且要新开窗口测试。

坑2:用fail2ban把自己封了

测试的时候故意输错几次密码,结果被fail2ban封了自己的IP。

解决: 把自己的IP加到 fail2ban 的忽略列表里:

ignoreip = 127.0.0.1/8 你的IP

坑3:禁用密码登录前没测试密钥

直接就把 PasswordAuthentication no 了,结果密钥没配好,连不上服务器了。

解决: 先测试密钥登录能正常用,再禁用密码登录。千万不要关当前窗口,新开窗口测试。

总结

SSH暴力破解防护的优先级:

  1. 改SSH端口:从22改成其他端口,挡住大部分自动扫描
  2. 用fail2ban:自动封禁多次失败的IP
  3. 用密钥登录:禁用密码登录,这是最彻底的防护
  4. 限制IP:只允许自己的IP段登录

防护措施不是越多越好,够用就行。最推荐的组合是:改端口 + fail2ban + 密钥登录,这一套下来基本就很安全了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:32 

CentOS7 关闭SELinux详细步骤,临时+永久关闭

前言

刚装完 CentOS7,部署网站的时候老是遇到各种权限问题:文件明明权限对了还是访问不了,端口也开了就是连不上。排查半天发现是 SELinux 在捣乱。SELinux 是 CentOS 自带的强制访问控制安全机制,安全性很高,但对新手来说确实不太友好。本文详细讲一下怎么临时和永久关闭 SELinux,以及关闭前需要知道的注意事项。

什么是 SELinux

SELinux(Security-Enhanced Linux)是 Linux 内核的一个安全模块,提供强制访问控制(MAC)机制。它比传统的自主访问控制(DAC)更严格,不仅看文件权限,还看进程和文件的安全上下文(SELinux 标签)。

CentOS7 默认开启 SELinux,这也是为什么很多新手部署完网站各种报错的原因——Nginx、PHP、MySQL 的进程和文件上下文不匹配,SELinux 直接拦截。

查看 SELinux 状态

在关闭之前,先看看 SELinux 当前是什么状态:

getenforce

输出可能是:

  • Enforcing:强制模式,SELinux 正在拦截违规操作
  • Permissive:宽容模式,只记录警告不拦截
  • Disabled:已关闭

也可以用这个命令看更详细的信息:

sestatus

输出示例:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed

临时关闭 SELinux(重启后失效)

如果你只是临时测试一下,不想改配置文件,可以用这个方法:

setenforce 0

setenforce 0 表示切换到 Permissive 宽容模式,SELinux 不会再拦截操作,但会在日志里记录。这个命令立即生效,不需要重启。

验证一下:

getenforce

应该输出 Permissive。

注意: 这种方式重启服务器后 SELinux 会重新开启,所以只是临时生效。

永久关闭 SELinux(重启后依然关闭)

要永久关闭,需要修改配置文件:

1. 编辑 SELinux 配置文件

vi /etc/selinux/config

2. 修改 SELINUX 的值

找到这一行:

SELINUX=enforcing

改成:

SELINUX=disabled

3. 保存退出,重启服务器

reboot

重启后再验证一下:

getenforce

应该输出 Disabled。

三种模式说明

SELinux 有三种模式,大家可以根据需求选择:

模式 说明
enforcing 强制模式,SELinux 强制执行策略,违规操作直接拦截
permissive 宽容模式,只记录警告日志,不拦截操作
disabled 完全关闭 SELinux

建议: 如果只是临时调试,可以用 permissive 模式,既能放行所有操作,又能通过日志看到哪些操作被 SELinux 拦截了。生产环境如果实在搞不懂 SELinux,再考虑完全关闭。

常见坑

坑1:改了配置文件没重启就以为关了

很多朋友改完 /etc/selinux/config 文件,马上用 getenforce 查看,发现还是 Enforcing,就以为没改成功。其实配置文件改了之后必须重启服务器才会生效。临时生效用 setenforce 0,永久生效必须重启。

坑2:改了 SELINUX=disabled 但还有问题

有时候即使把 SELinux 关了,之前设置的安全上下文标签还在,可能会导致一些奇怪的问题。如果遇到这种情况,可以重启服务器彻底解决。

坑3:生产环境直接关闭有安全风险

SELinux 是一道安全防线,生产环境直接完全关闭会降低系统安全性。建议先尝试把模式改成 permissive,看看日志里哪些操作被拦截了,再针对性地调整上下文标签,而不是直接全部关掉。

总结

CentOS7 关闭 SELinux 的两种方式:

临时关闭(立即生效,重启失效):

setenforce 0

永久关闭(重启后生效):

  1. 编辑 /etc/selinux/config
  2. 把 SELINUX=enforcing 改成 SELINUX=disabled
  3. 重启服务器

新手刚部署完服务器,先临时关了跑通业务,后面再慢慢研究 SELinux 的配置,别一上来就跟它死磕。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:25 
'); })();