本页内容
- 准备工作
- 步骤 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,您将看到如下登录页面。

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

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

该网页面板允许您配置所有防火墙设置。此网页面板与其他控制面板集成良好。
步骤 13 - 卸载 CSF
如果出于某些原因您想移除 CSF,可以运行以下命令来执行卸载脚本。
$ sudo sh /etc/csf/uninstall.sh
启用并启动 Firewalld 防火墙。
$ sudo systemctl enable firewalld --now
结论
本教程到此结束,内容涵盖在 Rocky Linux 9 服务器上安装和配置 Config Server Firewall(CSF)。如果您有任何问题,请在下方评论中留言。