如何在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