基于Debian搭建HomeNAS

enter description here
enter description here

enter description here

基于Debian搭建HomeNAS

Debian,是一个由自由和开源软件组成的Linux发行版,由社区支持的Debian项目开发,该项目由Ian Murdock建立。 1993年8月16日。Debian 的第一个版本(0.01)发布于1993年9月15日,其第一个稳定版本(1.1)于1996年6月17日发布。[8] Debian 稳定分支是个人电脑和服务器最受欢迎的版本。Debian 也是许多其他发行版的基础,最著名的是 Ubuntu。

Debian是基于Linux内核的最古老的操作系统之一。该项目由一个志愿者团队在互联网上协调,由 Debian 项目负责人和三个基础文档指导:Debian 社会契约、Debian 宪法和 Debian 自由软件指南。新的发行版会不断更新,下一个候选发行版会在基于时间的冻结后发布。

自成立以来,Debian 一直按照 GNU 工程的原则进行公开开发和自由分发。正因为如此,自由软件基金会从1994年11月到1995年11月赞助了这个项目。赞助结束后,Debian 项目成立了非营利组织 Software in the Public Interest,以继续在财政上支持开发。

Debian 发行版的代号是根据《玩具总动员》电影中的人物名字而来。Debian的不稳定主干是以Sid命名的,这个角色经常破坏他的玩具。

一、系统安装

1.1 系统镜像下载

官网:https://www.debian.org/

1.2 安装教程

官方图文安装教程:

https://www.debian.org/doc/manuals/debian-handbook/sect.installation-steps.zh-cn.html

二、系统初始化

2.1 更换国内镜像源

切换至root用户:

1
su –

输入root用户密码(密码不显示),然后按下回车键确定,系统输出显示如下:

1
root@debian:~#

Debian 的软件源配置文件是/etc/apt/sources.list。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用 TUNA 的软件源镜像。
首先备份/etc/apt/sources.list,命令:

1
cp /etc/apt/sources.list /etc/apt/sources.list.bak

修改sources.list文件,复制下面命令到终端运行,此镜像源适用于Debian 12系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat <<EOF > /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
EOF

2.2 更新系统

执行命令:

1
apt update && apt upgrade -y

Debian Buster 以上版本默认支持 HTTPS 源。如果遇到无法拉取 HTTPS 源的情况,请先使用 HTTP 源并安装:

1
apt-get install apt-transport-https ca-certificates -y

2.3 安装初始必备软件

输入下面命令安装基础必备软件,命令:

1
apt install sudo curl git vim net-tools -y

2.4 添加用户至sudo组

添加安装系统时创建的第一个至sudo组,以方便我们后续管理系统,执行命令:

1
usermod -aG sudo user_name

请将user_name替换为要添加的用户名。

三、安装Cockpit Web管理面板

Cockpit 使 Linux 易于使用。您不必在命令行中记住命令。

在 Web 浏览器中查看服务器并使用鼠标执行系统任务。启动容器、管理存储、配置网络和检查日志都很容易。基本上,您可以将Cockpit视为图形化的“桌面界面”,但适用于单个服务器。

3.1 安装Cockpit

Cockpit 从版本 10 (Buster) 开始在 Debian 中可用。

安装或更新软件包:

1
2
. /etc/os-release
apt install -t ${VERSION_CODENAME}-backports cockpit cockpit-pcp -y

3.2 安装Cockpit附属组件

官方组件

1、虚拟机,在浏览器中创建、运行和管理虚拟机。(按需安装,非必要插件)

1
2
. /etc/os-release
apt install -t ${VERSION_CODENAME}-backports cockpit-machines -y

2、Podman 容器,在浏览器中下载、使用和管理容器。(按需安装,非必要插件)

1
2
. /etc/os-release
apt install -t ${VERSION_CODENAME}-backports cockpit-podman -y

3、cockpit-pcp,Cockpit面板的历史数据插件。

1
2
. /etc/os-release
sudo apt install -t ${VERSION_CODENAME}-backports cockpit-pcp -y

第三方组件

配置45Drives Repo安装脚本,安装脚本将自动检测您的发行版并将适当的文件添加到您的系统。该脚本还将保存任何与 45Drives 相关的旧存储库(如果存在)。

下面的命令将下载并运行脚本,而不会在您的系统上留下任何东西!

1
2
curl -sSL https://repo.45drives.com/setup | sudo bash
sudo apt update

Navigator、File Sharing、Identities三合一安装命令:

1
sudo apt install cockpit-navigator cockpit-file-sharing cockpit-identities -y

1、Navigator文件浏览器,Cockpit 的特色文件浏览器。(推荐安装)

安装软件包:

1
sudo apt install cockpit-navigator -y

2、File Sharing,一个 Cockpit 插件,可轻松管理 Samba 和 NFS 文件共享。(推荐安装)

安装软件包:

1
sudo apt install cockpit-file-sharing -y

3、Cockpit Identities,用户和组管理插件。(推荐安装)

安装软件包:

1
sudo apt install cockpit-identities -y

4、Cockpit ZFS管理器。(按需安装,非必要插件)

安装ZFS:

1
2
sudo apt update
sudo apt install -y zfs-dkms zfsutils-linux

要求:

Cockpit: 201+;NFS (Optional);Samba: 4+ (Optional);ZFS: 0.8+;

安装:

1
2
git clone https://github.com/optimans/cockpit-zfs-manager.git
sudo cp -r cockpit-zfs-manager/zfs /usr/share/cockpit

3.3 Cockpit调优
自动注销闲置的用户
在您首选的文本编辑器中,在 /etc/cockpit/ 目录中打开或创建 cockpit.conf 文件,命令:

1
sudo vim /etc/cockpit/cockpit.conf

在文件中添加以下文本,以分钟为单位,这里表示为15分钟后自动退出:

1
2
[Session]
IdleTimeout=15

保存文件,重启Cockpit Web 控制台以使更改生效,命令:

1
systemctl try-restart cockpit

在登录页面中添加标题

在您首选的文本编辑器中创建 /etc/issue.cockpit 文件(如果您还没有该文件)。添加您要显示的内容作为文件的横幅。命令:

1
sudo vim /etc/cockpit/issue.cockpit

在文件中添加需要展示的内容:

1
HomeNAS Based on Debian 12.

内容添加完成后,保存这个文件。

在您首选的文本编辑器中,在 /etc/cockpit/ 目录中打开或创建 cockpit.conf 文件。

1
sudo vim /etc/cockpit/cockpit.conf

在文件中添加以下文本:

1
2
[Session]
Banner=/etc/cockpit/issue.cockpit

保存该文件,重启Cockpit Web 控制台以使更改生效,命令:

1
sudo systemctl try-restart cockpit

Nginx反向代理Cockpit

在您首选的文本编辑器中,在 /etc/cockpit/ 目录中打开或创建 cockpit.conf 文件,命令:

1
sudo vim /etc/cockpit/cockpit.conf

在文件中添加以下文本,将下面内容中的两处’cockpit.domain.tld’替换为你的域名(如为非标端口号,需将端口号一并填写上),将192.168.1.10:9090修改为你对应的内网IP,就可以实现外网内网同时访问Cockpit管理面板:

1
2
3
4
5
[WebService]
Origins = https://cockpit.domain.tld wss://cockpit.domain.tld https://192.168.1.10:9090
ProtocolHeader = X-Forwarded-Proto
ForwardedForHeader = X-Forwarded-For
LoginTo = false

保存文件,重启Cockpit Web 控制台以使更改生效,命令:

1
sudo systemctl try-restart cockpit

Cockpit面板登陆后首页展示信息

配置文件路径:

1
sudo vim /etc/motd

原文:

1
2
3
4
5
6
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

修改后:

1
2
3
4
我们信任您已经从系统管理员那里了解了日常注意事项。 总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。

防止暴力攻击Web登陆窗口

配置此项设置需已经安装好Fail2ban,否则无效。

编辑defaults-debian.conf文件:

1
sudo vim /etc/fail2ban/jail.d/defaults-debian.conf

添加如下内容(只需要插入绿色字体部分内容,灰色部分为默认自带内容):

1
2
3
4
[sshd]
enabled = true
[pam-generic]
enabled = true

保存文件后重启Fail2ban:

1
sudo systemctl restart fail2ban

修改Web登陆端口

要更改其端口和/或地址,您应该将以下内容放入文件中:

1
/etc/systemd/system/cockpit.socket.d/listen.conf

在该路径中创建尚不存在的文件和目录。该ListenStream 选项指定所需的地址和 TCP 端口。

1
2
3
[Socket]
ListenStream=
ListenStream=443

注意:第一行的空值是故意的。systemd允许Listen在单个套接字单元中声明多个指令;插入文件中的空值会重置列表,从而禁用原始设备的默认端口 9090。
为了使更改生效,请运行以下命令:

1
2
sudo systemctl daemon-reload 
sudo systemctl restart cockpit.socket

四、系统调优

4.1 设置Cockpit接管网络配置

编辑文件网络配置文件,命令:

1
sudo vim /etc/network/interfaces

注销掉里面所有内容:

1
2
3
4
5
6
7
8
9
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# source /etc/network/interfaces.d/*
# The loopback network interface
# auto lo
# iface lo inet loopback
# The primary network interface
# allow-hotplug enp1s0
# iface enp1s0 inet dhcp

手动配置IP

Cockpit-网络-接口- enp1s0 (你网络接口名称)-IPV4-编辑-手动,输入你要设置的IP地址及默认网关。

4.2 调整系统时区/时间

Cockpit-概览-系统时间-点击时间进行校准,时区选择Asia/Shanghai,设置时间选择自动使用NTP,然后点击变更,系统会自动联网进行校准。

4.3 交换空间优化

Debian默认是当内存使用达到**40%就向交换空间写入数据,这样会大大的降低电脑运行效率,我们将它改为10%**再向交换空间写入数据

打开 /etc/sysctl.conf 文件,执行命令:

1
sudo vim /etc/sysctl.conf

在文件的末尾添加下面两行配置:

1
2
vm.swappiness=10
vm.vfs_cache_pressure=50

vm.swappiness 是用来控制内核在什么时候开始使用交换空间的参数,默认值是 60。将该值调整为 10 表示让内存使用率达到 90% 时才开始使用交换空间。

vm.vfs_cache_pressure 是用来控制内核清理缓存的频率的参数,默认值是 100。将该值调整为 50 表示内核会更倾向于清理文件系统缓存以回收内存。
保存修改并退出编辑器,执行命令:

1
sudo sysctl -p

以重新加载配置。

注意:修改内核参数可能会影响系统性能和稳定性,请根据自身需要调整,谨慎操作。

4.4 安装Tuned系统调优工具

Tuned(又称为tuned-adm)是一个系统调优工具,旨在帮助优化系统的性能和功耗。它允许管理员根据系统的需求选择不同的预定义配置文件或自定义配置文件,以提供最佳的性能和功耗平衡。

安装Tuned软件包

1
sudo apt update && sudo apt install tuned

以下是Tuned的一些常用命令和其功能:

1
2
3
4
5
6
7
8
9
sudo systemctl start tuned:启动Tuned服务。
sudo systemctl stop tuned:停止Tuned服务。
sudo systemctl restart tuned:重启Tuned服务。
sudo systemctl status tuned:查看Tuned服务的运行状态。
sudo systemctl stop tuned:停止Tuned服务。
sudo systemctl disable tuned:禁止Tuned服务开机启动。
tuned-adm list:列出所有可用的Tuned配置文件。
tuned-adm active:查看当前活动的Tuned配置文件。
tuned-adm recommend:根据系统的硬件配置和工作负载推荐一个最佳的Tuned配置文件。

在Cockpit Web管理面板上配置Tuned

选择你需要的模式激活使用

常用TuneD 配置集

1、throughput-performance

针对高吞吐量优化的服务器配置文件。它禁用节能机制并启用 sysctl 设置,以提高磁盘和网络 IO 的吞吐量性能。CPU 调控器设置为 performance。它将 energy_performance_preference 和 scaling_governor 属性设置为 performance 配置集。

2、accelerator-performance

accelerator-performance 配置集包含与 throughput-performance 配置集相同的调整。另外,它会将 CPU 锁定为低 C 状态,以便使延迟小于 100us。这提高了某些加速器的性能,如 GPU。

3、network-throughput

用于吞吐量网络调优的配置集。它基于 throughput-performance 配置集。此外,它还增加了内核网络缓冲区。它继承 latency-performance 或 throughput-performance 配置集,并将energy_performance_preference 和 scaling_governor 属性改为 performance 配置集。

4、Balanced

默认的节能配置文件。它在性能和功耗之间具有折衷。在可能的情况下尽可能使用自动扩展和自动调整。唯一缺陷是增加延迟。在当前的 TuneD 版本中,它启用了 CPU、磁盘、音频和视频插件,并激活了 conservative CPU 调控器。如果支持,radeon_powersave 选项使用 dpm-balanced 值,否则被设置为 auto。它将 energy_performance_preference 属性改为 normal 能源设置。它还将 scaling_governor 策略属性改为 conservative 或 powersave CPU 调控器。

5、powersave

用于最大节能性能的配置集。它可以对性能进行调整,从而最大程度降低实际功耗。在当前的 TuneD 发行版本中,它为 SATA 主机适配器启用 USB 自动挂起、WiFi 节能和 Aggresive Link Power Management (ALPM) 节能。它还为使用低折率的系统调度多核功耗,并激活 ondemand 监管器。它启用了 AC97 音频节能,或根据您的系统,HDA-Intel 节能时间为 10 秒。如果您的系统包含启用了 KMS 支持的 Radeon 图形卡,配置集会将其配置为自动节能。在 ASUS Eee PC 上,启用了动态超级混合引擎。它将 energy_performance_preference 属性改为 powersave 或 power energy 设置。它还会将 scaling_governor 策略属性更改为 ondemand 或 powersave CPU 调控器。

4.5 新用户默认加入user组

编辑/etc/adduser.conf文件,

找到 USERGROUPS 修改变量为 ‘no’(USERGROUPS=no), 这样当创建用户时就不会伴随产生一个新组了.设置 USERS_GID 为所有用户都属于的组的GID,建议设置为USERS_GID=100,即user组。

这样修改好之后,新建用户将不再生成同名用户组,且用户默认加入user组。

4.6 修改homes目录默认路径

编辑/etc/adduser.conf文件,

找到DHOME=/home参数,修改变量为自定义路径即可,例如:

1
DHOME=/srv/volume_1/data/home

4.7 修改用户home目录默认权限

编辑/etc/adduser.conf文件,

找到DIR_MODE=0755参数,修改变量为’0700’(DIR_MODE=0700),0700表示只有该用户拥有文件所有权,其他用户无权访问。

4.8 创建新用户

对于需要创建新的用户,推荐通过adduser命令去增加,只有通过这个命令去增加的用户,前面4.3~4.6之间的修改项方能生效。

创建新用户命令,命令中的”test”为用户名,自行替换为自己需要创建的用户名:

1
sudo adduser test

系统将输出如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
正在添加用户"test"...
正在添加新用户"test" (1001) 到组"users"...
创建主目录"/srv/home/test"...
正在从"/etc/skel"复制文件...
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
正在改变 test 的用户信息
请输入新值,或直接敲回车键以使用默认值
全名 []: test
房间号码 []:
工作电话 []:
家庭电话 []:
其它 []:
这些信息是否正确? [Y/n] y

创建用户过程中,需要填写新创建用户的密码,建议全名项输入与用户名相同的值,其余项可以留空,或者按需填写。

adduser高级语法可以参考此链接:https://www.runoob.com/linux/linux-comm-adduser.html

4.9 创建容器专属账户

考虑到将要搭建的容器服务众多,甚至一部分服务还可能对 Internet 开放,为了安全,建议创建一个专用的低权限用户来运行各项容器。

1
sudo adduser application

使用命令行新建名为 application 的用户(名称可以自定义):

1
id application

终端输出内容:

1
uid=1001(application) gid=1001(application) 组=1001(application)

这里可以看到都是:1001(application),记住这个值,作为后续容器参数使用。

4.10 配置邮件发送服务

安装Exim4,命令:

1
sudo apt install exim4 -y

配置Exim4服务,命令:

1
sudo dpkg-reconfigure exim4-config

终端输出配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Please select the mail server configuration type that best meets your needs.

Systems with dynamic IP addresses, including dialup systems, should generally be
configured to send outgoing mail to another machine, called a 'smarthost' for
delivery because many receiving systems on the Internet block incoming mail from
dynamic IP addresses as spam protection.

A system with a dynamic IP address can receive its own mail, or local delivery
can be disabled entirely (except mail for root and postmaster).

1. internet site; mail is sent and received directly using SMTP
2. mail sent by smarthost; received via SMTP or fetchmail
3. mail sent by smarthost; no local mail
4. local delivery only; not on a network
5. no configuration at this time
General type of mail configuration:

接下来进行逐步配置:

1、邮件系统设置的常见类型:选择第三项,用smarthost 发信;无本地信件。

1
General type of mail configuration: 3

enter description here
2、系统邮件名称:填写发邮件的邮件域名,如你的发件邮件地址是mymail@qq.com,则这里填写qq.com。

1
System mail name:qq.com

enter description here
3、要监听入站 SMTP 连接的 IP 地址:填127.0.0.1 ; ::1,这里表示只监听本地IPV4/IPV6端口,也就是只有本机能发信,外部不能访问。

1
IP-addresses to listen on for incoming SMTP connections: 127.0.0.1 ; ::1

enter description here

4、其它可接收邮件的目的地址:留空

1
Other destinations for which mail is accepted:

enter description here
5、本地用户的可见域名:这里和第2步一样,填写你的发件邮箱域名,如qq.com。

1
Visible domain name for local users: qq.com

enter description here
6、发邮件使用的smarthost 的IP 地址或主机名:填写外部SMTP地址。由于qq.com使用的邮件系统是qq,所以这里填写qq的smtp地址smtp.qq.com:587。

1
IP address or host name of the outgoing smarthost: smtp.qq.com:587

enter description here

7、保持最小 DNS 查询量吗 (按需拔号,Dial-on-Demand)?否

1
Keep number of DNS-queries minimal (Dial-on-Demand)? [yes/no] n

enter description here
8、将设置文件分拆成小文件吗?否(不搭建复杂的邮件服务器,保持默认就可以,不需要拆分)

1
Split configuration into small files? [yes/no] n

enter description here
9、Root 和 postmaster 邮件的接收者: 空

1
Root and postmaster mail recipient:

enter description here

到这里就完成了,但还不能发邮件。输入命令:

1
sudo vim /etc/exim4/passwd.client

在末尾加入(注意修改用户名和密码,密码为邮箱授权码,非登录密码):

1
2
3
qq-smtp.l.qq.com:yourAccountName@qq.com:y0uRpaSsw0RD
*.qq.com:yourAccountName@qq.com:y0uRpaSsw0RD
smtp.qq.com:yourAccountName@qq.com:y0uRpaSsw0RD

格式为:发件邮箱SMTP服务器:发件邮箱账号:发件邮箱密码,因为上面我们已经设置smtp服务器地址,所以这里可以填写通配符,当然也可以填smtp地址。

输入命令:

1
sudo vim /etc/email-addresses

在末尾加入:

1
root: mymail@qq.com

格式是:系统用户名: 发件邮箱地址。

防火墙记得开放587端口,然后重启exim4,输入命令:

1
/etc/init.d/exim4 restart

发送邮件测试,首先切换到root用户,输入命令:

1
su –

输入发送邮件测试命令(user@example.com改为你要接收邮件的邮箱地址):

1
sudo echo "test" | mail -s "test" user@example.com

如果你的邮箱收到邮件,就说明安装成功了。

4.11 添加Github Hosts

打开系统hosts文件,命令:

1
sudo vim /etc/hosts

粘贴下面内容进去之后保存退出即可。(此Hosts IP具有时效性,请保持定期更新)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# GitHub Host Start
140.82.113.3 central.github.com
140.82.113.3 assets-cdn.github.com
151.101.1.6 github.map.fastly.net
151.101.1.6 github.global.ssl.fastly.net
140.82.113.3 gist.github.com
185.199.108.153 github.io
140.82.113.3 github.com
140.82.113.3 api.github.com
140.82.113.3 codeload.github.com
72.21.206.80 github-cloud.s3.amazonaws.com
72.21.206.80 github-com.s3.amazonaws.com
72.21.206.80 github-production-release-asset-2e65be.s3.amazonaws.com
72.21.206.80 github-production-user-asset-6210df.s3.amazonaws.com
72.21.206.80 github-production-repository-file-5c1aeb.s3.amazonaws.com
185.199.108.153 githubstatus.com
140.82.113.18 github.community
140.82.113.3 raw.github.com
# Update at: 2022-11-19 18:13:32
# GitHub Host End

4.12 添加TMDB Hosts

打开系统hosts文件,命令:

1
sudo vim /etc/hosts

粘贴下面内容进去之后保存退出即可。(此Hosts IP具有时效性,请保持定期更新)

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
# TMDB Hosts Start
108.159.227.27 themoviedb.org
108.159.227.37 themoviedb.org
108.159.227.40 themoviedb.org
108.159.227.111 themoviedb.org
99.86.229.15 tmdb.org
99.86.229.92 tmdb.org
99.86.229.116 tmdb.org
99.86.229.123 tmdb.org
18.160.41.44 www.themoviedb.org
18.160.41.75 www.themoviedb.org
18.160.41.115 www.themoviedb.org
18.160.41.129 www.themoviedb.org
52.85.247.30 api.themoviedb.org
52.85.247.33 api.themoviedb.org
52.85.247.69 api.themoviedb.org
52.85.247.81 api.themoviedb.org
18.160.41.31 api.tmdb.org
18.160.41.40 api.tmdb.org
18.160.41.52 api.tmdb.org
18.160.41.88 api.tmdb.org
185.93.1.250 image.tmdb.org
158.69.0.103 assets.fanart.tv
192.99.151.161 assets.fanart.tv
# Update at 20240406
# TMDB Hosts End

获取最新IP方法:通过https://www.ipaddress.com或者https://dnschecker.org/country/cn首页,输入api.themoviedb.org和api.tmdb.org获取真实IP地址

4.13 WireGuard家庭组网

WireGuard®是一个极其简单而又快速的现代VPN,采用了最先进的加密技术。它的目标是比IPsec更快、更简单、更精简、更有用,同时避免了大量的头痛问题。它打算比OpenVPN的性能要好得多。WireGuard被设计成一个通用的VPN,可以在嵌入式接口和超级计算机上运行,适合于许多不同的情况。它最初是为Linux内核发布的,现在是跨平台的(Windows、macOS、BSD、iOS、Android),可广泛部署。它目前正在大力发展,但已经被认为是业内最安全、最容易使用和最简单的VPN解决方案。

官网:https://www.wireguard.com/

docker版项目地址:https://hub.docker.com/r/weejewel/wg-easy

各平台客户端下载地址:https://www.wireguard.com/install/

一、WireGuard部署

这里采用Docker部署WireGuard的原因是因为,是因为Docker版提供了WebUI界面,可通过图形界面即可完成WireGuard的相关连接配置,使用起来方便快捷,对新手友好。

Docker CLI部署命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run -d \
--name=wg-easy \
-e WG_HOST=123.123.123.123 (服务器公网IP或域名地址,无需端口) \
-e PASSWORD=passwd123 (Web管理面板密码) \
-e WG_DEFAULT_ADDRESS=10.8.0.x (默认IP地址)\
-e WG_DEFAULT_DNS=223.5.5.5 (默认DNS)\
-e WG_ALLOWED_IPS=10.8.0.0/24 (允许连接的IP段)\
-e WG_PERSISTENT_KEEPALIVE=25 (重连间隔)\
-v ~/.wg-easy:/etc/wireguard (配置文件保存路径)\
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
weejewel/wg-easy

容器部署完成后,即可通过http://localhost:51821访问

二、路由器转发UDP端口

因为我是在家里的用的公网IP宽带做服务端,所以需要在路由器上转发UDP端口,按照上面的配置信息,设置的UDP端口是:51820,所以需要转发这个端口,51821是webUI访问端口,可以不转发。下图是华硕路由器设置端口转发示意图:

三、创建设备连接

1、点击New Client创建新的连接客户端。

2、在弹出的New Client框中,Name部分内容可以随意填写,一般情况下,建议以使用的设备名称来命令,以方便后期设备多了之后,便于快速区分。比如设置为:xiaomi、oneplus、dellPC、hpPC等等。

3、获取连接的配置文件或配置信息

4、PC端连接,打开安装好的WireGuard客户端,点击从文件导入隧道,选择刚刚下载的dellPC.conf文件,点击打开即可。

打开之后点击:连接,即可和WireGuard服务端连接上。

5、Debian系统上连接,

安装WireGuard,可以通过以下命令完成:

1
2
sudo apt update
sudo apt install -y wireguard resolvconf

在客户端上创建配置文件 在客户端上,您需要创建一个配置文件,其中包含服务器的公共IP地址和端口,以及客户端的公钥和私钥。您可以使用以下命令创建配置文件:

1
sudo vim /etc/wireguard/wg0.conf

在编辑器中,输入刚才下载ubuntu.conf文件里的内容(.conf文件可通过Windows系统的记事本打开):

1
2
3
4
5
6
7
8
9
10
11
12
13

[Interface]
PrivateKey = AMgQmLbE4GrjahPOvm56CEHd/hIlovG2atNW5Wotq28=
Address = 10.8.0.4/24
DNS = 223.5.5.5


[Peer]
PublicKey = O/4gWMVbNLFpwbnFQCUpJV3g3oCPSV0wjqDaaEAqnyw=
PresharedKey = LojEYv08DXKi31R7jErWDOCexdw15/VsIyt4rg6/7B8=
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
Endpoint = baidu.com:51820

Endpoint = baidu.com:51820,这里可以填写你服务器的公网IP或者域名,如果是动态公网IP,建议填写域名。

启动WireGuard客户端 在客户端上,您需要启动WireGuard客户端,这可以通过以下命令完成:

1
2
3
4
#启用 wg-quick 服务,并在系统启动时自动启动该服务。
sudo systemctl enable wg-quick@wg0
#启动 wg-quick 服务,使 WireGuard VPN 服务开始运行。
sudo systemctl start wg-quick@wg0

现在,您的Ubuntu系统已经成功连接到您在云服务器上部署的WireGuard服务,您可以通过以下命令来检查连接状态:

1
sudo wg

如果一切正常,您将看到类似以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13

interface: wg0
public key: rT90PdlG+Et5thj/uKrXlIpuZa0edWpYt2kEaUdVkE0=
private key: (hidden)
listening port: 42262

peer: O/4gWMVbNLFpwbnFQCUpJV3g3oCPSV0wjqDaaEAqnyw=
preshared key: (hidden)
endpoint: 192.137.59.59:51820
allowed ips: 10.8.0.0/24
latest handshake: 1 hour, 13 minutes, 44 seconds ago
transfer: 53.51 KiB received, 428.10 KiB sent
persistent keepalive: every 25 seconds

如果您想禁用WireGuard VPN开机自启动,可以使用以下命令:

1
sudo systemctl disable wg-quick@wg0

请注意,上面命令不会停止当前正在运行的WireGuard VPN服务,如果您当前正在运行WireGuard VPN服务,您可以使用以下命令来停止它:

1
sudo wg-quick down wg0

这将关闭 wg0 接口并停止WireGuard VPN服务。

如果您已经使用 sudo systemctl start wg-quick@wg0 命令启动了 WireGuard VPN 服务,则可以使用以下命令停止服务:

1
sudo systemctl stop wg-quick@wg0

这将停止 wg-quick@wg0 服务并关闭 wg0 接口。

6、手机端连接,手机端连接很简单,安装好WireGuard手机端app之后,打开app点击右下角的+号按钮——选扫描二维码,扫描WebUI端提供的二维码即可连接成功(扫描成功后会弹出框提示输入名称,这个名称可以随意填写,比如设置为:WireGuard)。

当设备连接成功后,WebUI界面可查看其状态,头像右下角显示有红点,表示连接正常。

五、安全防护

安全的概念:

1、收紧安全措施有可能达到使系统无法使用的程度。安全性与便利性需要得到平衡。诀窍在于建立一个安全且有用的系统。

2、最大的威胁是(并且一直都会是)用户。

3、最小权限原则:系统的每一部分应该只能访问到它确实需要的东西,除此之外的则不可以。

4、纵深防御:多个独立的层次能带来更好的安全性。当一层防护被攻破时,另一层应该能够阻止攻击。

5、保持一点点的偏执和多疑。如果有件事看起来太好了,不像是真的,那可能确实如此。

6、永远无法令系统 100% 安全,除非把机器从网络上断开,关掉电源,锁进保险柜,用混凝土封住并不再使用它。

7、为失败做好准备。预先为安全措施被攻破的情况制定可供执行的计划。

本章节主要内容参考自Debian安全指南和Arch Linux安全。

Debian安全指南:

https://www.debian.org/doc/manuals/securing-debian-manual/ch04s11.zh-cn.html

Arch Linux安全:https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E5%85%A8

执行下列操作前,先给系统用户做个检查。检查是否存在空口令和root权限的账号,确认是否存在异常账号,确认UID为零的账号只有root账号。

操作步骤:

查看root权限账号,使用命令:

1
awk -F: '($3==0)' /etc/passwd //查看UID为零的账号。

查看空口令账号,使用命令:

1
awk -F: '($2=="")' /etc/shadow //查看空口令账号。

加固空口令账号,使用命令:

1
passwd <用户名>                                           //为空口令账号设定密码。

5.1 配置高强度密码策略

为了确保系统的安全性,建议设置的口令复杂度策略为:口令最小长度不小于8,至少包含大写字母、小写字母、数字和特殊字符中的三种。

安装 PAM 的pwquality模块,cracklib模块在Debian 12中被pwquality替代,pwquality能提供额外的密码检查能力。

1
sudo apt install libpam-pwquality

修改文件“/etc/pam.d/common-password”。 一旦修改,策略会马上生效。

1
sudo vim /etc/pam.d/common-password

找到文件中的以下内容:

1
password requisite pam_pwquality.so retry=3 minlen=8 difok=3

添加参数“minlen”、“dcredit”、“ucredit”、“lcredit”、“ocredit”。如果文件中已有这些参数,直接修改参数值即可,参数说明如表1所示。

1
password requisite pam_pwquality.so retry=3 minlen=9 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 difok=3
参数 说明 示例
minlen “口令最小长度配置项。PAM默认使用了“credits”,因此最小口令长度需要加1,若需要设置最小口令长度为8,则minlen的值应该设置为9。” minlen=9
dcredit “口令数字要求的配置项。值为负数N时表示至少有N个数字,值为正数时对数字个数没有限制。” dcredit=-1
ucredit “口令大写字母要求的配置项。值为负数N时表示至少有N个大写字母,值为正数时对大写字母个数没有限制。” ucredit=-1
lcredit “口令小写字母要求的配置项。值为负数N时表示至少有N个小写字母,值为正数时对小写字母个数没有限制。” lcredit=-1
ocredit 特殊字符要求的配置项。值为负数N时表示至少有N个特殊字符,值为正数时对特殊字符个数没有限制。 ocredit=-1

5.2 用户连续登陆失败锁定

在3次登录尝试失败后账户将被锁定至少15分钟,或者由管理员将其解锁。

在/etc/pam.d/common-auth中添加如下绿色字体内容,必须按下面顺序添加,命令:

1
sudo vim /etc/pam.d/common-auth

插入内容(只需要插入绿色字体部分内容,灰色部分为默认自带内容):

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
#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
auth required pam_faillock.so preauth audit silent deny=3 fail_interval=900 unlock_time=900 even_deny_root root_unlock_time=900
auth [success=1 default=ignore] pam_unix.so nullok
# here's the fallback if no module succeeds
# BEGIN ANSIBLE MANAGED BLOCK
auth [default=die] pam_faillock.so authfail audit deny=3 fail_interval=900 unlock_time=900 even_deny_root root_unlock_time=900
auth sufficient pam_faillock.so authsucc audit deny=3 fail_interval=900 unlock_time=900 even_deny_root root_unlock_time=900
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_cap.so
# end of pam-auth-update config

参数解析:

audit //如果用户不存在,则把该用户名记录到系统日志中。

Silent //不打印信息性的消息

deny=3 //用户连续认证失败次数超过3则锁定

fail_interval=900 //间隔时间的长度,在这个时间段内连续的

unlock_time=900 //锁定后n秒后,访问将被重新启用,在没有设置faillock的情况下,不会重新启用。

even_deny_root //Root账户和普通账户一样可以被锁定。

root_unlock_time=900 //在root账户被锁定后, 允许在n秒后访问该账户。

参数解析来源/etc/security/faillock.conf文件

上述参数可以按需添加,如需全部添加,可以参考下面格式:

示例:

auth required pam_faillock.so preauth audit silent deny=3 fail_interval=900 unlock_time=900 even_deny_root root_unlock_time=900

接着编辑/etc/pam.d/common-account,命令:

1
sudo vim /etc/pam.d/common-account

插入内容(只需要插入绿色字体部分内容,灰色部分为默认自带内容):

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
#
# /etc/pam.d/common-account - authorization settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authorization modules that define
# the central access policy for use on the system. The default is to
# only deny service to users whose accounts are expired in /etc/shadow.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.
#

# here are the per-package modules (the "Primary" block)
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
# here's the fallback if no module succeeds
account requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
account required pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
account required pam_faillock.so

常用操作命令:

查看所有用户的尝试失败登录次数

1
sudo faillock

主要看faillock命令,显示的valid值,v表示有效,i表示无效。

查看指定用户(test用户)

1
sudo faillock --user test

解锁指定用户账户(test用户)

1
sudo faillock --user test --reset

解锁所有用户

1
sudo faillock --reset

重启系统也能解锁所有用户。

5.3 禁止root用户密码登陆

建议是通过Cockpit Web管理面板禁止root用户密码登陆,平时保持其处于禁用状态,如有需要时可以很方便就通过此处开启,用完即随手关闭。

通过Cockpit Web管理面板-账户-root用户-选项-禁用交互式密码,打上勾表示禁止root用户使用密码登陆。

5.4 限制用户SU

限制能su到root的用户。操作步骤

使用命令:

1
sudo vim /etc/pam.d/su

修改配置文件,在配置文件中添加行。例如,只允许sudo组用户su到root,则添加

1
auth required pam_wheel.so group=sudo

添加后如下所示:

1
2
3
4
5
6
#
# The PAM configuration file for the Shadow `su' service
#
auth required pam_wheel.so group=sudo
# This allows root to su without passwords (normal operation)
auth sufficient pam_rootok.so

5.5 用户登陆邮件通知告警

通过 PAM 模块,就可以实现用户登录,root 权限获取时,通过邮件等方式进行通知。以实现,预先知道,预先警惕的目标,降低受影响的范围。以下是通过 PAM 模块实现的邮件通知用户登录的功能。

1、以管理员身份登录虚拟机,并切换成 root 用户。

2、新建脚本,命令:

1
sudo vim /etc/pam.d/login-notifiy.sh

(该脚本可以存放在任意位置,但是需要将后续的路径指定好即可),内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

export LANG="en_US.UTF-8"

[ "$PAM_TYPE" = "open_session" ] || exit 0
{
echo "用户: $PAM_USER"
echo "远程用户: $PAM_RUSER"
echo "远程主机: $PAM_RHOST"
echo "服务: $PAM_SERVICE"
echo "终端: $PAM_TTY"
echo "日期: `date '+%Y年%m月%d日%H时%M分%S秒'`"
echo "服务器: `uname -s -n -r`"
} | mail -s "注意! 用户$PAM_USER正通过$PAM_SERVICE服务登录`hostname -s | awk '{print toupper(substr($0,1,1)) substr($0,2)}'`系统" user@yourdomain.com

脚本中的user@yourdomain.com修改为你要接收通知的邮箱地址。

3、编辑文件

1
sudo vim /etc/pam.d/common-session

4、在文件最后追加一行:

1
session optional pam_exec.so debug /bin/bash /etc/pam.d/login-notifiy.sh

5、保存并退出。

至此,每一个用户登录都会发邮件通知给收件人,内容包括用户名以及登录的 IP 地址信息。如果遇到陌生 IP,那么就要注意,该主机是否正在遭受攻击。

注意:来源教程原文上脚本名称前后不一致,会导致脚本执行出错,如是按来源教程操作,记得修改脚本名称,使其前后名称一致。

5.6 超时自动注销活动状态

设置系统登录后,连接超时时间,增强安全性。操作步骤,使用命令:

1
sudo vim /etc/profile

修改配置文件,在文件末行添加下列内容:

1
2
# 超时自动退出
TMOUT=180

即超时时间为三分钟。

5.7 记录所有用户的登录和操作日志

通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查。

操作步骤

1
sudo vim /etc/profile

打开配置文件,在配置文件末行输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 在 history 命令中启用时间戳
export HISTTIMEFORMAT="%F %T "
# 记录所有用户的登录和操作日志
history
USER=`whoami`
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]; then
USER_IP=`hostname`
fi
if [ ! -d /var/log/history ]; then
mkdir /var/log/history
chmod 777 /var/log/history
fi
if [ ! -d /var/log/history/${LOGNAME} ]; then
mkdir /var/log/history/${LOGNAME}
chmod 300 /var/log/history/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date +"%Y%m%d_%H:%M:%S"`
export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT"
chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null

运行命令加载配置生效:

1
sudo bash -c "source /etc/profile"

注意:/var/log/history 是记录日志的存放位置,可以自定义。

通过上述步骤,可以在 /var/log/history 目录下以每个用户为名新建一个文件夹,每次用户退出后都会产生以用户名、登录IP、时间的日志文件,包含此用户本次的所有操作(root用户除外)。

5.8 禁止SSH服务开机自启动

为了系统的安全起见,建议SSH服务在有需要用的时候通过Cockpit Web面板开启,平常则处于关闭状态。开启路径:Cockpit-服务-ssh.service-启动

关闭ssh服务开机自动启动,命令:

1
sudo systemctl disable ssh

常用操作:

设置开机自动启动ssh服务,命令:

1
sudo systemctl enable ssh

单次开启ssh,命令:

1
sudo systemctl start ssh

单次关闭ssh,命令:

1
sudo systemctl stop ssh

5.9 安装防火墙

推荐使用firewalld防火墙的理由是,Cockpit Web管理面板搭配firewalld防火墙可以提供一个可视化的防火墙管理界面,对新手友好。

从apt存储库安装firewalld,并在安装成功之后关闭firewalld,关闭之后进入cockpit配置规则。

登陆cockpit-网络-防火墙-打开防火墙-添加新区-信任级别- public,允许的地址-整个子网

1
sudo apt update && sudo apt install firewalld -y && sudo systemctl stop firewalld

检查运行状态

1
sudo systemctl status firewalld

在终端输出的内容中将看到:

1
Active: active (running)

enter description here

Firewalld高阶使用

GeoIP和Firewalld组合使用的常见案例主要涉及到基于地理位置的防火墙规则。

5.10 安装自动封锁软件

第 1 步 — 安装 Fail2ban

Fail2ban 在 Ubuntu 的软件存储库中可用。首先以非根用户身份运行以下命令来更新您的软件包列表并安装 Fail2ban:

1
2
sudo apt update
sudo apt install fail2ban -y

Fail2ban 安装后会自动设置后台服务。但是,默认情况下它是禁用的,因为它的某些默认设置可能会导致不良影响。您可以使用以下systemctl命令验证这一点:

1
sudo systemctl status fail2ban.service

终端中输出的内容:

1
2
3
4
○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:fail2ban(1)

第 2 步 – 配置 Fail2ban

Fail2Ban的配置文件:/etc/fail2ban/

Fail2Ban的安装目录:/usr/share/fail2ban/

Fail2Ban日志文件:/var/log/fail2ban.log

达到阈值之后的执行Fail2Ban的动作的配置文件:/etc/fail2ban/action.d/

包含Fail2Ban所有的过滤规则:/etc/fail2ban/filter.d/

fail2ban 服务将其配置文件保存在该/etc/fail2ban目录中。在本教程中,您将创建jail.local. 你可以通过复制来做到这一点jail.conf:

1
sudo cp /etc/fail2ban/jail.{conf,local}

现在您可以开始进行配置更改。vim在或您喜欢的文本编辑器中打开文件:

1
sudo vim /etc/fail2ban/jail.local

当您滚动文件时,本教程将查看您可能想要更新的一些选项。位于文件顶部附近部分下的设置[DEFAULT]将应用于 Fail2ban 支持的所有服务。在文件的其他地方,有用于[sshd]和用于其他服务的标头,其中包含将在默认设置之上应用的特定于服务的设置。

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
#全局设置
[DEFAULT]

#此参数标识应被禁止系统忽略的 IP 地址。默认情况下,这只是设置为忽略来自机器本身的流量,这样您就不会填写自己的日志或将自己锁定。
ignoreip = 127.0.0.1/8 ::1

#此参数设置禁令的长度,以秒为单位。默认值为-1,表示将永久禁止IP地址,设置值为1h,则禁止1小时。
bantime = -1

#此参数设置 Fail2ban 在查找重复失败的身份验证尝试时将关注的窗口。默认设置为 1d ,这意味着软件将统计最近 1 天内的失败尝试次数。
findtime = 1d

#这设置了在禁止之前在窗口内允许的失败尝试次数。
maxretry = 3

#此条目指定 Fail2ban 将如何监视日志文件。设置auto意味着 fail2ban 将尝试pyinotify, 然后gamin, 然后基于可用的轮询算法。inotify是一个内置的 Linux 内核功能,用于跟踪文件何时被访问,并且是Fail2ban 使用pyinotify的 Python 接口。
#backend = auto
#Debian12使用systemd才能正常启动fail2ban
backend = systemd

#这定义了是否使用反向 DNS 来帮助实施禁令。将此设置为“否”将禁止 IP 本身而不是其域主机名。该warn设置将尝试查找主机名并以这种方式禁止,但会记录活动以供审查。
usedns = warn

#如果将您的操作配置为邮件警报,这是接收通知邮件的地址。
destemail = root@localhost

#发送者邮件地址
sender = root@<fq-hostname>

#这是用于发送通知电子邮件的邮件传输代理。
mta = mail

#“action_”之后的“mw”告诉 Fail2ban 向您发送电子邮件。“mwl”也附加了日志。
action = %(action_mw)s

#这是实施 IP 禁令时将丢弃的流量类型。这也是发送到新 iptables 链的流量类型。
protocol = tcp

##这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset

[SSH]

enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log

不要忘记在每次配置更改后重新启动 Fail2ban 服务。重启命令:

1
sudo systemctl restart fail2ban

常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
#启动
systemctl start fail2ban
#停止
systemctl stop fail2ban
#开机启动
systemctl enable fail2ban
#查看被ban IP,其中sshd为名称
fail2ban-client status sshd
#删除被ban IP
fail2ban-client set sshd unbanip 192.168.111.111
#查看日志
tail /var/log/fail2ban.log

配置中文邮件格式(可选项,默认为英文):

1
sudo cp /etc/fail2ban/action.d/mail-whois.{conf,local}

然后编辑mail-whois.local文件,

1
sudo vim /etc/fail2ban/action.d/mail-whois.local

替换成下面的内容,(只需要替换绿色字体部分内容,灰色部分为默认自带内容):

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
# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
#

[INCLUDES]

before = mail-whois-common.conf

[Definition]

# bypass ban/unban for restored tickets
norestored = 1

# Option: actionstart
# Notes.: command executed on demand at the first ban (or at the start of Fail2Ban if actionstart_on_demand is set to false).
# Values: CMD
#
actionstart = printf %%b "你好!\n
监视到【<name>】服务已成功启动。\n
敬请注意!\n
Fail2Ban"|mail -s "[Fail2Ban] <name>: 在 <fq-hostname> 服务器上启动" <dest>

# Option: actionstop
# Notes.: command executed at the stop of jail (or at the end of Fail2Ban)
# Values: CMD
#
actionstop = printf %%b "你好!\n
监视到【<name>】服务已被停止。\n
敬请注意!\n
Fail2Ban"|mail -s "[Fail2Ban] <name>: 在 <fq-hostname> 服务器上停止" <dest>

# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck =

# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = printf %%b "警告!!!\n
攻击者IP:<ip>\n
被攻击机器名:`uname -n` \n
被攻击机器IP:`/bin/curl ifconfig.co` \n
攻击服务:<name> \n
攻击次数:<failures> 次 \n
攻击方法:暴力破解,尝试弱口令.\n
该IP:<ip>已经被Fail2Ban加入防火墙黑名单,屏蔽时间<bantime>秒.\n\n
以下是攻击者 <ip>信息 :\n
`/bin/curl https://ip.appworlds.cn?ip=<ip>`\n\n
Fail2Ban邮件提醒\n\n "|/bin/mailx -s "<fq-hostname>服务器:<name>服务疑似遭到<ip>暴力攻击。" <dest>


# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionunban =

[Init]

# Default name of the chain
#
name = default

# Destination/Addressee of the mail
#
dest = root

说明
通过curl ifconfig.co获取服务器的外网IP地址,方便知道哪台机报出来的告警。
通过curl https://ip.useragentinfo.com/json?ip = 查询获取攻击者的IP信息。
不要忘记在每次配置更改后重新启动 Fail2ban 服务。重启命令:

1
sudo systemctl restart fail2ban

配置完成后效果:
enter description here enter description here

enter description here

5.11 安装病毒防护软件

ClamAV 是一个开源的防病毒软件,可用于检测木马,病毒,恶意软件和其他恶意威胁。适用于 Linux、macOS 和 Windows 平台。

一、安装ClamAV:

1
2
sudo apt-get update
sudo apt-get install clamav

二、更新病毒数据库

在安装完成后,需要运行以下命令来更新ClamAV的病毒数据库:

1、关闭ClamAV病毒数据库更新服务

1
sudo systemctl stop clamav-freshclam

2、更新病毒数据库:

1
sudo freshclam

3、启动ClamAV病毒数据库更新服务:

1
sudo systemctl start clamav-freshclam

三、使用ClamAV

1、扫描整个系统:在终端窗口中输入以下命令,扫描整个系统:

1
sudo clamscan -r /

2、扫描指定目录:在终端窗口中输入以下命令,扫描指定目录:

1
sudo clamscan -r /path/to/directory

3、删除被感染的文件:在终端窗口中输入以下命令,删除被感染的文件:

1
sudo clamscan --remove /path/to/file

4、扫描压缩文件:在终端窗口中输入以下命令,扫描压缩文件:

1
sudo clamscan -r /path/to/archive.zip

5、执行定期扫描:在终端窗口中输入以下命令,创建一个每天执行一次的定期扫描:

1
sudo crontab -e

在打开的文件中添加以下行:

1
0 0 * * * clamscan -r / > /var/log/clamav/scan.log

这将在每天的午夜(0点)执行全系统扫描,并将扫描结果保存在/var/log/clamav/scan.log文件中。

六、存储管理

6.1 硬盘管理

通过Cockpit Web管理面板进行管理。

6.2 软Raid管理

通过Cockpit Web管理面板进行管理。

6.3 硬盘自动休眠

hdparm

参考:https://manpages.ubuntu.com/manpages/jammy/man8/hdparm.8.html

6.4 硬盘健康监测

SMART是现代硬盘驱动器中的一个系统,旨在报告可能表明即将发生故障的情况。smartmontools是一个免费的软件包,可以监控 SMART 属性并运行硬盘自检。

安装smartmontools:

1
sudo apt install smartmontools

检查驱动器的SMART功能

要确保您的驱动器支持 SMART,请键入:

1
sudo smartctl -i /dev/sda

其中 /dev/sda 是你的硬盘。这将为您提供有关驱动器的简要信息。最后两行可能如下所示:

1
2
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

启用SMART

如果您的驱动器未启用 SMART,您可以通过键入以下内容来启用它:

1
sudo smartctl -s on /dev/sda

检查硬盘整体健康状况

1
sudo smartctl -H /dev/sda

此命令应返回:

1
2
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

如果它没有返回 PASSED,您应该立即备份所有数据。您的硬盘驱动器可能出现故障。

测试驱动器

您可以在安装驱动器时运行任何类型的测试,尽管性能可能会有所下降。可以在驱动器上进行三种类型的测试:

扩展(长)

传输

要查找执行每个测试所需时间的估计值,请键入:

1
sudo smartctl -c /dev/sda

最有用的测试是扩展测试(长)。您可以通过键入以下内容来启动测试:

1
sudo smartctl -t long /dev/sda

结果

您可以通过键入以下内容来查看驱动器的测试统计信息:

1
sudo smartctl -l selftest /dev/sda

要显示 IDE 驱动器的详细 SMART 信息,请键入:

1
sudo smartctl -a /dev/sda

要显示 SATA 驱动器的详细 SMART 信息,请键入:

1
sudo smartctl -a -d ata /dev/sda

注意:这也适用于通过 SCSI 堆栈运行并显示为 /dev/sdX 的新内核中的 IDE 驱动器

部分字段的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME
1 Raw_Read_Error_Rate 读取错误率
3 Spin_Up_Time 起转时间
4 Start_Stop_Count 启动停止次数
5 Reallocated_Sector_Ct 重新分配扇区计数
7 Seek_Error_Rate 寻道错误率
9 Power_On_Hours 通电时间
10 Spin_Retry_Count 起转重试次数
11 Calibration_Retry_Count 重新校准重试次数
12 Power_Cycle_Count 启动<->关闭循环次数
192 Power-Off_Retract_Count 断电磁头缩回计数
193 Load_Cycle_Count 磁头加载/卸载循环计数
194 Temperature_Celsius 温度
196 Reallocated_Event_Count 在分配扇区物理位置事件计数(与坏道无关)
197 Current_Pending_Sector 当前等待中扇区数(状态存疑/不稳定-等待后续判断)
198 Offline_Uncorrectable 无法修正的扇区总数
199 UDMA_CRC_Error_Count UltraDMA CRC错误计数
200 Multi_Zone_Error_Rate 写入错误率

使用示例:

1
2
3
4
5
6
# 监测硬盘1
/dev/sda -o on -S on -H -l error -l selftest -f -s (O/../../1/2|S/../../../4|L/../../2/5) -I 194 -W 4,45,55 -R 5 -m yourname@qq.com -M exec /usr/share/smartmontools/smartd-runner
# 监测硬盘2
/dev/sdb -o on -S on -H -l error -l selftest -f -s (O/../../1/2|S/../../../4|L/../../2/5) -I 194 -W 4,45,55 -R 5 -m yourname@qq.com -M exec /usr/share/smartmontools/smartd-runner
# 测试邮件通知
/dev/sda -o on -S on -H -l error -l selftest -f -s (O/../../1/2|S/../../../4|L/../../2/5) -I 194 -W 4,45,55 -R 5 -m yourname@qq.com -M test

上述例子来源于/etc/smartd.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 第一个 ATA/SATASCSI/SAS 磁盘。 监控所有属性,启用
# 自动在线数据收集,自动属性自动保存,并
# 每天凌晨 2-3 点开始短的自检,长的自检
# 周六凌晨3-4点之间。
#/dev/sda -a -o on -S on -s (S/./././02|L/././6/03)

# 监控SMART状态、ATA错误日志、自检日志,并跟踪
# 所有属性的变化,除了属性 194
#/dev/sdb -H -l error -l selftest -t -I 194

# 监控所有属性,除了正常化的温度(通常是194)。
# 但跟踪温度变化 >= 4 摄氏度,报告温度
# >= 45 摄氏度和 Reallocated_Sector_Ct (5) 原始值的变化。
# 在SMART故障或温度>=55摄氏度时发送邮件。
#/dev/sdc -a -I 194 -W 4,45,55 -R 5 -m admin@example.com

Scrutiny 是一种硬盘驱动器运行状况仪表板和监控解决方案,将制造商提供的 SMART 指标与实际故障率相结合。用于 smartd SMART 监控的 WebUI

项目地址:https://github.com/AnalogJ/scrutiny

安装教程:https://www.tauceti.blog/posts/easy-hard-disk-health-monitoring-with-scrutiny-and-smart/

安装教程:https://blog.csdn.net/wbsu2004/article/details/124095004

6.5 安装联合文件系统

mergerfs是一个联合文件系统,旨在简化跨众多商品存储设备的文件存储和管理。它类似于mhddfs、unionfs和aufs。

项目地址:https://github.com/trapexit/mergerfs

参考:https://blog.csdn.net/linkyy5/article/details/126080546

6.5 安装SnapRaid

官网:http://www.snapraid.it/

参考:https://wiki.archlinux.org/title/SnapRAID

七、Docker服务

7.1 容器管理

在新主机上首次安装 Docker Engine 之前,需要设置 Dockerapt存储库。之后,您可以从存储库安装和更新 Docker。

1、设置 Docker 的apt存储库:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

2、安装 Docker Engine、containerd 和 Docker Compose。

1
2
# Docker Engine containerd Docker Compose
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

3.hello-world通过运行镜像验证 Docker Engine 安装是否成功 :

1
sudo docker run hello-world

查看Docker版本命令:

1
sudo docker version

查看Docker Compose版本命令:

1
sudo docker compose version

7.2 容器管理

Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。

1
2
#请将路径/srv/volume_1/data/docker/portainer替换为您的,此路径存储Portainer配置文件。
sudo docker run -d -p 8000:8000 -p 9443:9443 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /srv/volume_1/data/docker/portainer:/data portainer/portainer-ce:latest

安装完成后,可以通过打开 Web 浏览器并转到Portainer管理界面:

http://localhost:9000或https://localhost:9443

7.2 反向代理

7.3 数据库

7.4 文件存储

7.5 影音服务

7.6 下载服务

7.7 照片管理

7.8 Blog管理

7.9 薅羊毛

八、UPS不断电系统

待完善。