Ubuntu基本配置
ubuntu备份文件添加时间
1 | # 备份整个Nginx配置目录(防止配置丢失) |
更新自动安装
- 编辑
/etc/needrestart/needrestart.conf文件
1 | #$nrconf{restart} = 'i'; |
就不会再弹窗了,如果你想看要重启哪些服务,那就尝试设置成l试试。
Ubuntu修改软件源
查看ubuntu版本
1 | lsb_release -a |
1 | No LSB modules are available. |
软件源
1 | # 吉林大学 |
路径/etc/apt/sources.list
1 | # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
1 | deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse |
1 |
|
1 | deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse |
路径/etc/apt/sources.list.d/ubuntu.sources
1 | Enabled: yes # 添加 Enabled: no 进行禁用 |
1 | Enabled: yes |
1 | Enabled: yes |
修改主机名后生效
- 永久更改主机名,编辑
/etc/hostname文件:
1 | sudo nano /etc/hostname # 将文件中的内容替换为新的主机名,保存并退出 |
- 另外,还需要更新
/etc/hosts文件中的主机名记录:
1 | sudo nano /etc/hosts # 找到127.0.1.1这一行,更改旧的主机名为新的主机名 |
- 重启服务器; 或 不想重启系统,可以重新启动
systemd-hostnamed服务或systemd-resolved服务来读取新的主机名设置。
1 | shutdown -r now |
1 | sudo systemctl restart systemd-hostnamed |
设置系统时间同步
查看时间
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 | [Time] |
保存后重启服务:
1 | sudo systemctl restart systemd-timesyncd |
同步服务有:chronyd,systemd-timesyncd,NTP,选择一个安装
| 服务 | 特点 | 适用场景 |
|---|---|---|
| chronyd | 功能强大,同步快,精度高 | 服务器、需要高精度时间的场景 |
| systemd-timesyncd | 轻量,集成在 systemd 中 | 桌面用户、对时间精度要求不高的场景 |
| ntp | 传统 NTP 服务,稳定可靠 | 兼容性要求高的老系统或特定环境 |
安装 ntp
先查看之前是否安装过ntp,如果有,先删除残留配置和数据目录
1 | sudo rm -rf /etc/ntpsec/ntp.conf |
命令安装:
1 | 更新软件包列表 |
安装完成后,服务会自动启动,可通过以下命令验证状态:
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 | # 创建缺失的日志目录 |
设置文件权限,通过查看/etc/passwod中ntp创建的用户
1 | # 设置正确的权限(确保 NTPsec 进程有权限写入) |
重新启动ntp
1 | 重启 NTPsec 服务使配置生效 |
检查状态,和查看配置文件位置
1 | 验证服务状态 |
配置文件
1 | # /etc/ntpsec/ntp.conf, configuration for ntpd; see ntp.conf(5) for help |
安装 chronyd
先查看之前是否安装过chronyd,如果有,先删除残留配置和数据目录
1 |
命令安装:
1 | 更新软件包列表 |
安装完成后,服务会自动启动,可通过以下命令验证状态:
1 | sudo systemctl status chronyd |
若显示 active (running),说明安装成功。
配置 chronyd(优化时间同步)
chronyd 的主配置文件为 /etc/chrony/chrony.conf,建议主要配置国内 NTP 服务器以提高同步速度和稳定性。
编辑配置文件:
1 | sudo nano /etc/chrony/chrony.conf |
替换 NTP 服务器(推荐国内服务器)
找到配置文件中以 pool 或 server 开头的行,替换为国内可靠的 NTP 服务器(如阿里云、腾讯云等),例如:
1 | # 注释或删除原有服务器配置 |
iburst 选项表示初始时快速发送多个请求以加速同步。
这里需要配置出的安全组
可选优化配置(按需添加):
1 | # 允许本地网络内的其他设备同步时间(若需要) |
保存配置并重启服务:
按 Ctrl+O 保存,Ctrl+X 退出编辑器,然后重启服务使配置生效:
1 | sudo systemctl reload-or-restart chronyd |
配置防火墙
如果防火墙开启了,那么配置如下命令
1 | # 允许出方向(服务器主动同步外部时间) |
如果需要
重新加载防火墙数据
1 | systemctl reload-or-restart ufw.service |
强制立即同步时间:
1 | sudo chronyc -a makestep |
验证时间同步状态
查看同步源状态:
1 | chronyc sources |
输出中,^* 标记的服务器表示当前正在同步的优选源,例如:
1 | 210 Number of sources = 4 |
时钟偏差:
-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 | ctrl + x |
Ubuntu卸载
先停止chrony服务
1 | sudo systemctl stop chrony |
只需要把chrony替换成需要卸载的组件或者应用
1 | sudo apt remove --purge chrony -y //卸载 chrony 软件包 |
--purge选项会同时删除配置文件,彻底清理(如果后续可能重新安装,可省略此参数)。
清理残留依赖:
1 | sudo apt autoremove -y |
验证是否卸载成功:
1 | # 检查服务状态(应提示未找到) |
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 命令来读取这些数据并以可读的格式显示出来。
更新内核和删除多余内核
- 首先要使用这个命令查看当前Ubuntu系统使用的内核
1 | uname -a |
- 再查看所有内核
1 | dpkg --get-selections|grep linux |
- 运行以下命令列出已安装的内核版本:这将显示所有已安装的内核版本。
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 | linux-headers-xxxxxx |
- 卸载完成后,更新GRUB引导菜单以反映内核的变化:
1 | sudo update-grub |
- 最后,重新启动系统:
1 | shutdown -r now |
修改默认登入端口 22(重点)
在Ubuntu服务器上,SSH服务默认使用端口22。如果你想要修改默认登录端口,你需要编辑SSH配置文件并重启SSH服务。例如修改端口号Port 2222。
- 确保新端口在服务器的防火墙中是开放的。如果你使用的是UFW防火墙,可以使用以下命令:
1 | ufw allow 2222 |
注意:如果是云服务器,请在安全组中添加改端口号,否则无法使用
- 打开SSH配置文件。你可以使用
nano或者vim编辑器,这里以nano为例:注意:这两个文件都要修改
1 | sudo nano /etc/ssh/sshd_config |
- 找到包含
Port 22的行,将其修改为你想要的端口号,例如Port 2222。操作步骤如下
1 | Port 2222 |
修改后,输入ctrl + o、回车(Enter)、ctrl + x;
- 重启SSH服务以应用更改。
1 | sudo systemctl restart ssh |
重启系统,重新加载所有
1
sudo shutdown -r now
最后,测试新端口是否工作,使用新端口连接SSH:
1 | ssh username@your-server-ip-address -p 2222 |
替换username和your-server-ip-address为你的服务器用户名和IP地址,并且使用你设置的新端口号2222。
注意:如果要测试该功能,必须在服务器中添加公钥才能使用
- 如果不想每次都输入端口号,可以在本地
.ssh文件夹下config文件中添加如下:
1 | Port 2222 |
Ubuntu中sshd_config文件说明(重点)
ubuntu中sshd_config配置服务器端口,ssh_config配置客户端口
1 | # 这个是ssh服务的监听端口,在实际生产环境中一般都不用默认的22端口 |
Ubuntu禁止某个用户通过ssh登入
要在Ubuntu上禁止某个用户通过SSH登录,可以通过编辑/etc/ssh/sshd_config文件来实现。你需要添加或修改AllowUsers和DenyUsers指令。
- 打开
sshd_config文件:
1 | sudo nano /etc/ssh/sshd_config |
- 添加或修改
AllowUsers和DenyUsers指令:
例如,如果你想允许所有用户除了bob以外登录,可以添加以下内容:
1 | AllowUsers * |
- 保存并关闭文件。
- 重启SSH服务以应用更改:
1 | sudo systemctl restart ssh |
现在用户bob将无法通过SSH登录系统。如果你有多个用户需要禁止,可以用空格分隔每个用户名。
Ubuntu配置SSH远程登录
为了配置Ubuntu虚拟机进行远程访问,你需要确保以下几个步骤被正确执行:
更新系统:
在Ubuntu虚拟机中打开终端,运行以下命令更新系统:
1 | sudo apt update |
安装SSH服务
安装
OpenSSH服务器,它允许远程访问:
1 | sudo apt install openssh-server |
确认SSH服务运行
检查SSH服务是否正在运行:
1 | sudo systemctl status ssh |
- 如果配置了ufw防火墙,就需要去看ufw配置
配置SSH
1.配置sshd_config,找到/etc/ssh/sshd_config
1 | nano /etc/ssh/sshd_config |
1 | # 配置监听端口 |
输入ctrl+o保存,然后回车,然后ctrl + x 退出,
- 重启ssh
1 | sudo systemctl reload ssh |
配置多端口SSH
配置每个端口不同权限,参考Ubuntu 的 sshd 配置
限制 SSH 服务器未完成认证连接数
- 编辑 SSH 配置文件:
1 | sudo nano /etc/ssh/sshd_config |
- 找到或添加
MaxStartups配置(默认可能隐藏,需手动添加):
MaxStartups的配置格式为:
1 | MaxStartups [起始阈值]:[丢弃概率]:[最大阈值] |
各参数含义:
- 起始阈值:未完成认证的连接数≤此值时,不限制新连接(默认 10)。
- 丢弃概率:当连接数超过 “起始阈值” 但未达 “最大阈值” 时,新连接被随机丢弃的百分比(默认 30,即 30%)。
- 最大阈值:当连接数≥此值时,拒绝所有新连接(默认 100)。
- 重启 SSH 服务使配置生效:
1 | # CentOS/RHEL |
客户端配置
确保客户端已经创建公钥与私钥;
如果未创建,参考 ubuntu搭建git服务器及配置
修改服务器上密钥文件权限
创建一个普通用户xxx和root用户对应的公钥文件权限设置
对于普通用户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 | sudo chmod 700 /root/.ssh |
权限错误会导致SSH拒绝认证
验证登录
1 | ssh -p 端口号 -t 用户名@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更改为nologin或false,用户将无法通过图形界面或SSH等方式登录,但仍可以以该用户身份运行程序。
- 首先,找到该用户的shell设置。例如,如果要修改用户
exampleuser的shell,可以使用以下命令:
1 | chsh -s /bin/nologin exampleuser #exampleuser是你需要修改的用户 |
1 | chsh -s /bin/false exampleuser #exampleuser是你需要修改的用户 |
这会更改用户的默认shell为/bin/nologin或/bin/false。
尝试以该用户登录,应该会看到一个消息说该账户当前不可用。
用户仍然可以通过命令行以该用户身份运行程序,例如:
1 | sudo -u exampleuser /path/to/your/program #/path/to/your/program 执行文件的位置 |
方法二:修改PAM配置(适用于SSH登录)
如果你想要禁止通过SSH登录但允许运行程序,可以修改SSH的PAM配置文件。
- 编辑
/etc/pam.d/sshd文件,添加或修改以下行:
1 | account required pam_access.so access=deny list=exampleuser |
这行配置将阻止用户exampleuser通过SSH登录。
- 确保你的SSH服务配置文件中也禁用了该用户的访问,例如在
/etc/ssh/sshd_config中添加:
1 | DenyUsers exampleuser |
- 重启SSH服务使更改生效:
1 | sudo systemctl restart ssh |
方法三:使用sudoers配置限制登录但不阻止程序运行
虽然这通常用于限制特定命令的访问,但你也可以通过配置sudoers来允许用户以特定方式运行程序而不允许他们登录。
- 编辑sudoers文件:
1 | sudo visudo |
- 在文件中添加一行来允许该用户以特定方式运行程序。例如,允许用户
exampleuser以无密码方式运行特定命令:
1 | exampleuser ALL=(ALL) NOPASSWD: /path/to/your/program |
通过上述方法,你可以有效地禁止用户登录系统,同时允许他们以某种形式运行程序。选择最适合你需求的方法。
恢复shell
反向操作恢复原来的样子就可以了。
Ubuntu数据迁移
Ubuntu数据迁移可以通过多种方式实现,如使用rsync、scp、tar等工具。以下是一个使用rsync进行数据迁移的例子:
- 安装
rsync(如果尚未安装):
1 | sudo apt update |
- 要配置如下文件中端口号,可以参考修改默认登入端口
1 | sudo nano /etc/ssh/sshd_config |
假如修改的端口号为:2222
- 命令,可以为两台服务器添加公钥与私钥,这样就不用每次都输入密码了
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 | sudo apt-get install gdebi-core |
实时流量监控工具
iftop(接口级监控)
- 安装
1 | sudo apt install iftop |
- 使用:实时显示网络接口流量,可观察当前活跃连接及带宽占用。
1 | sudo iftop -i eth0 |
nethogs(进程级监控)
- 安装
1 | sudo apt install nethogs |
- 使用: 按进程统计流量,快速定位高负载服务(如Web服务器进程)
1 | sudo nethogs eth0 |
ubuntu24.04中,调整sda剩余空间到sda2
如果你的需求是重新分配物理分区
如果你的需求是重新分配物理分区(而非逻辑卷内的空间),你需要使用parted或fdisk来调整分区表。这通常涉及到删除现有分区并重新创建它们,这可能会覆盖数据,因此强烈建议在执行此操作前备份重要数据。
使用fdisk重新分配sda2的大小:
- 启动fdisk:
1
sudo fdisk /dev/sda
- 删除现有分区(例如sda2):如下图所示:
1
2d
# 选择分区号,例如2

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

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

更新文件系统元数据(如果需要)
如果你的文件系统是基于ext4,并且你扩展了文件系统的大小,你可能需要运行resize2fs或xfs_growfs来更新文件系统的元数据:
对于ext4文件系统:
1 | sudo resize2fs /dev/sda2 |
对于XFS文件系统:
1 | sudo xfs_growfs /dev/sda2 |
如下图所示:

修改DNS
DNS的配置目录在/etc/netplan,这个文本中所有内容都必须对齐,否则会报错
1 | network: |
保存配置文件(如果还没保存),然后执行:
1 | # 测试配置是否有语法错误(错误会自动回滚,放心执行) |
验证是否所有 DNS 都生效:
1 | resolvectl status ens17 | grep "DNS Servers" # 替换ens17为你的网卡名 |
输出所有 DNS 地址,说明配置成功:
报错
1 | Invalid YAML: inconsistent indentation: |
把2402:4e00::改为2402:4e00::0
快速定位缩进问题
先查看当前配置的缩进细节(显示空格 / 制表符):
1 | # 用 cat -A 显示不可见字符($ 代表换行,空格会直接显示) |
tail查看日志
实时跟踪日志(最常用)
1 | tail -f 文件名 |
-f(follow):实时输出文件新增内容(适合跟踪日志文件,如tail -f /var/log/nginx/access.log)- 按
Ctrl+C退出跟踪
指定显示最后 N 行
1 | tail -n 行数 文件名 |
1 | tail -n 20 /var/log/syslog # 显示最后20行系统日志 |
从第 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 | 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 | Ubuntu/Debian 系统 |
命令说明:
grep "Failed password":筛选出密码失败的登录尝试(若要查看成功登录,可替换为Accepted password或Accepted 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 | # Ubuntu/Debian |
查看所有用户的登录历史(包括用户名)
1 | # 显示所有用户的登录记录(包含 IP、时间、用户名) |
last -i:显示用户登录历史,-i强制显示 IP 地址(而非主机名)。lastb -i:显示登录失败的记录(默认需要 root 权限)。
fail2ban
安装
1 | sudo apt install fail2ban |
启动
1 | sudo systemctl enable fail2ban |
fail2ban 是一款用于自动监测并封禁恶意 IP 的工具,尤其适合防御 SSH 暴力破解。以下是详细的配置、使用和查看方法:
目录文件的含义
1 | drwxr-xr-x 2 root root 4096 Oct 12 14:54 action.d/ # 动作规则目录(封禁IP、发邮件等操作) |
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 | cmnfailre = ^[aA]uthentication (?:failure|error|failed) for <F-USER>.*</F-USER> from <HOST>( via \S+)?%(__suff)s$ |
添加的含义
添加jail.d/*.conf
监狱规则配置(核心功能,定义封禁策略)
配置内容:监控的服务(如 SSH、Nginx)、失败尝试阈值、封禁时长、引用的过滤规则和动作等。
1 | # 1. 监控控 SSH 服务(默认端口 22) |
添加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 | Status |
这里显示有两个 jail(nginx-auth 和 sshd),然后可以进一步查看每个 jail 的封禁详情。
查看指定 jail 中被封禁的 IP
最常用的方式是指定具体的 jail 名称(如 sshd、nginx-auth),查看该规则下封禁的 IP:
1 | sudo fail2ban-client status sshd |
示例输出:
1 | Status for the jail: sshd |
其中 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 | # 先禁用防火墙 |
日志
启用日志
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),如果不明确指定方向(in 或 out),则默认针对入站流量。这种方式,支持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/UDP和N号 端口向外部指定服务器发送请求数据(本地做客户端模式),此需要允许出方向的流量。入方向(Inbound):本地作为服务器为其他设备提供数据服务时(本地为服务器端),需要接收来自其他设备的
TCP/UDP和N号端口请求,此时需要允许入方向的流量。
云服务器中一定要配置的端口,这个配置很重要
出站规则
| 类型 | 协议 | 目标端口 | 目的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 install、yum 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 | # 允许出站UDP 53(核心,常规DNS解析依赖) |
allow out 表示允许出站方向的流量(从服务器到外部)
若想限制仅 DNS 服务器(更安全),可指定目标 IP(如仅允许云厂商内网 DNS 或公共 DNS):
1 | # 仅允许访问公共DNS服务器(8.8.8.8、114.114.114.114)的53端口 可以根据自己的选择添加 |
若要只添加 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服务器,需要开启端口 |