Skip to main content

如何在Ubuntu中安装并搭建配置服务器防火墙(CSF)

作者 Lassi Ruonavaara

导语

配置服务器防火墙(Config Server Firewall),或CSF,是一款免费的高级防火墙,适用于大部分Linux发行版和基于Linux的VPS。除了防火墙的基本功能过滤数据包以外,CSF还包含其它功能,比如对登录、入侵和flood攻击的检测。CSF中包含cPanel,DirectAdmin和Webmin的UI集成,但本教程仅涵盖CSF在命令行层面的使用。CSF能识别许多攻击,例如端口扫描、SYN泛洪攻击和对许多服务商的蛮力攻击。通过配置,它能暂时阻挡被检测到正在攻击云端服务器的客户端。

在ConfigServer的官网上可以找到所有支持的操作系统和功能列表。

本教程适用于基于VPS的Debian,如Debian和Ubuntu。并需要先以root身份登录来确保所有命令都以root权限执行。如果安装了sudo,也可以用以下命令启动root shell,再在shell中执行命令:

sudo su

注:本教程介绍的是IPv4安保。在Linux中,IPv4与IPv6的安保是分别维护的。例如,“iptables”仅维护IPv4地址的防火墙规则,而IPv6有一个它的对应版“ip6tables”,用来维护IPv6网络地址的防火墙规则。

如果您的VPS配置为IPv6,请使用适当的工具保护IPv4和IPv6网络接口。

功能

配置服务器防火墙提供多种VPS保护。

失败登录的检查

CSF会定期检查日志中失败的登录尝试,并能识别大多数未经授权登录云服务器的尝试。您可以在配置文件中自定义CSF对此采取的措施,以及触发措施所需的尝试次数。

该功能支持以下程序:

  • Courier imap, Dovecot, uw-imap, Kerio
  • openSSH
  • cPanel, WHM, Webmail(仅限cPanel服务器)
  • Pure-ftpd, vsftpd, Proftpd
  • 密码保护的网络页面(htpasswd)
  • Mod_security中的失败尝试
  • Suhosin中的失败尝试
  • Exim的SMTP身份验证

除此之外,还可以使用正则表达式匹配算法自定义登录文件。如果程序能记录失败的登录尝试,并在特定次数后阻止该用户,这将会很有帮助。

进程追踪

通过配置,CSF可以通过进程追踪来检测可疑进程和网络端口,并在检测到后给管理员发送邮件。这可以帮助您识别并防止VPS上可能存在的漏洞。

目录监控

目录监控功能会检查/temp及相关文件夹中是否出现恶意脚本,并会在检测到后给系统管理员发送邮件。

信使服务

如果启用了信使服务,CSF会给被封锁的客户端发送一个含有更多信息的消息。这个功能有利也有弊。一方面,它可以为用户提供更多信息,减少用户登录失败的挫败感。另一方面,提供更多信息可能会使攻击您的VPS变得更容易。

端口泛洪攻击防护

此设置用来保护端口免受泛洪攻击,如DoS(Denial of Service)攻击。您可以指定某个时间段内每个端口允许的连接数量。推荐开启这个功能,因为它能阻止攻击者强制关闭您的服务。限制数量也应谨慎设置,因为过于严格的设置可能会使普通客户端也无法连接,而过于宽松的设置可能无法阻止攻击者的泛洪攻击。

端口碰撞

端口碰撞功能使客户端即使没有打开的端口也能连接服务器。只有当客户端成功完成一个端口碰撞序列后,才能连接至主端口。如果您的服务仅提供给有限的受众,这个功能将会很有用。

连接限制保护

此功能可以限制单个IP地址与每个端口之间激活的连接数量。合理配置后,可以用来阻挡对服务器的滥用,例如DoS攻击。

端口/IP地址重定向

通过配置,CSF可以将一个IP/端口的连接重定向到另一个IP/端口。注:重定向后,客户端的源地址会是服务器的IP地址。这与网络地址转换(NAT)并不等同。

UI集成

除了命令行交互界面以外,CSF还为cPanel和Webmin提供了用户集成。如果您对Linux命令行不太熟悉,这个功能也许会很有帮助。

IP阻挡列表

开启此功能后,CSF会自动从您定义的来源下载需阻挡的IP地址列表。

安装配置服务器防火墙

第一步:下载

目前,Debian和Ubuntu储存库中并没有CSF,需从ConfigServer官网上下载。

wget http://download.configserver.com/csf.tgz

这条命令将会在当前工作目录下下载CSF

第二步:解压

因为下载的文件使tar压缩包,所以需要解压后才能使用。

tar -xzf csf.tgz

第三步:安装

如果您正在使用其它防火墙配置脚本,例如UFW,您需要先禁用它。iptables规则会被自动删除。

可以用以下命令禁用UFW:

ufw disable

现在可以执行CSF安装脚本了:

cd csf
sh install.sh

如此,防火墙已安装完毕,但还应检查所需的iptables模块是否可用。

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

如果没有严重报错,说明防火墙可以正常工作了。

注:如果可以,您的IP地址会被添加至白名单中。此外,无论是否为自定义端口,SSH端口都会自动打开。防火墙自带配置还会启用测试模式,这意味着iptables规则会在CSF启动五分钟后自动删除。当您的配置开始生效时,就应立刻禁用这个功能,而您也不会被锁定。

基础配置

通过编辑配置文件csf.conf in /etc/csf可以配置CSF:

nano /etc/csf/csf.conf

通过以下命令可以应用修改:

csf -r

第一步:端口配置

VPS的接口越少,您的服务器就越安全。但并非所有端口都可以关闭,毕竟客户端还需要使用您提供的服务。

默认打开的端口如下:

TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995"
TCP_OUT = "20,21,22,25,53,80,110,113,443"
UDP_IN = "20,21,53"
UDP_OUT = "20,21,53,113,123"

使用端口的服务如下:

  • 端口20:FTP数据传输
  • 端口21:FTP控制
  • 端口22:SSH (Secure shell)
  • 端口25:SMTP (Simple mail transfer protocol)
  • 端口53:DNS (Domain name system)
  • 端口80:HTTP (Hypertext transfer protocol)
  • 端口110:POP3 (Post office protocol v3)
  • 端口113:身份验证服务/识别协议
  • 端口123:NTP (Network time protocol)
  • 端口143:IMAP (Internet message access protocol)
  • 端口443:HTTPS (Hypertext transfer protocol over SSL/TLS)
  • 端口465:SSM的URL集合目录(Cisco)
  • 端口587:邮件信息提交(SMTP)
  • 端口993:IMAPS (Internet message access protocol over SSL)
  • 端口995:POP3S (Post office protocol 3 over TLS/SSL)

您可能不需要使用全部这些服务,因此可以关闭未使用的端口。对此建议先关闭所有端口(从列表中删除端口号),再添加需要的端口。

以下是一些服务和使用它们时对应的端口集:

任何服务器:

TCP_IN: 22,53 TCP_OUT: 22,53,80,113,443 UPD_IN: 53 UPD_OUT: 53,113,123

Apache:

TCP_IN: 80,443

FTP服务器:

TCP_IN: 20,21 TCP_OUT: 20,21 UPD_IN: 20,21 UPD_OUT:20,21

邮件服务器:

TCP_IN: 25,110,143,587,993,995 TCP_OUT: 25,110

MySQL服务器(如果需要远程接入)

TCP_IN: 3306 TCP_OUT: 3306

注意:如果您的服务使用IPv6,您还需像之前配置IPv4端口一样配置TCP6_IN, TCP6_OUT, UPD6_IN和UPD6_OUT

您可以在维基百科上找到TCP和UDP端口的完整列表,并确保所有正在使用的服务对应的端口都已打开。

第二步:附加设置

CSF的配置文件中有大量不同选项,下面介绍一些最为常用的设置:

ICMP_IN 设置为1时,外界可向服务器发送ping请求,而将ICMP_IN设置为0将会拒收这些请求。如果您需要运行公共服务,ICMP请求可用于确认您的服务是否可用,所以建议允许这些请求。

ICMP_IN_LIMIT 用于设置指定时间内同一IP地址可以发送的ICMP(ping)请求数。通常不需要更改默认值(1/s)。

DENY_IP_LIMIT 用于设置CSF追踪的黑名单IP地址数量。建议限制这些IP的数量,因为黑名单太多可能会降低服务器性能。

DENY_TEMP_IP_LIMIT 与上一条作用相同,但用于暂时的IP黑名单。

PACKET_FILTER 用于过滤无效、不需要以及非法的数据包。

SYNFLOOD, SUNFLOOD_RATE和SYNFLOOD_BURST 提供了对SYN泛洪攻击的防护。但它们会减缓所有连接的初始化速度,因此应当只在您确认服务器受到攻击时才启动。

CONNLIMIT 用于限制端口上同时激活的连接数量。示例如下:

值为:

22;5;443;20

这代表端口22最多允许5个同时连接,而端口443最多允许20个同时连接。

PORTFLOOD则用于限制单个时间段中特定端口可以建立的新连接数。示例如下:

值为:

22;tcp;5;250

即如果一IP地址在250秒内在端口22上使用TCP协议建立了超过5个连接,这个地址就会暂时被阻挡。客户端发送最后一个数据包到端口的250秒后,这个阻挡才会被移除。您可以用逗号来添加更多端口,如下所示:

port1;protocol1;connection_count1;time1,port2;protocol2;connection_count2;time2

更多设置

除了本教程中介绍过的,CSF还提供许多其它设置。通常,这些设置的默认值就很合理,几乎适用于所有服务器。这些默认设置都用于防御泛洪攻击、端口扫描与未经授权的访问。

如果您需要更精细地自定义一些设置,可以阅读/etc/csf/csf.conf文件中的注释,并作出相应修改。

第三步:应用修改

在更改csf.conf中的设置后,应保存文件并重启CSF来使改动生效。

配置完成后,按下Ctrl + X键关闭文件。当系统询问是否需要保存更改时,按Y键选择是。

在此之后,可以通过以下命令重启CSF来应用更改:

csf -r

如果一切如期运行,而且您还可以访问服务器,可以再次打开配置文件:

nano /etc/csf/csf.conf

然后将配置文件开头的TESTING设置改为0,如下所示:

TESTING = "0"

保存文件并用以下命令应用设置:

csf -r

阻挡与允许IP地址连接

防火墙最基本的功能之一就是阻挡特定的IP地址连接。通过配置文件csf.deny可以阻挡(黑名单)IP地址连接,配置文件csf.allow可以允许(白名单)IP地址连接,而配置文件csf.ignore可以忽略IP地址。

阻挡IP地址连接

如果需要阻挡单个或多个IP地址连接服务器,首先打开csf.deny

nano /etc/csf/csf.deny

被阻挡的IP地址都在csf.deny文件的一行中。例如,如果想要阻挡单个IP 1.2.3.4和IP范围2.3. *. *,应在文件中添加以下一行:

1.2.3.4 2.3.0.0/16

IP范围由CIDR表示法表示。

允许IP地址连接

如果您不想单个或多个IP地址连接服务器时经过任何过滤或阻拦,可以将它们添加至csf.allow文件中。值得注意的是,只要某个IP地址在csf.allow文件中,即使它同时出现在csf.deny中,它仍会被允许连接至服务器。

允许IP地址连接服务器和阻挡它们连接类似,唯一不同的是编辑的文件应是/etc/csf/csf.allow,而不是csf.deny。

nano /etc/csf/csf.allow

忽略IP地址

CSF还支持在防火墙过滤时忽略IP地址。在csf.ignore文件中的IP地址将绕过防火墙的过滤网,只有同时出现在csf.deny文件中的IP地址才会被阻挡。

nano /etc/csf/csf.ignore

要让以上文件中的改动生效,需在编辑完成后用以下命令重启文件:

csf -r