VPS 上手一条龙
2024-09-18 02:46:04 # Technical # Linux

更新 apt 包

1
2
3
4
5
6
7
8
9
10
# 更新包索引,确保包管理器拥有最新的软件包列表
$ apt update
# 升级所有已安装的软件包到最新版本,-y 选项自动回答“是”以确认安装
$ apt upgrade -y
# 类似于 apt upgrade,但除了升级包,还会处理依赖关系的更改和可能需要移除或安装其他包
$ apt dist-upgrade -y
# 类似于 apt dist-upgrade,确保系统上的所有包都更新到最新版本,并处理任何可能的包冲突和依赖问题
$ apt full-upgrade -y
# 自动删除不再需要的包和依赖项,以释放磁盘空间
$ apt autoremove -y

更换软件源

1
bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh)

开启 BBR

1
2
3
4
5
$ echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
$ sysctl -p
$ sysctl net.ipv4.tcp_available_congestion_control
$ lsmod | grep bbr

创建用户

1
2
3
4
5
6
7
8
9
# `-m`:自动创建用户的主目录 `-s /bin/bash`:设置用户的默认 Shell 为 bash
$ sudo useradd -m -s /bin/bash <newuser>
# 设置密码
$ sudo passwd <newuser>
# 授予sudo权限
$ sudo usermod -aG sudo <newuser>
# 确保主目录的权限和所有权正确
$ sudo chown -R <newuser>:<newuser> /home/<newuser>
$ sudo chmod 750 /home/<newuser>

禁 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
2
3
4
5
6
7
8
> ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
# 指定密钥生成位置
Enter file in which to save the key (C:\Users\<user>/.ssh/id_ed25519):
# 输入密钥密码
Enter passphrase (empty for no passphrase):
# 再输一遍
Enter same passphrase again:

到服务器上切换到需要登录的用户上(非 root)

1
2
3
4
5
6
7
8
9
10
# 切换用户
$ su - venom
# 创建公钥文件夹
$ mkdir ~/.ssh
# 授权
$ chmod 700 ~/.ssh
# 将本地的公钥内容写到authorized_keys中
$ vim ~/.ssh/authorized_keys
# 授权
$ chmod 600 .ssh/authorized_keys

修改 sshd 配置文件 /etc/ssh/sshd_config

1
2
3
4
5
6
7
8
9
10
11
# 日志
SyslogFacility AUTH
LogLevel VERBOSE
# 禁止root登录
PermitRootLogin no
# 允许公钥登录
PubkeyAuthentication yes
# 禁止密码登录
PasswordAuthentication no
# 禁止空密码
PermitEmptyPasswords no

日志说明:

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
2
3
4
5
$ fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: sshd

查看监控目标的运行情况

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
× fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Thu 2024-06-27 04:11:07 PDT; 2s ago
Duration: 261ms
Docs: man:fail2ban(1)
Process: 41856 ExecStart=/usr/bin/fail2ban-server -xf start (code=exited, status=255/EXCEPTION)
Main PID: 41856 (code=exited, status=255/EXCEPTION)
CPU: 247ms

systemd[1]: Started fail2ban.service - Fail2Ban Service.
fail2ban-server[41856]: 2024-06-27 04:11:07,381 fail2ban.configreader [41856]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
fail2ban-server[41856]: 2024-06-27 04:11:07,406 fail2ban [41856]: ERROR Failed during configuration: Have not found any log file for sshd jail
fail2ban-server[41856]: 2024-06-27 04:11:07,410 fail2ban [41856]: ERROR Async configuration of server failed
systemd[1]: fail2ban.service: Main process exited, code=exited, status=255/EXCEPTION
systemd[1]: fail2ban.service: Failed with result 'exit-code'.

/etc/fail2ban 下创建文件 jail.local

1
2
3
4
5
6
7
8
9
10
11
12
13
[DEFAULT]
# Debian 12 has no log files, just journalctl
backend = systemd

# 禁用时间:m-分钟,h-小时,d-天,默认秒
bantime = 31d
# 最大失败次数
maxretry = 5
# 尝试登录的单位时间
findtime = 1h

[sshd]
enabled = true

然后可以尝试启动

1
$ systemctl start fail2ban.service

如果正常启动则 ok

如果出现下面的异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
2023-08-15 13:07:06,212 fail2ban.server         [32501]: INFO    Starting Fail2ban v1.0.2
2023-08-15 13:07:06,213 fail2ban.observer [32501]: INFO Observer start...
2023-08-15 13:07:06,219 fail2ban.database [32501]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2023-08-15 13:07:06,219 fail2ban.jail [32501]: INFO Creating new jail 'sshd'
2023-08-15 13:07:06,424 fail2ban.jail [32501]: ERROR Backend 'systemd' failed to initialize due to No module named 'systemd'
... absolutely HUGE stack trace here ...
2023-08-15 13:07:06,428 fail2ban [32501]: ERROR NOK: ("Failed to initialize any backend for Jail 'sshd'",)
2023-08-15 13:07:06,429 fail2ban.server [32501]: INFO Shutdown in progress...
2023-08-15 13:07:06,429 fail2ban.observer [32501]: INFO Observer stop ... try to end queue 5 seconds
2023-08-15 13:07:06,450 fail2ban.observer [32501]: INFO Observer stopped, 0 events remaining.
2023-08-15 13:07:06,490 fail2ban.server [32501]: INFO Stopping all jails
2023-08-15 13:07:06,490 fail2ban.database [32501]: INFO Connection to database closed.
2023-08-15 13:07:06,691 fail2ban.server [32501]: INFO Exiting Fail2ban

则还需要安装 python3-systemd

1
$ apt install python3-systemd