本页内容

  • 准备工作
  • 步骤 1 - 禁用 Firewalld 防火墙
  • 步骤 2 - 安装所需的 Perl 模块
  • 步骤 3 - 下载并安装 CSF
  • 步骤 4 - 配置 CSF
  • 步骤 5 - 配置端口
  • 步骤 6 - CSF 其他设置
  • 步骤 7 - 允许和封禁 IP 地址
  • 步骤 8 - DDoS 攻击防护(SYN 洪水防护、黑名单、按国家屏蔽)
  • 步骤 9 - 常用 CSF 命令
  • 步骤 10 - 启用 CSF GUI
  • 步骤 11 - 安装并配置 Let's Encrypt SSL
  • 步骤 12 - 访问 CSF 网页面板
  • 步骤 13 - 卸载 CSF
  • 结论
  • SYN 洪水防护
  • 黑名单
  • 按国家屏蔽

Config Server Security and Firewall(CSF)是一个基于 iptables 的防火墙,可为 Linux 系统提供高级别安全保护。它通过进行有状态数据包检测(SPI)来实现这一目的。

它附带许多功能,例如 IP 封禁、端口封禁和 DDoS 防护。它还支持速率限制、连接跟踪和 SSH 登录检测。它还包含用于系统和文件完整性检查的工具。它提供了一个 GUI 仪表盘,可用于管理其设置。您还可以将 CSF 与 DirectAdmin、cPanel、Cyberpanel、Vesta 和 Webmin 等控制面板集成。

本教程将教您如何在 Rocky Linux 9 服务器上安装和管理 CSF。

准备工作

  • 一台运行 Rocky Linux 9 且至少配备 1 GB 内存的服务器。
  • 一个具有 sudo 权限的非 root 用户。
  • 一个指向您服务器的完全限定域名(FQDN),例如 csf.example.com。
  • 所有软件包均已更新。$ sudo dnf update
  • 运行本教程和 Craft CMS 需要一些必要的软件包。其中部分可能已安装在您的服务器上。$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y

一台运行 Rocky Linux 9 且至少配备 1 GB 内存的服务器。

一个具有 sudo 权限的非 root 用户。

一个指向您服务器的完全限定域名(FQDN),例如 csf.example.com。

所有软件包均已更新。

$ sudo dnf update

运行本教程和 Craft CMS 需要一些必要的软件包。其中部分可能已安装在您的服务器上。

$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y

步骤 1 - 禁用 Firewalld 防火墙

Rocky Linux 默认使用 Firewalld 防火墙。我们需要先将其禁用,以免它干扰 CSF。

首先查看 Firewalld 防火墙的状态。

$ sudo systemctl status firewalld
? firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
     Active: active (running) since Tue 2023-12-05 07:00:53 UTC; 40s ago
       Docs: man:firewalld(1)
   Main PID: 58756 (firewalld)
      Tasks: 2 (limit: 4424)
     Memory: 25.9M
        CPU: 496ms
     CGroup: /system.slice/firewalld.service
             ??58756 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Dec 05 07:00:52 csf.example.com systemd[1]: Starting firewalld - dynamic firewall daemon...
Dec 05 07:00:53 csf.example.com systemd[1]: Started firewalld - dynamic firewall daemon.

停止并禁用 Firewalld 服务。

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

步骤 2 - 安装所需的 Perl 模块

CSF 需要特定的 Perl 模块才能运行。但首先,我们需要 EPEL 软件仓库。请安装它。

$ sudo dnf install epel-release

使用以下命令安装它们。

$ sudo dnf install perl-core perl-libwww-perl.noarch perl-LWP-Protocol-https.noarch perl-GDGraph -y

步骤 3 - 下载并安装 CSF

Rocky Linux 软件仓库中没有提供 CSF。因此,我们需要手动安装它。

从其官网下载最新版本的 CSF 压缩包。

$ wget https://download.configserver.com/csf.tgz

解压该压缩包。

$ tar xzf csf.tgz

切换到解压后的目录。

$ cd csf

通过运行安装脚本来安装 CSF。

$ sudo ./install.sh

您应当看到如下输出。

...............
Don't forget to:
1. Configure the following options in the csf configuration to suite your server: TCP_*, UDP_*
2. Restart csf and lfd
3. Set TESTING to 0 once you're happy with the firewall, lfd will not run until you do so
'lfd.service' -> '/usr/lib/systemd/system/lfd.service'
'csf.service' -> '/usr/lib/systemd/system/csf.service'
Created symlink /etc/systemd/system/multi-user.target.wants/csf.service → /usr/lib/systemd/system/csf.service.
Created symlink /etc/systemd/system/multi-user.target.wants/lfd.service → /usr/lib/systemd/system/lfd.service.
Unit /etc/systemd/system/firewalld.service is masked, ignoring.
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template
units). This means they are not meant to be enabled or disabled using systemctl.

Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's
  .wants/ or .requires/ directory.
• A unit's purpose may be to act as a helper for some other unit which has
  a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer,
  D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some
  instance name specified.
'/etc/csf/csfwebmin.tgz' -> '/usr/local/csf/csfwebmin.tgz'

Installation Completed

检查所需的 iptables 模块是否可用。

$ sudo perl /usr/local/csf/bin/csftest.pl

您应当看到如下输出。

Testing ip_tables/iptable_filter...OK
Testing ipt_LOG...OK
Testing ipt_multiport/xt_multiport...OK
Testing ipt_REJECT...OK
Testing ipt_state/xt_state...OK
Testing ipt_limit/xt_limit...OK
Testing ipt_recent...OK
Testing xt_connlimit...OK
Testing ipt_owner/xt_owner...OK
Testing iptable_nat/ipt_REDIRECT...OK
Testing iptable_nat/ipt_DNAT...OK

RESULT: csf should function on this server

验证 CSF 版本。

$ sudo csf -v
csf: v14.20 (generic)
*WARNING* TESTING mode is enabled - do not forget to disable it in the configuration

步骤 4 - 配置 CSF

CSF 将其配置保存在 /etc/csf/csf.conf 文件中。打开该文件进行编辑。

$ sudo nano /etc/csf/csf.conf

第一步是禁用测试模式。将 TESTING 变量的值从 1 改为 0。

TESTING = "0"

找到 RESTRICT_SYSLOG = "0" 这一行,将其值改为 3。这意味着只有 RESTRICT_SYSLOG_GROUP 的成员才能访问 syslog/rsyslog 文件。RESTRICT_SYSLOG_GROUP 默认包含 root、mysql、rpc、daemon、dbus 以及若干 cPanel 和 DirectAdmin 用户。您可以通过编辑 /etc/csf/csf.syslogusers 文件来添加更多用户。

步骤 5 - 配置端口

CSF 默认保持以下端口开放。

# Allow incoming TCP ports
TCP_IN = "20,21,22,25,53,853,80,110,143,443,465,587,993,995"

# Allow outgoing TCP ports
TCP_OUT = "20,21,22,25,53,853,80,110,113,443,587,993,995"

# Allow incoming UDP ports
UDP_IN = "20,21,53,853,80,443"

# Allow outgoing UDP ports
# To allow outgoing traceroute add 33434:33523 to this list
UDP_OUT = "20,21,53,853,113,123"

使用这些端口的服务包括:

  • 端口 20:FTP 数据传输
  • 端口 21:FTP 控制
  • 端口 22:安全外壳(SSH)
  • 端口 25:简单邮件传输协议(SMTP)
  • 端口 53:域名系统(DNS)
  • 端口 80:超文本传输协议(HTTP)
  • 端口 110:邮局协议 v3(POP3)
  • 端口 113:认证服务/身份识别协议
  • 端口 123:网络时间协议(NTP)
  • 端口 143:互联网消息访问协议(IMAP)
  • 端口 443:基于 SSL/TLS 的超文本传输协议(HTTPS)
  • 端口 465:SSM 的 URL 集合目录(Cisco)
  • 端口 587:电子邮件提交(SMTP)
  • 端口 993:基于 SSL 的互联网消息访问协议(IMAPS)
  • 端口 995:基于 TLS/SSL 的邮局协议 3(POP3S)

如果您不需要所有这些端口都开放,可以移除其中一些以提升安全性。如果您为服务使用 IPv6,则需要按照所示配置 TCP6_IN、TCP6_OUT、UDP6_IN 和 UDP6_OUT 端口。

# Allow incoming IPv6 TCP ports
TCP6_IN = "20,21,22,25,53,853,80,110,143,443,465,587,993,995"

# Allow outgoing IPv6 TCP ports
TCP6_OUT = "20,21,22,25,53,853,80,110,113,443,587,993,995"

# Allow incoming IPv6 UDP ports
UDP6_IN = "20,21,53,853,80,443"

# Allow outgoing IPv6 UDP ports
# To allow outgoing traceroute add 33434:33523 to this list
UDP6_OUT = "20,21,53,853,113,123"

根据您的需求修改端口。

步骤 6 - CSF 其他设置

有许多设置需要配置。让我们来看看其中一些常用的设置。

ICMP_IN - 将此变量设为 1 允许对您的服务器进行 ping 操作,设为 0 则拒绝此类请求。如果您托管公共服务,建议允许 ICMP 请求,以便能够判断您的服务是否可用。

ICMP_IN_LIMIT - 设置单个 IP 地址在指定时间范围内允许的请求数量。建议保持该值不变。

DENY_IP_LIMIT - 限制被 CSF 封禁的 IP 地址数量。如果封禁的 IP 数量超过该数值,CSF 将解封最早的 IP,即 /etc/csf/csf.deny 文件中的第一条记录。将该数值设置得过高可能会拖慢服务器。请根据您的服务器资源选择合适的数量。

DENY_TEMP_IP_LIMIT - 与上面相同,但针对的是临时 IP 地址封禁。

PACKET_FILTER - 过滤无效、不需要以及非法的流量数据包。

CONNLIMIT - 限制单个端口上允许的并发活动连接数。您可以按如下方式设置。

CONNLIMIT = "22;5;443;20"

上面的数值表示,每个 IP 地址在端口 22 上只允许 5 个并发连接,在端口 443 上只允许 20 个并发连接。

PORTFLOOD - 限制在特定时间区间内可以向指定端口建立的新连接数量。您可以按如下方式设置。

PORTFLOOD = "22;tcp;5;250"

如果某个 IP 地址在 250 秒内通过 TCP 协议在端口 22 上建立了超过 5 个连接,上述数值将封禁该 IP 地址。封禁将在 250 秒后自动解除。您可以通过添加逗号来增加更多端口。

PORTFLOOD = "22;tcp;5;250,80;tcp;10;300"

完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。

启动并启用 CSF 和 LFD 服务。

$ sudo systemctl start csf lfd
$ sudo systemctl enable csf lfd

检查 CSF 服务的状态。

$ sudo systemctl status csf
? csf.service - ConfigServer Firewall & Security - csf
     Loaded: loaded (/usr/lib/systemd/system/csf.service; enabled; preset: disabled)
     Active: active (exited) since Tue 2023-12-05 13:57:59 UTC; 2min 7s ago
   Main PID: 11050 (code=exited, status=0/SUCCESS)
        CPU: 1.192s

Dec 05 13:57:59 csf.example.com csf[11050]: ACCEPT  all opt    in * out lo  ::/0  -> ::/0
Dec 05 13:57:59 csf.example.com csf[11050]: LOGDROPOUT  all opt    in * out !lo  ::/0  -> ::/0
Dec 05 13:57:59 csf.example.com csf[11050]: LOGDROPIN  all opt    in !lo out *  ::/0  -> ::/0
Dec 05 13:57:59 csf.example.com csf[11050]: csf: FASTSTART loading DNS (IPv4)
Dec 05 13:57:59 csf.example.com csf[11050]: csf: FASTSTART loading DNS (IPv6)
Dec 05 13:57:59 csf.example.com csf[11050]: LOCALOUTPUT  all opt -- in * out !lo  0.0.0.0/0  -> 0.0.0.0/0
Dec 05 13:57:59 csf.example.com csf[11050]: LOCALINPUT  all opt -- in !lo out *  0.0.0.0/0  -> 0.0.0.0/0
Dec 05 13:57:59 csf.example.com csf[11050]: LOCALOUTPUT  all opt    in * out !lo  ::/0  -> ::/0
Dec 05 13:57:59 csf.example.com csf[11050]: LOCALINPUT  all opt    in !lo out *  ::/0  -> ::/0
Dec 05 13:57:59 csf.example.com systemd[1]: Finished ConfigServer Firewall & Security - csf.

检查 CSF 运行时的开放端口。

$ sudo csf -p
Ports listening for external connections and the executables running behind them:
Port/Proto Open Conn  PID/User             Command Line                            Executable
22/tcp     4/6  2     (863/root)           sshd: /usr/sbin/sshd -D [listener] 0... /usr/sbin/sshd
111/tcp    -/-  -     (1/root)             /usr/lib/systemd/systemd --switched-... /usr/lib/systemd/systemd
111/tcp    -/-  -     (642/rpc)            /usr/bin/rpcbind -w -f                  /usr/bin/rpcbind
111/udp    -/-  -     (1/root)             /usr/lib/systemd/systemd --switched-... /usr/lib/systemd/systemd
111/udp    -/-  -     (642/rpc)            /usr/bin/rpcbind -w -f                  /usr/bin/rpcbind
323/udp    -/-  -     (679/chrony)         /usr/sbin/chronyd -F 2                  /usr/sbin/chronyd

AUTO_UPDATES - 值为 0 表示禁用自动更新。如果您需要自动更新,请将其改为 1。这将创建一个每天运行一次的 cron 任务,用于执行自动更新并重启 csf 和 lfd 服务。

ETH_DEVICE - 默认情况下,CSF 会过滤除回环网卡外所有网卡上的流量。如果您希望规则仅应用于 eth0 网卡,请将其值设为 eth0。

LF_DAEMON - 将其值设为 1 以启用 CSF 的登录失败检测功能。

LF_CSF - 将其值设为 1 以启用 CSF 的自动重启功能。它会每 300 秒执行一次检查。

LF_SELECT - 将其值设为 1 表示,当某个 IP 地址违反 LFD 规则时,将仅封禁该 IP 登录失败所在服务的流量,而不是封禁所有流量。

LF_SSHD - 设置错误 SSH 连接被封禁前的尝试次数。

CT_LIMIT - 限制来自单个 IP 地址到服务器的连接数。如果连接数超过设定值,则该 IP 将被临时封禁。

步骤 7 - 允许和封禁 IP 地址

封禁和允许 IP 地址是防火墙最基本的功能之一。CSF 允许您使用配置文件 csf.deny、csf.allow 和 csf.ignore 来拒绝(黑名单)、允许(白名单)或忽略 IP 地址。

打开 csf.deny 文件进行编辑。

$ sudo nano /etc/csf/csf.deny

被封禁的 IP 地址或地址段需要逐行添加。例如,如果您想封禁 IP 地址 1.2.3.4 以及地址段 2.3.*.*,请按如下方式添加。

1.2.3.4 2.3.0.0/16

完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。

允许访问的 IP 地址需要使用 csf.allow 文件进行配置。即使这些 IP 地址在 csf.deny 文件中被封禁,它们仍会被允许,因此您需要注意这一点。

打开 csf.allow 文件进行编辑。

$ sudo nano /etc/csf/csf.allow

这些 IP 地址的添加方式与封禁文件中的添加方式相同。

被忽略的 IP 地址会被排除在防火墙过滤规则之外。只有将它们列在 csf.deny 文件中时,它们才会被封禁。打开 csf.ignore 文件进行编辑。

$ sudo nano /etc/csf/csf.ignore

完成所有必要的更改后,您需要重启防火墙。使用以下命令来完成。

$ sudo csf -r

步骤 8 - DDoS 攻击防护

让我们来了解 CSF 如何通过实现以下配置来帮助防范分布式拒绝服务(DDoS)攻击。

SYN 洪水防护

这是一种 DDoS 攻击类型,攻击者会向服务器发送大量 SYN 数据包。要启用对此类攻击的防护,请在 /etc/csf/csf.conf 文件中启用以下设置。

SYNFLOOD = "1"
SYNFLOOD_RATE = "100/s"
SYNFLOOD_BURST = "150"

这将启用 SYN 洪水防护,并配置针对入站攻击的速率和突发限制。只有在您正在遭受 SYN 攻击时才应启用这些选项,因为它们会拖慢来自任何 IP 地址的所有新连接。

黑名单

CSF 与各种基于 IP 的黑名单集成,以防止恶意 IP 地址连接到服务器。CSF 已经在 /etc/csf/csf.blocklists 文件中存储了 Spamhaus、Project Honey Pot、BruteForceBlocker、Blocklist.de、Stop Forum Spam 等常用黑名单的配置。打开该文件进行编辑。

$ sudo nano /etc/csf/csf.blocklists

取消以下部分的注释以启用 Spamhaus 黑名单。

# Spamhaus Don't Route Or Peer List (DROP)
# Details: http://www.spamhaus.org/drop/
SPAMDROP|86400|0|http://www.spamhaus.org/drop/drop.txt

# Spamhaus IPv6 Don't Route Or Peer List (DROPv6)
# Details: http://www.spamhaus.org/drop/
SPAMDROPV6|86400|0|https://www.spamhaus.org/drop/dropv6.txt

# Spamhaus Extended DROP List (EDROP)
# Details: http://www.spamhaus.org/drop/
SPAMEDROP|86400|0|http://www.spamhaus.org/drop/edrop.txt

完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。您也可以添加自己的黑名单。添加新列表的格式如下。

NAME|INTERVAL|MAX|URL

NAME - 列表名称,全部使用大写字符,不含空格,最多 25 个字符。

INTERVAL - 下载列表的刷新间隔。最少应为 3600 秒。

MAX - 从该列表中使用的 IP 地址最大数量。值为 0 表示使用所有 IP 地址。

URL - 下载列表的 URL 地址。

按国家屏蔽

CSF 允许您屏蔽来自特定国家的访问。当您希望限制来自以发起 DDoS 攻击而闻名的国家的访问时,这会很有用。CSF 有两种将 IP 地址与国家/地区匹配的方法。默认方法使用 DB-IP、ipdeny.com 和 iptoasn.com 作为数据源。它们是免费的,不需要许可证密钥,但可能不太可靠。如果您需要精确的屏蔽,则需要一个 MaxMind 许可证密钥。MaxMind 也提供免费许可证,您可以使用它。获取许可证密钥后,请在 /etc/csf/csf.conf 文件中配置以下两个设置。

MM_LICENSE_KEY = "XXXXXXXXXXX"
CC_SRC = "1"

完成上述配置后,使用以下配置来屏蔽来自俄罗斯的 IP 地址。

CC_DENY = "RU"

您可以使用以下设置,仅允许来自特定国家的连接。

CC_ALLOW_FILTER = "IN,GB"

此设置仅允许来自印度和英国(UK)的连接。完成后保存并关闭文件。

完成配置后重启防火墙。

$ sudo csf -r

还有其他防范 DDoS 攻击的方法,例如端口洪水(Port Flooding)和连接数限制,我们在步骤 6 中已经讨论过。

步骤 9 - 常用 CSF 命令

启用并启动 CSF。

$ sudo csf -e

禁用 CSF。

$ sudo csf -x

启动防火墙规则。

$ sudo csf -s

刷新/停止防火墙规则。

$ sudo csf -f

重启防火墙。

$ sudo csf -r

将 IP 地址添加到临时封禁列表。(/var/lib/csf/csf.tempban)

$ sudo csf -td 1.2.3.4

从临时封禁列表中移除该 IP 地址。

$ sudo csf -tr 1.2.3.4

删除临时条目中的所有 IP 地址。

$ sudo csf -tf

将 IP 地址添加到拒绝列表。

$ sudo csf -d 1.2.3.4

从拒绝列表中移除该 IP 地址。

$ sudo csf -dr 1.2.3.4

移除拒绝列表中的所有 IP 地址。

$ sudo csf -dr

允许一个 IP 地址。

$ sudo csf -a 1.2.3.4

从允许列表中移除该 IP 地址。

$ sudo csf -ar 1.2.3.4

在 iptables 和 ip6tables 规则中搜索 IP 地址、CIDR 和端口号。

$ sudo csf -g 1.2.3.4
$ sudo csf -g 80

步骤 10 - 启用 CSF GUI

CSF 附带一个用于管理防火墙的网页界面。它默认是禁用的。在启用 GUI 之前,我们需要安装更多 Perl 模块。

$ sudo dnf install perl-IO-Socket-SSL.noarch perl-Net-SSLeay perl-IO-Socket-INET6 perl-Socket6 -y

打开 CSF 配置文件。

$ sudo nano /etc/csf/csf.conf

找到 UI = "0" 这一行,并按如下方式修改其值。

UI = "1"

修改网页面板可访问的端口。CSF 默认使用端口 6666,但 Chrome 浏览器会将其标记为不安全端口而阻止访问。因此,我们需要将其值改为其他端口。请选择任意大于 1024 的端口。在本教程中,我们将使用端口 1037。

UI_PORT = "1037"

使用以下变量来仅允许选定的 IP 地址绑定到网页面板。将其留空则表示绑定到服务器上的所有 IP 地址。

UI_IP = "1.2.3.4"

配置网页面板的凭据。

UI_USER = "username"
UI_PASS = "password"

默认情况下,CSF 仅允许来自 /etc/csf/ui/ui.allow 文件中列出的 IP 地址访问网页面板。如果您希望它可以从所有 IP 地址访问,请将变量 UI_ALLOW 设为 0。

UI_ALLOW = "0"

完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。

类似地,被封禁的 IP 地址需要添加到 /etc/csf/ui/ui.ban 文件中。

CSF 网页面板使用自签名证书。您也可以为其使用 Let's Encrypt SSL 证书。

步骤 11 - 安装并配置 Let's Encrypt SSL

我们需要安装 Certbot 来生成 SSL 证书。我们将使用 Snapd 软件包安装器来完成。由于 Rocky Linux 默认未附带它,因此需要安装 Snapd 安装器。它需要 EPEL(Extra Packages for Enterprise Linux)软件仓库才能工作。但由于我们在步骤 2 中已经安装过,因此可以直接继续。

安装 Snapd。

$ sudo dnf install -y snapd

启用并启动 Snap 服务。

$ sudo systemctl enable snapd --now

安装 Snap core 软件包,并确保您的 Snapd 版本是最新的。

$ sudo snap install core && sudo snap refresh core

创建 Snapd 工作所需的符号链接。

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

安装 Certbot。

$ sudo snap install --classic certbot

使用以下命令创建指向 /usr/bin 目录的符号链接,以确保可以运行 Certbot 命令。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

验证 Certbot 是否正常工作。

$ certbot --version
certbot 2.7.4

运行以下命令来生成 SSL 证书。

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m 
[email protected]
 -d csf.example.com

上述命令会将证书下载到您服务器上的 /etc/letsencrypt/live/csf.example.com 目录。

重命名旧的自签名证书。

$ sudo mv /etc/csf/ui/server.crt /etc/csf/ui/server.crt.old
$ sudo mv /etc/csf/ui/server.key /etc/csf/ui/server.key.old

将生成的 SSL 证书复制到 /etc/csf/ui 目录。

$ sudo cp /etc/letsencrypt/live/csf.example.com/fullchain.pem /etc/csf/ui/server.crt
$ sudo cp /etc/letsencrypt/live/csf.example.com/privkey.pem /etc/csf/ui/server.key

重启 CSF 和 LFD 服务。

$ sudo systemctl restart csf lfd

还有一件事我们需要配置。SSL 证书每 90 天会自动续期,这意味着您需要手动复制证书。不过我们可以将其自动化。

创建文件 /etc/csf/certcopy.sh,用于在每次续期后复制证书,并打开它进行编辑。

$ sudo nano /etc/csf/certcopy.sh

在其中粘贴以下代码。

#!/bin/sh
cp -f /etc/letsencrypt/live/csf.example.com/fullchain.pem /etc/csf/ui/server.crt
cp -f /etc/letsencrypt/live/csf.example.com/privkey.pem /etc/csf/ui/server.key

完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。然后将该文件设为可执行。

$ sudo chmod +x /etc/csf/certcopy.sh

打开文件 /etc/letsencrypt/renewal/csf.example.com.conf 进行编辑。

$ sudo nano /etc/letsencrypt/renewal/csf.example.com.conf

在文件底部添加以下一行。

post_hook = /etc/csf/certcopy.sh

完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。post_hook 选项会在每次续期后运行 certcopy.sh 脚本,从而无需手动复制证书。

检查 Certbot 续期调度服务。

$ sudo systemctl list-timers

您会看到 snap.certbot.renew.service 是计划运行的服务之一。

NEXT                        LEFT         LAST                        PASSED     UNIT                      ACTIVATES     
---------------------------------------------------------------------------------------------------------------------------               
Wed 2023-12-06 07:23:57 UTC 18min left Wed 2023-12-06 06:04:46 UTC 1h 0min ago dnf-makecache.timer          dnf-makecache.service
Wed 2023-12-06 07:24:15 UTC 40min left Wed 2023-12-06 00:00:01 UTC 6h ago      logrotate.timer              logrotate.service
Wed 2023-12-06 18:39:00 UTC 10h left   Wed 2023-12-06 03:25:07 UTC 2h 4min ago snap.certbot.renew.timer     snap.certbot.renew.service

对流程进行一次预演(dry run),以检查 SSL 续期是否正常工作。

$ sudo certbot renew --dry-run

如果没有看到错误,说明一切就绪。您的证书将自动续期,证书也会被复制,您可以通过查看 /etc/csf/ui 目录的列表来确认。

$ sudo ls /etc/csf/ui -al
drw-------. 3 root root  130 Dec  6 05:57 .
drw-------. 4 root root 4096 Dec  6 06:09 ..
drw-------. 3 root root 4096 Dec  6 00:06 images
-rw-r--r--. 1 root root 5242 Dec  6 06:09 server.crt
-rw-------. 1 root root 1220 Jun 17  2020 server.crt.old
-rw-------. 1 root root  241 Dec  6 06:09 server.key
-rw-------. 1 root root 1704 Jun 17  2020 server.key.old
-rw-------. 1 root root   15 Dec  5 23:34 ui.allow
-rw-------. 1 root root    0 Feb  1  2013 ui.ban

步骤 12 - 访问 CSF 网页面板

访问 URL https://csf.example.com:1037,您将看到如下登录页面。

在 Rocky Linux 9 上安装与配置 CSF 防火墙(ConfigServer Security & Firewall)

输入您的凭据并点击回车键登录,您将看到如下页面。

在 Rocky Linux 9 上安装与配置 CSF 防火墙(ConfigServer Security & Firewall)

它还提供了移动视图,您可以使用“移动视图”按钮进行切换。

在 Rocky Linux 9 上安装与配置 CSF 防火墙(ConfigServer Security & Firewall)

该网页面板允许您配置所有防火墙设置。此网页面板与其他控制面板集成良好。

步骤 13 - 卸载 CSF

如果出于某些原因您想移除 CSF,可以运行以下命令来执行卸载脚本。

$ sudo sh /etc/csf/uninstall.sh

启用并启动 Firewalld 防火墙。

$ sudo systemctl enable firewalld --now

结论

本教程到此结束,内容涵盖在 Rocky Linux 9 服务器上安装和配置 Config Server Firewall(CSF)。如果您有任何问题,请在下方评论中留言。