更新 apt 包
1 | # 更新包索引,确保包管理器拥有最新的软件包列表 |
更换软件源
1 | bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh) |
开启 BBR
1 | $ echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf |
创建用户
1 | # `-m`:自动创建用户的主目录 `-s /bin/bash`:设置用户的默认 Shell 为 bash |
禁 Ping
编辑 sysctl
配置文件:
打开 /etc/sysctl.conf
文件
1 | $ sudo vim /etc/sysctl.conf |
添加或修改以下行以禁止 ICMP echo 请求
1 | net.ipv4.icmp_echo_ignore_all = 1 |
应用更改:
运行以下命令使更改立即生效:
1 | $ sudo sysctl -p |
配置密钥登录 ssh
在本地执行
1 | > ssh-keygen -t ed25519 |
到服务器上切换到需要登录的用户上(非 root)
1 | # 切换用户 |
修改 sshd 配置文件 /etc/ssh/sshd_config
1 | # 日志 |
日志说明:
SyslogFacility
指定日志的类别
- AUTH: 认证相关消息(默认值)
- AUTHPRIV: 私有认证消息,仅对授权用户可见
- DAEMON: 系统守护进程使用
- USER: 用户级消息
- LOCAL0-LOCAL7: 本地使用,通常用于自定义应用程序的日志
LogLevel
指定日志级别
- QUIET:最低日志级别,仅记录严重错误和非常关键的信息
- FATAL:只记录导致 SSH 守护进程崩溃的严重错误
- ERROR:记录错误信息,包括所有影响功能的错误,但不包括警告和正常操作的信息
- INFO:记录一般信息,包括连接成功、认证失败、配置问题等信息
- VERBOSE:记录详细信息,包括客户端连接、断开连接、键交换等更详细的操作信息
- DEBUG:记录调试信息,提供非常详细的调试信息,用于开发和调试
- DEBUG1
- DEBUG2
- DEBUG3:这些级别提供越来越详细的调试信息,DEBUG1 最少,DEBUG3 最详细
重启 sshd 服务,是配置生效
1 | $ sudo systemctl restart sshd |
ssh 日志
查看日志
1 | $ journalctl -u ssh |
或者
1 | $ cat /var/log/auth.log |more |
查看成功的连接
1 | $ journalctl -u ssh |grep "Accepted" |
或者
1 | $ cat /var/log/auth.log |grep "Accepted" |
恶意攻击日志
1 | error: beginning MaxStartups throttling |
表示 sshd 已经达到了 MaxStartups 配置设置的最大并发未认证连接数。为了防止可能的拒绝服务(DoS)攻击,sshd 开始丢弃新的连接请求
1 | drop connection #10 from [192.240.123.137]:38158 on [167.30.81.59]:22 past MaxStartups |
表示 sshd 丢弃了一个来自 IP 地址 192.240.123.137 端口 38158 的连接请求,因为它超过了 MaxStartups 限制。服务器的 IP 地址和端口分别是 167.30.81.59 和 22
1 | Connection from 144.202.112.137 port 40228 on 167.30.81.59 port 22 rdomain "" |
表示 sshd 接受了一个来自 IP 地址 144.202.112.137 端口 40228 的新连接请求,服务器的 IP 地址和端口分别是 167.30.81.59 和 22。rdomain “” 表示连接没有使用路由域(routing domain)
1 | error: kex_exchange_identification: Connection closed by remote host |
表示在密钥交换(key exchange)阶段发生错误,连接被远程主机关闭。kex_exchange_identification 是 SSH 连接的初始阶段之一,负责双方之间交换加密密钥
1 | Invalid user developer from 198.98.53.42 port 44318 |
表示 SSH 守护进程收到了一个来自 IP 地址 198.98.53.42 端口 44318 的连接请求,尝试使用用户名 developer 登录,但系统中没有这个用户
1 | pam_unix(sshd:auth): check pass; user unknown |
pam_unix 模块在尝试验证用户 developer 的密码时,发现这个用户是未知的(即不存在)
1 | pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=198.98.53.42 |
PAM 认证失败,无法验证用户 developer 的身份。logname、uid、euid 等字段提供了与失败相关的更多详细信息
1 | Failed password for invalid user developer from 198.98.53.42 port 44318 ssh2 |
SSH 守护进程记录了密码验证失败的尝试。由于用户 developer 是无效的,所以验证失败
1 | Received disconnect from 198.98.53.42 port 44318:11: Bye Bye [preauth] |
在认证完成之前(preauth 阶段),SSH 守护进程收到了来自客户端的断开连接请求。客户端主动断开连接
1 | Disconnected from invalid user developer 198.98.53.42 port 44318 [preauth] |
SSH 守护进程确认已断开来自 198.98.53.42 端口 44318 的无效用户 developer 的连接
Fail2Ban
安装
1 | $ apt install fail2ban |
查看 fail2ban 状态
1 | $ systemctl status fail2ban.service |
启动 fail2ban
1 | $ systemctl start fail2ban.service |
设置开启启动
1 | $ systemctl enable fail2ban.service |
Fail2Ban 客户端
查看 fail2ban 版本
1 | $ fail2ban-client -V |
查看监控目标
1 | $ fail2ban-client status |
查看监控目标的运行情况
1 | $ fail2ban-client status sshd |
查看 ==所有监控目标== 被封的 ip
1 | $ fail2ban-client banned |
解封某个监控目标被禁的 ip
1 | $ fail2ban-client set <jail> unbanip <ip> |
手动封禁某个监控目标的 ip
1 | $ fail2ban-client set <jail> banip <ip> |
Fail2Ban 启动异常
1 | × fail2ban.service - Fail2Ban Service |
到 /etc/fail2ban
下创建文件 jail.local
1 | [DEFAULT] |
然后可以尝试启动
1 | $ systemctl start fail2ban.service |
如果正常启动则 ok
如果出现下面的异常:
1 | 2023-08-15 13:07:06,212 fail2ban.server [32501]: INFO Starting Fail2ban v1.0.2 |
则还需要安装 python3-systemd
包
1 | $ apt install python3-systemd |
拒绝被封 IP 的所有请求
默认情况下,Fail2Ban 只会封禁特定服务(如 SSH)上的恶意 IP 地址,而不会阻止这些 IP 地址对服务器上的其他服务或端口的访问。但对于这些恶意 IP 地址,我希望它们无法访问服务器上的任何服务。 要实现这一点,可以通过自定义 iptables
规则来拒绝被 Fail2Ban 封禁的 IP 地址的所有请求。
新建一个自定义的
iptables
规则文件:创建一个新的文件
/etc/fail2ban/action.d/iptables-blockall.conf
,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[Definition]
actionstart = <iptables> -N f2b-<name>
<iptables> -A f2b-<name> -j <returntype>
<iptables> -I <chain> -j f2b-<name>
actionstop = <iptables> -D <chain> -j f2b-<name>
<iptables> -X f2b-<name>
actioncheck = <iptables> -n -L <chain> | grep -q 'f2b-<name>[ \t]'
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
[Init]
name = default
chain = INPUT
blocktype = REJECT
returntype = RETURN
iptables = iptables这个配置文件定义了一个新的
iptables
链f2b-<name>
,并在INPUT
链中插入规则以拒绝所有来自被封禁 IP 地址的流量。编辑 Fail2Ban 配置文件:
打开或创建
/etc/fail2ban/jail.local
文件,添加刚刚创建的 action:1
2
3[sshd]
enabled = true
banaction = iptables-blockall重启 Fail2Ban 服务:
1
$ systemctl restart fail2ban
查看 iptables 拒绝请求的 ip:
1
2
3
4
5
6
7
8
9
10
11
12$ iptables -L f2b-sshd -v -n
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
16 928 REJECT all -- * * 14.103.114.90 0.0.0.0/0 reject-with icmp-port-unreachable
50 3144 REJECT all -- * * 103.172.236.15 0.0.0.0/0 reject-with icmp-port-unreachable
49 3080 REJECT all -- * * 124.18.243.125 0.0.0.0/0 reject-with icmp-port-unreachable
49 3396 REJECT all -- * * 138.68.166.31 0.0.0.0/0 reject-with icmp-port-unreachable
52 3236 REJECT all -- * * 195.154.178.238 0.0.0.0/0 reject-with icmp-port-unreachable
54 3412 REJECT all -- * * 211.253.9.49 0.0.0.0/0 reject-with icmp-port-unreachable
55 3364 REJECT all -- * * 130.180.39.134 0.0.0.0/0 reject-with icmp-port-unreachable
34 2148 REJECT all -- * * 193.151.143.30 0.0.0.0/0 reject-with icmp-port-unreachable
960K 205M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0这将显示
f2b-sshd
链中的所有规则,即被封禁的 IP 地址及其拒绝状态。