Ubuntu基本配置

ubuntu备份文件添加时间

1
2
# 备份整个Nginx配置目录(防止配置丢失)
sudo cp -r /etc/nginx /etc/nginx.bak-$(date +%Y%m%d) 备份加入时间 一定要注意格式 +%Y%m%d 必须写到一起

更新自动安装

  1. 编辑 /etc/needrestart/needrestart.conf 文件
1
2
3
4
5
6
7
8
9
10
#$nrconf{restart} = 'i';
# i: 交互提示重新启动(默认值)
i: prompt interactively for restarts (default value)
# a: 自动重启
a: restart automatically
# l: 列出需要重启的服务
l: list needed restarts

直接修改成:
$nrconf{restart} = 'a'

就不会再弹窗了,如果你想看要重启哪些服务,那就尝试设置成l试试。

  1. Ubuntu修改软件源

查看ubuntu版本

1
lsb_release -a
1
2
3
4
5
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Codename: jammy

软件源

1
2
# 吉林大学
https://mirrors,jiu.edu.cn/ubuntu

路径/etc/apt/sources.list

1
2
3
4
5
6
7
8
9
10
11
12
13
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
1
2
3
4
5
6
7
8
9
10
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
1
2
3
4
5
6
7
8
9
10
11

deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
1
2
3
4
5
6
7
8
9
10
deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse

路径/etc/apt/sources.list.d/ubuntu.sources

1
2
3
4
5
6
Enabled: yes # 添加 Enabled: no 进行禁用
Types: deb deb-src
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: noble noble-security noble-updates noble-proposed noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
1
2
3
4
5
6
Enabled: yes
Types: deb
URIs: http://mirrors.tencent.com/ubuntu/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
1
2
3
4
5
6
Enabled: yes
Types: deb
URIs: http://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

修改主机名后生效

  1. 永久更改主机名,编辑/etc/hostname文件:
1
sudo nano /etc/hostname    # 将文件中的内容替换为新的主机名,保存并退出
  1. 另外,还需要更新/etc/hosts文件中的主机名记录:
1
sudo nano /etc/hosts # 找到127.0.1.1这一行,更改旧的主机名为新的主机名
  1. 重启服务器; 或 不想重启系统,可以重新启动systemd-hostnamed服务或systemd-resolved服务来读取新的主机名设置。
1
shutdown -r now
1
2
sudo systemctl restart systemd-hostnamed
sudo systemctl restart systemd-resolved

设置系统时间同步

查看时间

1
timedatectl

设置为UTC

1
sudo timedatectl set-timezone UTC

启用网络时间同步

1
sudo timedatectl set-ntp true

修改时区:

1
timedatectl list-timezones  # 列出所有时区,可按 Ctrl+F 搜索(如 "Asia/Shanghai")

然后设置时区(以上海时区为例):

1
sudo timedatectl set-timezone Asia/Shanghai

默认使用的国外服务器可能在国内访问不稳定,需替换为国内服务器:

1
sudo nano /etc/systemd/timesyncd.conf

将文件内容修改为:

1
2
3
[Time]
NTP=ntp.aliyun.com ntp.ntsc.ac.cn # 阿里云+国家授时中心双服务器
FallbackNTP=0.cn.pool.ntp.org # 备用服务器池

保存后重启服务:

1
sudo systemctl restart systemd-timesyncd

同步服务有chronyd,systemd-timesyncd,NTP,选择一个安装

服务 特点 适用场景
chronyd 功能强大,同步快,精度高 服务器、需要高精度时间的场景
systemd-timesyncd 轻量,集成在 systemd 中 桌面用户、对时间精度要求不高的场景
ntp 传统 NTP 服务,稳定可靠 兼容性要求高的老系统或特定环境

安装 ntp

先查看之前是否安装过ntp,如果有,先删除残留配置和数据目录

1
2
3
4
sudo rm -rf /etc/ntpsec/ntp.conf
sudo rm -rf /etc/ntpsec/
sudo rm -rf /var/lib/ntpsec/
sudo rm -rf /var/log/ntpsec/

命令安装:

1
2
3
4
5
# 更新软件包列表
sudo apt update

# 安装chrony(包含chronyd服务)
sudo apt install ntp -y

安装完成后,服务会自动启动,可通过以下命令验证状态:

1
sudo systemctl status ntp

若显示 active (running),说明安装成功。

如果显示错误

**statistics directory /var/log/ntpsec/ does not exist or is unwriteable, error No such file or directory**创建目录:

1
2
# 创建缺失的日志目录
sudo mkdir -p /var/log/ntpsec/

设置文件权限,通过查看/etc/passwodntp创建的用户

1
2
3
# 设置正确的权限(确保 NTPsec 进程有权限写入)
sudo chown -R ntpsec:ntpsec /var/log/ntpsec/
sudo chmod 755 /var/log/ntpsec/

重新启动ntp

1
2
重启 NTPsec 服务使配置生效
sudo systemctl restart ntpsec

检查状态,和查看配置文件位置

1
2
验证服务状态
sudo systemctl status ntpsec

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# /etc/ntpsec/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list

# To enable Network Time Security support as a server, obtain a certificate
# (e.g. with Let's Encrypt), configure the paths below, and uncomment:
# nts cert CERT_FILE
# nts key KEY_FILE
# nts enable

# You must create /var/log/ntpsec (owned by ntpsec:ntpsec) to enable logging.
logfile /var/log/ntpsec/ntp.log
statsdir /var/log/ntpsec/
#statistics loopstats peerstats clockstats
#filegen loopstats file loopstats type day enable
#filegen peerstats file peerstats type day enable
#filegen clockstats file clockstats type day enable

# This should be maxclock 7, but the pool entries count towards maxclock.
tos maxclock 11

# Comment this out if you have a refclock and want it to be able to discipline
# the clock by itself (e.g. if the system is not connected to the network).
tos minclock 4 minsane 3

# Specify one or more NTP servers.

# Public NTP servers supporting Network Time Security:
# server time.cloudflare.com nts

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See https://www.pool.ntp.org/join.html for
# more information.
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

# 阿里云NTP服务器(国内常用,稳定可靠)(IPv4)
server ntp.aliyun.com iburst

# 腾讯云NTP服务器(国内常用,低延迟)(IPv4)
server time1.cloud.tencent.com iburst
# 阿里云备用NTP服务器 (IPv4)
server ntp1.aliyun.com iburst
# 国家授时中心NTP服务器(中国官方时间源) (IPv4)
server ntp.ntsc.ac.cn iburst
# 补充国家授时中心其他节点(提高可用性)(IPv4)
# 国家授时中心第二节点
server ntp2.ntsc.ac.cn iburst
# 国家授时中心第三节点
server ntp3.ntsc.ac.cn.ac.cn iburst

# 国家授时中心IPv6服务器(为IPv6设备提供授时)
# 国家授时中心IPv6节点1
server 2001:da8:8000:100::6 iburst
# 国家授时中心IPv6节点2
server 2001:da8:8000:100::7 iburst
# 阿里云IPv6 NTP服务器(备用)
# 阿里云IPv6 NTP节点
server 2400:3200::1 iburst
# 腾讯云IPv6
pool 2402:f000::1 iburst
# 清华大学IPv6
pool 2001:da8:8000::1 iburst


# Use Ubuntu's ntp server as a fallback.
server ntp.ubuntu.com

# Access control configuration; see /usr/share/doc/ntpsec-doc/html/accopt.html
# for details.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict default kod nomodify nopeer noquery limited
# 允许IPv4本地网络查询
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 允许IPv6本地网络查询(根据实际IPv6网段修改)
#restrict 240e::/64 nomodify notrap # 示例IPv6网段,需替换为实际网段

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
# 禁止服务器修改本机配置
restrict time1.cloud.tencent.com nomodify notrap noquery
restrict ntp.aliyun.com nomodify notrap noquery
restrict ntp1.aliyun.com nomodify notrap noquery
restrict ntp.ntsc.ac.cn nomodify notrap noquery
restrict ntp2.ntsc.ac.cn nomodify notrap noquery
restrict ntp3.ntsc.ac.cn nomodify notrap noquery

restrict 2400:3200::1 nomodify notrap noquery
restrict 2402:f000::1 nomodify notrap noquery
restrict 2001:da8:8000::1 nomodify notrap noquery
restrict 2001:da8:8000:100::6 nomodify notrap noquery
restrict 2001:da8:8000:100::7 nomodify notrap noquery

安装 chronyd

先查看之前是否安装过chronyd,如果有,先删除残留配置和数据目录

1

命令安装:

1
2
3
4
5
# 更新软件包列表
sudo apt update

# 安装chrony(包含chronyd服务)
sudo apt install chrony -y

安装完成后,服务会自动启动,可通过以下命令验证状态:

1
sudo systemctl status chronyd

若显示 active (running),说明安装成功。

配置 chronyd(优化时间同步)

chronyd 的主配置文件为 /etc/chrony/chrony.conf,建议主要配置国内 NTP 服务器以提高同步速度和稳定性。

编辑配置文件:

1
sudo nano /etc/chrony/chrony.conf

替换 NTP 服务器(推荐国内服务器)

找到配置文件中以 poolserver 开头的行,替换为国内可靠的 NTP 服务器(如阿里云、腾讯云等),例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 注释或删除原有服务器配置
# pool 2.ubuntu.pool.ntp.org iburst

# 添加国内NTP服务器 (ipv4)
# 阿里云
server ntp.aliyun.com iburst
# 腾讯云
server time1.cloud.tencent.com iburst
# 清华大学
server ntp.tuna.tsinghua.edu.cn iburst
# 中国国家授时中心
server cn.ntp.org.cn iburst

# IPv6时间服务器
# 阿里云IPv6
server 2400:3200::1 iburst
# 腾讯云IPv6
server 2402:f000::1 iburst
# 清华大学IPv6
server 2001:da8:8000::1 iburst
# 国家授时中心IPv6节点1
server 2001:da8:8000:100::6 iburst
# 国家授时中心IPv6节点2
server 2001:da8:8000:100::7 iburst


# 网络监听配置
# 监听所有IPv4地址
bindaddress 0.0.0.0
# 监听所有IPv6地址
bindaddress ::
# 标准NTP端口
port 123

iburst 选项表示初始时快速发送多个请求以加速同步。

这里需要配置出的安全组

可选优化配置(按需添加):

1
2
3
4
5
6
7
8
9
10
11
# 允许本地网络内的其他设备同步时间(若需要)
# allow 192.168.1.0/24

# 当无法访问网络时,允许系统时钟以更大的幅度调整
makestep 1.0 3

# 保存时钟同步历史,提高离线时的时间准确性
driftfile /var/lib/chrony/drift

# 启用实时时钟(RTC)同步
rtcsync

保存配置并重启服务:

Ctrl+O 保存,Ctrl+X 退出编辑器,然后重启服务使配置生效:

1
sudo systemctl reload-or-restart chronyd

配置防火墙

如果防火墙开启了,那么配置如下命令

1
2
# 允许出方向(服务器主动同步外部时间)
sudo ufw allow out 123/udp

如果需要

重新加载防火墙数据

1
systemctl reload-or-restart ufw.service

强制立即同步时间:

1
sudo chronyc -a makestep

验证时间同步状态

查看同步源状态

1
chronyc sources

输出中,^* 标记的服务器表示当前正在同步的优选源,例如:

1
2
3
4
5
6
7
8
210 Number of sources = 4
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 17 13 -1365us[-1365us] +/- 23ms

MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? 2402:f001:1:6:1:0:0:> 0 7 0 - +0ns[ +0ns] +/- 0ns
  • 时钟偏差:-1365μs(本地比服务器慢1.365毫秒)

  • 误差范围:±23ms(最大可能偏差约46毫秒)

  • 网络延迟:13ms(数据传输往返时间)

  • 轮询间隔:2^6=64秒(系统每64秒主动同步一次)

  • 历史记录:17(最近17次同步成功率)

  • ^?:服务器当前不可达(未同步状态)

  • 2402:f001:1:6:1:0:0:>:IPv6地址格式的NTP服务器

  • Stratum 0:表示该服务器未同步到任何时间源(原子钟/GPS等直接时间源应为Stratum 1)

  • Poll=7(2^7=128秒轮询间隔)

  • Reach=0:最近8次同步全部失败(二进制00000000)

检查时间同步精度

1
chronyc tracking

Leap status 显示 Normal,且 System time 偏差较小(如几微秒),说明同步正常。

设置开机自启(默认已开启)

1
sudo systemctl enable chronyd

通过以上配置,你的系统会稳定地与国内 NTP 服务器同步时间,确保时间准确性。如果需要进一步调整(如限制同步频率、允许其他设备同步等),可以参考 man chrony.conf 查看详细配置说明。

设置定时重启服务

对性能较差的服务器设置定时重启服务器

1
crontab -e

设置

1
10 2 * * * /sbin/shutdown -r now

设置好后按键操作

1
2
3
ctrl + x
y
enter

Ubuntu卸载

先停止chrony服务

1
sudo systemctl stop chrony

只需要把chrony替换成需要卸载的组件或者应用

1
sudo apt remove --purge chrony -y //卸载 chrony 软件包
  • --purge 选项会同时删除配置文件,彻底清理(如果后续可能重新安装,可省略此参数)。

清理残留依赖

1
2
sudo apt autoremove -y
sudo apt autoclean

验证是否卸载成功

1
2
3
4
5
# 检查服务状态(应提示未找到)
sudo systemctl status chronyd

# 检查是否还有相关文件
which chronyd

Ubuntu无法正常开机,出现grub指令

Ubuntu查看流量使用量

轻量云可以使用如下监视流量;

vnstat工具

安装

1
sudo apt-get install vnstat

安装完成后,你需要等待一段时间让vnstat收集一些数据。之后,可以使用以下命令查看流量使用情况:

1
vnstat -t

这将显示自上次启动服务以来的总发送和接收数据。

如果你想要看到特定网络接口(例如eth0)的流量使用情况,可以使用:

1
vnstat -i eth0 -t

这将显示eth0接口的总流量使用情况。

vnstat还提供了更多选项和详细信息,可以通过运行man vnstat查看手册页获取更多信息。

vnStat 是一个用于显示系统带宽使用情况的命令行工具,但是它并不提供用于存储数据的位置。实际上,vnStat 使用的数据文件通常存储在 /var/lib/vnstat 目录下。

这些文件通常是二进制格式,不是人类可读的文本。你可以使用 vnstat 命令来读取这些数据并以可读的格式显示出来。

更新内核和删除多余内核

  1. 首先要使用这个命令查看当前Ubuntu系统使用的内核
1
uname -a
  1. 再查看所有内核
1
dpkg --get-selections|grep linux
  1. 运行以下命令列出已安装的内核版本:这将显示所有已安装的内核版本。
1
dpkg --list | grep linux-image

4.根据你想要卸载的内核版本,运行以下命令进行卸载

1
sudo apt remove linux-image-X.X.XX-XX-generic

注意,将命令中的”X.X.XX-XX”替换为你要卸载的内核版本号。注意,将命令中的”X.X.XX-XX”替换为你要卸载的内核版本号。

1
2
linux-headers-xxxxxx
linux-headers-xxxxxx-generic
  1. 卸载完成后,更新GRUB引导菜单以反映内核的变化:
1
sudo update-grub
  1. 最后,重新启动系统:
1
shutdown -r now 

修改默认登入端口 22(重点)

在Ubuntu服务器上,SSH服务默认使用端口22。如果你想要修改默认登录端口,你需要编辑SSH配置文件并重启SSH服务。例如修改端口号Port 2222

  1. 确保新端口在服务器的防火墙中是开放的。如果你使用的是UFW防火墙,可以使用以下命令:
1
2
ufw allow 2222
ufw reload

注意:如果是云服务器,请在安全组中添加改端口号,否则无法使用

  1. 打开SSH配置文件。你可以使用nano或者vim编辑器,这里以nano为例:注意:这两个文件都要修改
1
2
3
sudo nano /etc/ssh/sshd_config

sudo nano /etc/ssh/ssh_config
  1. 找到包含Port 22的行,将其修改为你想要的端口号,例如Port 2222。操作步骤如下
1
Port 2222

修改后,输入ctrl + o、回车(Enter)、ctrl + x;

  1. 重启SSH服务以应用更改。
1
sudo systemctl restart ssh
  1. 重启系统,重新加载所有

    1
    sudo shutdown -r now
  2. 最后,测试新端口是否工作,使用新端口连接SSH:

1
ssh username@your-server-ip-address -p 2222

替换usernameyour-server-ip-address为你的服务器用户名和IP地址,并且使用你设置的新端口号2222

注意:如果要测试该功能,必须在服务器中添加公钥才能使用

  1. 如果不想每次都输入端口号,可以在本地.ssh文件夹下config文件中添加如下:
1
Port 2222

Ubuntusshd_config文件说明(重点)

ubuntusshd_config配置服务器端口,ssh_config配置客户端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 这个是ssh服务的监听端口,在实际生产环境中一般都不用默认的22端口 
Port 22
# AddressFamily 设置为any:默认ipv4和ipv6地址均可连接
AddressFamily any
# ListenAddress 用来设置sshd服务器绑定的IP地址
# ListenAddress 192.168.0.231 表示只监听来自192.168.0.231这个IP的SSH连接
# ListenAddress 0.0.0.0 表示监听所有IPv4的SSH连接
# ListenAddress :: 表示监听所有IPv6的SSH连接
# PermitRootLogin 设置root用户是否运行登录以及登录方式
PermitRootLogin no
# LoginGraceTime 宽限登录时间不输入密码两分钟自动退出
LoginGraceTime 2m
# AllowUsers 只允许特定的一些用户登录(root用户是否可登录要根据PermitRootLogin决定)
# AllowUsers myusername
# 优先级最高,禁止某些用户登录
# DenyUsers name1
# 允许登陆的用户组
# AllowGroups mygroupname
# 禁止登录的用户组
# DenyGroups groupname1
# 设置sshd是否在用户登录时显示/etc/motd中的信息,可以在其中加入欢迎信息
PrintMotd no
# 是否在ssh登录成功后,显示上次登录信息
PrintLastLog yes
# ssh的服务端会传送KeepAlive的讯息给客户端,以确保两者的联机正常
# 这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常
# 任何一端死掉后,ssh可以立刻知道,而不会有僵尸程序的发生
TCPKeepAlive yes

Ubuntu禁止某个用户通过ssh登入

要在Ubuntu上禁止某个用户通过SSH登录,可以通过编辑/etc/ssh/sshd_config文件来实现。你需要添加或修改AllowUsersDenyUsers指令。

  1. 打开sshd_config文件:
1
sudo nano /etc/ssh/sshd_config
  1. 添加或修改AllowUsersDenyUsers指令:

例如,如果你想允许所有用户除了bob以外登录,可以添加以下内容:

1
2
AllowUsers *
DenyUsers bob
  1. 保存并关闭文件。
  2. 重启SSH服务以应用更改:
1
sudo systemctl restart ssh

现在用户bob将无法通过SSH登录系统。如果你有多个用户需要禁止,可以用空格分隔每个用户名。

Ubuntu配置SSH远程登录

为了配置Ubuntu虚拟机进行远程访问,你需要确保以下几个步骤被正确执行:

  1. 更新系统

    在Ubuntu虚拟机中打开终端,运行以下命令更新系统:

1
2
sudo apt update
sudo apt upgrade
  1. 安装SSH服务

    安装OpenSSH服务器,它允许远程访问:

1
sudo apt install openssh-server
  1. 确认SSH服务运行

    检查SSH服务是否正在运行:

1
sudo systemctl status ssh
  1. 如果配置了ufw防火墙,就需要去看ufw配置

配置SSH

1.配置sshd_config,找到/etc/ssh/sshd_config

1
nano /etc/ssh/sshd_config
1
2
3
4
5
6
7
8
# 配置监听端口
Port 22
# 是否允许Root登录
PermitRootLogin yes
# 允许密码认证
PasswordAuthentication yes
# 启用公钥认证
PubkeyAuthentication yes

输入ctrl+o保存,然后回车,然后ctrl + x 退出,

  1. 重启ssh
1
2
sudo systemctl reload ssh
sudo systemctl restart ssh

配置多端口SSH

配置每个端口不同权限,参考Ubuntu 的 sshd 配置

限制 SSH 服务器未完成认证连接数

  1. 编辑 SSH 配置文件:
1
sudo nano /etc/ssh/sshd_config
  1. 找到或添加 MaxStartups 配置(默认可能隐藏,需手动添加):
  • MaxStartups 的配置格式为:
1
MaxStartups [起始阈值]:[丢弃概率]:[最大阈值]

各参数含义:

  • 起始阈值:未完成认证的连接数≤此值时,不限制新连接(默认 10)。
  • 丢弃概率:当连接数超过 “起始阈值” 但未达 “最大阈值” 时,新连接被随机丢弃的百分比(默认 30,即 30%)。
  • 最大阈值:当连接数≥此值时,拒绝所有新连接(默认 100)。
  1. 重启 SSH 服务使配置生效:
1
2
3
4
# CentOS/RHEL
sudo systemctl restart sshd
# Ubuntu/Debian
sudo systemctl restart ssh

客户端配置

确保客户端已经创建公钥与私钥;

如果未创建,参考 ubuntu搭建git服务器及配置

修改服务器上密钥文件权限

创建一个普通用户xxxroot用户对应的公钥文件权限设置

对于普通用户xxx目录权限:

1
chmod 755 /home/xxx  # 或700,禁止组写权限(77x)

.ssh目录权限:

1
chmod 700 /home/xxx/.ssh  # 必须为700或755

authorized_keys文件权限:

1
chmod 600 /home/xgmgouposcnblog/.ssh/authorized_keys  # 必须为600

所有文件和目录属主为用户本人:

1
sudo chown -R xxx:xxx /home/xgmgouposcnblog/.ssh

对于root目录权限: 设置文件权限

1
2
3
sudo chmod 700 /root/.ssh
sudo chmod 600 /root/.ssh/authorized_keys
sudo chown -R root:root /root/.ssh

权限错误会导致SSH拒绝认证

验证登录

1
2
3
4
5
6
ssh -p 端口号 -t 用户名@ip地址
xxx用户,假如端口号22,则不用 -p 端口号这个参数,否则需要; ip地址为ipv4时,直接写,ipv6需要 [240e::1]
ssh -p 端口号 -t xxx@ip地址

root用户,假如端口号22,则不用 -p 端口号这个参数,否则需要; ip地址为ipv4时,直接写,ipv6需要 [240e::1]
ssh -p 端口号 -t root@ip地址

如果上面所有配置都对了,但是还是用密码登录,使用如下命令验证,强制使用密钥验证

1
ssh -vvv -p 端口号 -i ~/.ssh/密钥名 用户名@ip地址

如果可以通过上面方式访问到,那就说明没有加载密钥,可以使用如下登陆到服务器

1
ssh -p 端口号 -i ~/.ssh/密钥名 用户名@ip地址

禁止部分用户ssh登录

如果你想禁止某个用户登录,但又希望该用户能够运行程序,你可以通过几种不同的方法来实现这一需求。

查看用户Shell

查看可以登入的shell

1
cat /etc/shells

如图所示:

查看可以登入的用户

1
cat /etc/passwd

修改用户Shell

方法一:

这是最简单的方法之一。通过将用户的默认shell中bash更改为nologinfalse,用户将无法通过图形界面或SSH等方式登录,但仍可以以该用户身份运行程序。

  1. 首先,找到该用户的shell设置。例如,如果要修改用户exampleuser的shell,可以使用以下命令:
1
chsh -s /bin/nologin exampleuser #exampleuser是你需要修改的用户
1
chsh -s /bin/false exampleuser	#exampleuser是你需要修改的用户

这会更改用户的默认shell为/bin/nologin/bin/false

  1. 尝试以该用户登录,应该会看到一个消息说该账户当前不可用。

  2. 用户仍然可以通过命令行以该用户身份运行程序,例如:

1
sudo -u exampleuser /path/to/your/program #/path/to/your/program 执行文件的位置

方法二:修改PAM配置(适用于SSH登录)

如果你想要禁止通过SSH登录但允许运行程序,可以修改SSH的PAM配置文件。

  1. 编辑/etc/pam.d/sshd文件,添加或修改以下行:
1
account    required     pam_access.so access=deny list=exampleuser

这行配置将阻止用户exampleuser通过SSH登录。

  1. 确保你的SSH服务配置文件中也禁用了该用户的访问,例如在/etc/ssh/sshd_config中添加:
1
DenyUsers exampleuser
  1. 重启SSH服务使更改生效:
1
sudo systemctl restart ssh

方法三:使用sudoers配置限制登录但不阻止程序运行

虽然这通常用于限制特定命令的访问,但你也可以通过配置sudoers来允许用户以特定方式运行程序而不允许他们登录。

  1. 编辑sudoers文件:
1
sudo visudo
  1. 在文件中添加一行来允许该用户以特定方式运行程序。例如,允许用户exampleuser以无密码方式运行特定命令:
1
exampleuser ALL=(ALL) NOPASSWD: /path/to/your/program

通过上述方法,你可以有效地禁止用户登录系统,同时允许他们以某种形式运行程序。选择最适合你需求的方法。

恢复shell

反向操作恢复原来的样子就可以了。

Ubuntu数据迁移

Ubuntu数据迁移可以通过多种方式实现,如使用rsyncscptar等工具。以下是一个使用rsync进行数据迁移的例子:

  1. 安装rsync(如果尚未安装):
1
2
sudo apt update
sudo apt-get install rsync
  1. 要配置如下文件中端口号,可以参考修改默认登入端口
1
2
sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/ssh_config

假如修改的端口号为:2222

  1. 命令,可以为两台服务器添加公钥与私钥,这样就不用每次都输入密码了
1
rsync -av -e ssh --port=2222 /src/apt/sources.list root@[1::1]:/des/apt/sources.list
  • -a 表示归档模式,它保留了所有的文件属性,等同于 -rlptgoD(递归、符号链接、权限、时间戳、组、设备文件、递归目录)
  • -v 增加详细输出
  • -z 使用压缩
  • -e
  • --port= 为配置的端口号,两台服务器端口都是相同的。这个很重要,假如A服务器端为:2222,那么B服务器也要为:2222
  • --progress 显示文件传输的进度
  • [username] 替换为你的服务器用户名 一般都是root
  • [server_ip] 替换为你的服务器IP地址 IPv4格式: XXX.XXX.XXX.XXX;IPv6格式:[1::1]
  • /src/apt/sources.list :原目标目录
  • /des/apt/sources.list:目标目录

*.deb 文件的安装

1
2
sudo apt-get install gdebi-core
sudo gdebi xxx.deb

实时流量监控工具

iftop(接口级监控)

  1. 安装
1
sudo apt install iftop
  1. 使用:实时显示网络接口流量,可观察当前活跃连接及带宽占用。
1
sudo iftop -i eth0

nethogs(进程级监控)

  1. 安装
1
sudo apt install nethogs
  1. 使用: 按进程统计流量,快速定位高负载服务(如Web服务器进程)
1
sudo nethogs eth0

ubuntu24.04中,调整sda剩余空间到sda2

如果你的需求是重新分配物理分区

如果你的需求是重新分配物理分区(而非逻辑卷内的空间),你需要使用parted或fdisk来调整分区表。这通常涉及到删除现有分区并重新创建它们,这可能会覆盖数据,因此强烈建议在执行此操作前备份重要数据。

使用fdisk重新分配sda2的大小:

  1. 启动fdisk:
    1
    sudo fdisk /dev/sda
  2. 删除现有分区(例如sda2):
    1
    2
    d
    # 选择分区号,例如2
    如下图所示:

  1. 创建一个新的分区(例如sda2):
    1
    2
    3
    4
    n
    #输入第一个扇区 4096
    #输入最后一个扇区 83886046 这里可以自己设置
    您想移除该签名吗? 是[Y]/否[N]: N
    如下图所示:

  1. 写入更改并退出:
    1
    w
    如下图所示:

更新文件系统元数据(如果需要)

如果你的文件系统是基于ext4,并且你扩展了文件系统的大小,你可能需要运行resize2fs或xfs_growfs来更新文件系统的元数据:

对于ext4文件系统:

1
sudo resize2fs  /dev/sda2

对于XFS文件系统:

1
sudo xfs_growfs  /dev/sda2

如下图所示:

修改DNS

DNS的配置目录在/etc/netplan,这个文本中所有内容都必须对齐,否则会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
network:
version: 2
renderer: networkd # 若为桌面版,可改为 NetworkManager
ethernets:
ens17: # 你的网卡名称,必须与输出中的 Link 2 一致(ens17)
addresses:
- 你的静态IPv6地址/64 # 例如 2001:db8::1234/64(替换为实际地址)
- 你的静态IPv4地址/24 # 可选,如 192.168.1.100/24
routes: # 替代已弃用的 gateway6,确保IPv6网关正确
- to: ::/0 # IPv6默认路由
via: 你的IPv6网关 # 例如 2001:db8::1(替换为实际网关)
- to: 0.0.0.0/0 # IPv4默认路由
via: 你的IPv4网关 # 例如 192.168.1.1(替换为实际网关)
nameservers:
addresses: # 补全阿里云+腾讯云+百度
- 2400:3200::1 # 阿里云主
- 2400:3200:baba::1 # 阿里云备
- 2402:4e00:: # 腾讯云主
- 2402:4e00:1:: # 腾讯云备
- 240c::6666 # 百度主
- 240c::6644 # 百度备
- 223.5.5.5 # 阿里云主
- 223.6.6.6 # 阿里云备
- 119.29.29.29 # 腾讯云主
- 182.254.116.116 # 腾讯云备
- 180.76.76.76 # 百度主
- 114.114.114.114 # 公共DNS(应急备用)

保存配置文件(如果还没保存),然后执行:

1
2
3
# 测试配置是否有语法错误(错误会自动回滚,放心执行)
sudo netplan try # 测试配置(若5秒内无报错,按Enter确认)
sudo netplan apply # 正式应用

验证是否所有 DNS 都生效

1
resolvectl status ens17 | grep "DNS Servers"  # 替换ens17为你的网卡名

输出所有 DNS 地址,说明配置成功:

报错

1
2
Invalid YAML: inconsistent indentation:
- 2402:4e00:: # 腾讯云IPv6主DNS

2402:4e00::改为2402:4e00::0

快速定位缩进问题

先查看当前配置的缩进细节(显示空格 / 制表符):

1
2
# 用 cat -A 显示不可见字符($ 代表换行,空格会直接显示)
cat -A /etc/netplan/50-network.yaml

tail查看日志

实时跟踪日志(最常用)

1
tail -f 文件名
  • -f(follow):实时输出文件新增内容(适合跟踪日志文件,如 tail -f /var/log/nginx/access.log
  • Ctrl+C 退出跟踪

指定显示最后 N 行

1
2
tail -n 行数 文件名
# 简写:tail -行数 文件名(如 tail -5 等价于 tail -n 5)
1
2
tail -n 20 /var/log/syslog  # 显示最后20行系统日志
tail -30 /var/log/auth.log # 显示最后30行认证日志

从第 N 行开始显示到文件末尾

1
tail -n +N 文件名
1
tail -n +100 /etc/profile  # 从第100行开始显示到文件末尾

显示文件最后 N 个字节

1
tail -c N 文件名
1
tail -c 1024 app.log  # 显示文件最后1024字节(1KB)的内容

跟踪多个文件

1
tail -f 文件1 文件2
1
2
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# 同时跟踪访问日志和错误日志,新增内容会标注文件名

与其他命令结合使用

配合 grep 过滤关键字:

1
tail -f /var/log/nginx/error.log | grep "error"  # 实时显示包含 "error" 的日志行

配合 head 截取部分内容:

1
tail -200 app.log | head -50  # 先取最后200行,再显示其中前50行

跟踪文件并在文件被删除后继续监听(进阶)

1
tail -F 文件名
  • -F-f --retry 的组合,当文件被删除并重新创建后(如日志轮转),会自动重新跟踪新文件,比 -f 更稳定。

防止暴力破解

搭配安全组ufw使用

要查看服务器上有哪些 IP 尝试登录(包括成功和失败的登录记录),可以通过分析系统的安全日志文件来实现。以下是针对不同场景的具体方法:

查看 SSH 登录尝试(最常见)

1
2
3
4
5
# Ubuntu/Debian 系统
grep "Failed password" /var/log/auth.log | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr

# CentOS/RHEL 系统
grep "Failed password" /var/log/secure | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr

命令说明:

  • grep "Failed password":筛选出密码失败的登录尝试(若要查看成功登录,可替换为 Accepted passwordAccepted publickey)。
  • grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+':提取日志中的 IP 地址。
  • sort | uniq -c:统计每个 IP 的尝试次数(uniq -c 显示计数)。
  • sort -nr:按尝试次数从多到少排序(-n 按数字排序,-r 倒序)。

实时监控新的登录尝试

使用 tail 命令实时跟踪日志,适合观察当前是否有 IP 在尝试登录:

1
2
3
4
5
# Ubuntu/Debian
tail -f /var/log/auth.log | grep -E 'sshd.*(Accepted|Failed)'

# CentOS/RHEL
tail -f /var/log/secure | grep -E 'sshd.*(Accepted|Failed)'

查看所有用户的登录历史(包括用户名)

1
2
3
4
5
# 显示所有用户的登录记录(包含 IP、时间、用户名)
last -i

# 显示登录失败的记录(需安装 fail2ban 或直接查日志)
lastb -i
  • last -i:显示用户登录历史,-i 强制显示 IP 地址(而非主机名)。
  • lastb -i:显示登录失败的记录(默认需要 root 权限)。

fail2ban

安装

1
sudo apt install fail2ban

启动

1
sudo systemctl enable fail2ban

fail2ban 是一款用于自动监测并封禁恶意 IP 的工具,尤其适合防御 SSH 暴力破解。以下是详细的配置、使用和查看方法:

目录文件的含义

1
2
3
4
5
6
7
8
9
10
drwxr-xr-x   2 root root  4096 Oct 12 14:54 action.d/     # 动作规则目录(封禁IP、发邮件等操作)
-rw-r--r-- 1 root root 2816 Nov 24 2020 fail2ban.conf # 核心服务配置(日志、socket等)
drwxr-xr-x 2 root root 4096 Mar 11 2022 fail2ban.d/ # 核心服务的扩展配置目录(优先级更高)
drwxr-xr-x 3 root root 4096 Oct 12 14:54 filter.d/ # 过滤规则目录(识别失败登录的日志模式)
-rw-r--r-- 1 root root 25071 Mar 11 2022 jail.conf # 监狱规则主配置(封禁策略核心)
drwxr-xr-x 2 root root 4096 Oct 12 14:54 jail.d/ # 监狱规则的扩展配置目录(优先级更高)
-rw-r--r-- 1 root root 645 Nov 24 2020 paths-arch.conf # 不同系统的日志路径定义(如 paths-debian.conf)
-rw-r--r-- 1 root root 2827 Nov 24 2020 paths-common.conf
-rw-r--r-- 1 root root 650 Mar 11 2022 paths-debian.conf
-rw-r--r-- 1 root root 738 Nov 24 2020 paths-opensuse.conf

fail2ban.conf

全局基础配置文件,定义 fail2ban 服务本身的运行参数(如日志级别、日志文件路径、socket 文件位置等)。通常无需修改,如需自定义,建议在 fail2ban.d/ 目录下创建 .conf 文件覆盖(避免直接修改原文件,方便升级时保留配置)。

jail.conf

核心规则配置文件,定义各种 “监狱”(jail)的规则,包括:

  • 监控哪些服务(如 ssh、apache、nginx 等);

  • 失败尝试的阈值(如 5 次失败后封禁);

  • 封禁时长(如 10 分钟);

  • 采用的过滤规则(filter.d/中定义)和执行的动作(action.d/中定义)。
    同样,不建议直接修改,自定义规则应放在jail.d/目录下。

扩展配置目录(推荐用于自定义)

**fail2ban.d/**:用于存放 fail2ban.conf 的扩展配置,优先级高于主配置。例如创建 fail2ban.d/custom.conf 可覆盖全局参数(如调整日志级别)。

**jail.d/**:用于存放 jail.conf 的扩展规则,优先级高于主规则。例如创建 jail.d/sshd.conf 可单独自定义 SSH 服务的封禁规则,避免污染主配置文件。

功能模块目录

**filter.d/**:存放过滤规则文件(.conf),定义如何识别 “失败登录尝试” 的日志模式。

例如:

  • sshd.conf:匹配 SSH 服务的失败登录日志;

  • nginx-http-auth.conf:匹配 Nginx 认证失败的日志。
    每个文件通过正则表达式定义日志中需要拦截的特征(如 “Failed password”)。

**action.d/**:存放动作规则文件(.conf),定义检测到恶意尝试后执行的操作(如封禁 IP、发送邮件等)。

常用动作:

  • iptables.conf:通过 iptables 封禁 IP;
  • sendmail.conf:发送告警邮件;
  • cloudflare.conf:通过 Cloudflare API 封禁 IP(适用于网站)。

路径配置文件

  • paths-*.conf
    针对不同 Linux 发行版(Debian/Ubuntu、Arch、OpenSUSE 等)定义服务日志文件的默认路径。
    例如paths-debian.conf会指定 Ubuntu 中 SSH 日志路径(/var/log/auth.log)、Apache 日志路径等,供过滤器调用。
    一般无需修改,系统会自动适配。

注意格式,格式很重要,否则可能报错

添加fail2ban.d/*.conf

核心服务配置(fail2ban 自身运行参数)**

配置内容:日志级别、日志文件路径、socket 文件位置、pid 文件位置等。

sshd.conf

在其配置中,添加下面代码中的增加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cmnfailre = ^[aA]uthentication (?:failure|error|failed) for <F-USER>.*</F-USER> from <HOST>( via \S+)?%(__suff)s$
^User not known to the underlying authentication module for <F-USER>.*</F-USER> from <HOST>%(__suff)s$
<cmnfailre-failed-pub-<publickey>>
^Failed <cmnfailed> for (?P<cond_inv>invalid user )?<F-USER>(?P<cond_user>\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)</F-USER> from <HOST>%(__on_port_opt)s(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$)
^<F-USER>ROOT</F-USER> LOGIN REFUSED FROM <HOST>
^[iI](?:llegal|nvalid) user <F-USER>.*?</F-USER> from <HOST>%(__suff)s$
^User <F-USER>\S+|.*?</F-USER> from <HOST> not allowed because not listed in AllowUsers%(__suff)s$
^User <F-USER>\S+|.*?</F-USER> from <HOST> not allowed because listed in DenyUsers%(__suff)s$
^User <F-USER>\S+|.*?</F-USER> from <HOST> not allowed because not in any group%(__suff)s$
^refused connect from \S+ \(<HOST>\)
^Received <F-MLFFORGET>disconnect</F-MLFFORGET> from <HOST>%(__on_port_opt)s:\s*3: .*: Auth fail%(__suff)s$
^User <F-USER>\S+|.*?</F-USER> from <HOST> not allowed because a group is listed in DenyGroups%(__suff)s$
^User <F-USER>\S+|.*?</F-USER> from <HOST> not allowed because none of user's groups are listed in AllowGroups%(__suff)s$
^<F-NOFAIL>%(__pam_auth)s\(sshd:auth\):\s+authentication failure;</F-NOFAIL>(?:\s+(?:(?:logname|e?uid|tty)=\S*)){0,4}\s+ruser=<F-ALT_USER>\S*</F-ALT_USER>\s+rhost=<HOST>(?:\s+user=<F-USER>\S*</F-USER>)?%(__suff)s$
^maximum authentication attempts exceeded for <F-USER>.*</F-USER> from <HOST>%(__on_port_opt)s(?: ssh\d*)?%(__suff)s$
^User <F-USER>\S+|.*?</F-USER> not allowed because account is locked%(__suff)s
^<F-MLFFORGET>Disconnecting</F-MLFFORGET>(?: from)?(?: (?:invalid|authenticating)) user <F-USER>\S+</F-USER> <HOST>%(__on_port_opt)s:\s*Change of username or service not allowed:\s*.*\[preauth\]\s*$
^Disconnecting: Too many authentication failures(?: for <F-USER>\S+|.*?</F-USER>)?%(__suff)s$
^<F-NOFAIL>Received <F-MLFFORGET>disconnect</F-MLFFORGET></F-NOFAIL> from <HOST>%(__on_port_opt)s:\s*11:
<mdre-<mode>-other>
^<F-MLFFORGET><F-MLFGAINED>Accepted \w+</F-MLFGAINED></F-MLFFORGET> for <F-USER>\S+</F-USER> from <HOST>(?:\s|$)
# 增加配置
^Failed publickey for (invalid user )?<F-USER>.*?</F-USER> from <HOST> port \d+ ssh2(?: \[preauth\])?$
^Failed publickey for (invalid user )?<F-USER>.*?</F-USER> from <HOST> ssh2(?: \[preauth\])?$
^Disconnecting: Too many authentication failures for <F-USER>.*?</F-USER> from <HOST>%(__on_port_opt)s(?: \[preauth\])?$
^<F-NOFAIL>pam_unix\(sshd:auth\):\s+authentication failure;</F-NOFAIL>\s+user=<F-USER>.*?</F-USER>\s+rhost=<HOST>\s+.*$
^Connection closed by (invalid user )?<F-USER>.*?</F-USER> <HOST> port \d+ \[preauth\]$
^Connection closed by <HOST> port \d+ \[preauth\]$
^<F-USER>root</F-USER> login is not allowed from <HOST>%(__suff)s$
^Refused root login from <HOST>%(__suff)s$

添加的含义

添加jail.d/*.conf

监狱规则配置(核心功能,定义封禁策略)

配置内容:监控的服务(如 SSH、Nginx)、失败尝试阈值、封禁时长、引用的过滤规则和动作等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 1. 监控控 SSH 服务(默认端口 22)
[sshd]
enabled = true
# 等同于 22,若修改过端口可写具体值(如 2222)
port = ssh
# 引用 filter.d/sshd.conf 过滤规则
filter = sshd
# Ubuntu/Debian 日志路径
logpath = /var/log/auth.log
# 最大失败次数(超过则封禁)
maxretry = 5
# 封禁 1 小时
bantime = 3600
# 10 分钟内超过 5 次失败则封禁
findtime = 600

[customize-sshd]
# 启用该规则
enabled = true
# 监控 SSH 端口(22)
port = ssh
# 使用 sshd 过滤规则
filter = sshd
# 监控的日志文件
logpath = /var/log/auth.log
# 3 次失败触发封禁
maxretry = 3
# 1 小时内统计失败次数
findtime = 3600
# 封禁 1 天
bantime = 86400
# IPv6 处理方式,auto 表示自动检测
allowipv6 = auto


# 监控 Web 服务(Nginx 登录,80/443 端口)
[nginx-auth]
enabled = true
# 监控 80 和 443 端口
port = http,https
# 使用内置的 nginx 认证过滤规则 nginx-http-auth nginx-auth
filter = nginx-http-auth
# Nginx 错误日志(含登录失败记录)
logpath = /var/log/nginx/error.log
maxretry = 3
# 封禁 24 小时
bantime = 3600
# 5 分钟内超过 3 次失败则封禁
findtime = 300
# IPv6 处理方式,auto 表示自动检测
allowipv6 = auto


# 3. 监控 FTP 服务(21 端口,以 vsftpd 为例)
[vsftpd]
enabled = true
# 等同于 21
port = ftp
# 使用内置的 vsftpd 过滤规则
filter = vsftpd
# vsftpd 日志路径
logpath = /var/log/vsftpd.log
# 最大失败次数(超过则封禁)
maxretry = 4
# 封禁 30 分钟
bantime = 1800
findtime = 600
# IPv6 处理方式,auto 表示自动检测
allowipv6 = auto

添加filter.d/*.conf

过滤规则配置(识别失败登录日志)

配置内容:通过正则表达式定义 “失败登录尝试” 的日志特征(如 “Failed password”)。

1
---

配置后重启该服务

1
systemctl reload-or-restart fail2ban.service

添加action.d/*.conf

动作规则配置(触发封禁后的操作)

测试加载等

1
fail2ban-client reload
1
fail2ban-client --test

查看封禁IP

执行以下命令可列出所有启用的 jail 及其封禁的 IP:

1
sudo fail2ban-client status

示例输出:

1
2
3
Status
|- Number of jail: 2
`- Jail list: nginx-auth, sshd

这里显示有两个 jail(nginx-authsshd),然后可以进一步查看每个 jail 的封禁详情。

查看指定 jail 中被封禁的 IP

最常用的方式是指定具体的 jail 名称(如 sshdnginx-auth),查看该规则下封禁的 IP:

1
sudo fail2ban-client status sshd

示例输出:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 15
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 2
|- Total banned: 2
`- Banned IP list: 203.0.113.5 198.51.100.20

其中 Banned IP list 就是该 jail 目前封禁的 IP 地址。

看历史封禁记录

fail2ban的日志文件通常位于 /var/log/fail2ban.log,可以通过以下命令查看历史封禁记录:

1
sudo cat /var/log/fail2ban.log | grep "Ban"

这会显示所有被封禁的IP及其封禁原因。

解封特定IP

如果需要解封某个IP,可以使用以下命令:

1
sudo fail2ban-client set <定义封禁策略> unbanip <IP地址>

定义封禁策略: nginx-auth, sshd

示例:

1
sudo fail2ban-client set sshd unbanip 49.5.129.247

解封后可以通过 fail2ban-client status sshd 确认IP是否已解除封禁‌

封禁IP

1
sudo fail2ban-client set <jail名称> banip <IP地址>

DenyHosts


ufw(重要)

启动

启动前,一定要先添加ssh登录端口,这一点很重要

1
sudo ufw enable

停止

1
sudo ufw disable

彻底关闭并重置 ufw

1
2
3
4
5
# 先禁用防火墙
sudo ufw disable

# 重置所有规则(清除配置,恢复默认状态)
sudo ufw reset

日志

启用日志

1
sudo ufw logging on

关闭日志

1
sudo ufw logging off

查看状态

1
sudo ufw status

重新加载配置

下面二选一

1
sudo ufw reload
1
sudo systemctl reload-or-restart ufw.service

添加规则

ufw 的规则默认方向是入站(incoming),如果不明确指定方向(inout),则默认针对入站流量。这种方式,支持TCP 和 UDP 协议

1
sudo ufw allow 111

如果需要添加出站规则,需要显式指定 out 方向;如果需要精确控制;下面就是:

添加出站规则

只添加 IPv4 或只添加 IPv6

若要只添加 IPv4 或只添加 IPv6,可以通过 -4-6 参数指定:

只添加 IPv4 规则

使用 -4 参数,例如允许 IPv4 出站 53/tcp:

1
sudo ufw -4 allow out 53/tcp

只添加 IPv6 规则

使用 -6 参数,例如允许 IPv6 出站 53/tcp:

1
sudo ufw -6 allow out 53/tcp

同时添加 IPv4 和添加 IPv6

添加出站 53端口的tcp

1
sudo ufw allow out 53/tcp

添加入站规则

只需要把上面的out改成in;

1
sudo ufw allow in 

使用 ufw 封禁 IP

搭配日志/var/log/auth.log使用

封禁单个 IP

1
sudo ufw deny from 192.109.206.137 to any  # 封禁 IP 192.109.206.137 对所有端口的访问
  • deny from [IP]:拒绝来自指定 IP 的所有连接;
  • to any:表示对服务器所有端口生效(也可指定端口,如 to any port 22 仅封禁 SSH 端口)。

封禁 IP 段(如 192.109.206.0/24 网段)

1
sudo ufw deny from 192.109.206.0/24 to any  # 封禁整个网段

封禁特定端口的 IP(如仅封禁 SSH 端口 22)

1
sudo ufw deny from 192.109.206.137 to any port 22  # 仅阻止该 IP 访问 SSH 端口

查看所有被封禁的 IP

查看 ufw 规则(包含封禁的 IP)

1
sudo ufw status numbered  # 显示带编号的所有规则,包含封禁条目

仅筛选封禁的 IP 规则

1
sudo ufw status | grep DENY  # 直接显示所有 DENY 规则

安全组(重要)

  • 出方向(Outbound):本地服务器需要通过 TCP/UDPN号 端口向外部指定服务器发送请求数据(本地做客户端模式),此需要允许出方向的流量。

  • 入方向(Inbound):本地作为服务器为其他设备提供数据服务时(本地为服务器端),需要接收来自其他设备的 TCP/UDPN号端口请求,此时需要允许入方向的流量。

云服务器中一定要配置的端口,这个配置很重要

出站规则

类型 协议 目标端口 目的IP 说明
http TCP 80 0.0.0.0/0 访问外部网页的端口
https TCP 443 0.0.0.0/0 访问外部网页的端口
DNS(tcp) TCP 53 0.0.0.0/0 云服务器需要通过域名访问外部资源
访问外部 API(如api.xxx.com
安装软件包(如apt installyum install,依赖域名解析软件源)
连接外部数据库、对象存储(如oss-cn-beijing.aliyuncs.com
发送邮件、调用第三方服务等
DNS(udp) UDP 53 0.0.0.0/0 用于大多数域名解析请求( lightweight 查询)。
ICMP ICMP - 0.0.0.0/0 ping命令的支持

如果开启了UFW,那么需要添加一下命令

1
2
3
4
5
6
7
8
9
10
11
12
# 允许出站UDP 53(核心,常规DNS解析依赖)
sudo ufw allow out 53/udp

# 允许出站TCP 53(可选,应对大报文解析场景)
sudo ufw allow out 53/tcp


# 允许出站HTTPS(443端口,必须,几乎所有网页都用)
sudo ufw allow out 443/tcp

# 允许出站HTTP(80端口,可选,仅用于访问未加密的老旧网站)
sudo ufw allow out 80/tcp

allow out 表示允许出站方向的流量(从服务器到外部)

若想限制仅 DNS 服务器(更安全),可指定目标 IP(如仅允许云厂商内网 DNS 或公共 DNS):

1
2
3
4
5
# 仅允许访问公共DNS服务器(8.8.8.8、114.114.114.114)的53端口 可以根据自己的选择添加
sudo ufw allow out to 8.8.8.8 port 53/udp
sudo ufw allow out to 114.114.114.114 port 53/udp
sudo ufw allow out to 8.8.8.8 port 53/tcp
sudo ufw allow out to 114.114.114.114 port 53/tcp

若要只添加 IPv4 或只添加 IPv6,可以通过 -4-6 参数指定:

只添加 IPv4 规则

使用 -4 参数,例如允许 IPv4 出站 53/tcp:

1
sudo ufw -4 allow out 53/tcp

只添加 IPv6 规则

使用 -6 参数,例如允许 IPv6 出站 53/tcp:

1
sudo ufw -6 allow out 53/tcp

以上就是出站规则的配置,如果还有自定义端口,需要在出站规则中添加以及UFW中添加

入站规则

类型 协议 目标端口 源IP 说明
ssh TCP 22 0.0.0.0/0 SSH登录的默认端口
http TCP 80 0.0.0.0/0 如果做web服务器,需要开启端口
https TCP 443 0.0.0.0/0 如果做web服务器,需要开启端口