使用TCP包装器限制对Linux服务器的访问
TCP Wrapper是基于主机的开源ACL(访问控制列表)系统,用于根据主机名,IP地址,网络地址等来限制TCP网络服务。
它决定应允许哪个主机访问特定的网络服务。
TCP Wrapper是由荷兰程序员和物理学家Wietse Zweitze Venema于1990年在埃因霍温科技大学开发的。
他一直维护到1995年,然后在2001年通过BSD许可证发布了它。
在这个简短的教程中,我将解释如何使用TCP Wrappers限制对Linux服务器的访问。
请注意,TCP Wrapper不能完全替代正确配置的防火墙。
它只是增强Linux服务器安全性的宝贵补充。
建议将其与完全配置的防火墙以及其他安全机制和工具结合使用。
安装TCP包装器
大多数Linux操作系统的官方存储库中都提供了TCP Wrappers。
根据我们使用的Linux发行版,可以如下所示进行安装。
在基于Arch的系统上:
$sudo pacman -S tcp_wrappers
在基于YUM的系统上:
$sudo yum install tcp_wrappers
在基于APT的系统上:
$sudo apt-get install tcp_wrappers
在SUSE/openSUSE系统上:
$sudo zypper in tcp_wrappers
使用TCP包装器限制对Linux服务器的访问
配置
TCP Wrappers借助两个配置文件来实现访问控制:/etc/hosts.allow和/etc/hosts.deny。
这两个访问控制列表文件决定是否允许特定的客户端访问Linux服务器。
/etc/hosts.allow文件
该文件包含允许或者不允许的主机或者网络的列表。
这意味着我们可以通过在此文件中定义访问规则来允许或者拒绝与网络服务的连接。
/etc/hosts.deny文件
该文件包含不允许访问Linux服务器的主机或者网络的列表。
该文件中的访问规则也可以在/etc/hosts.allow中使用'deny'选项设置。
定义访问规则的典型语法为:
daemon_list : client_list : option : option ...
其中:
- daemon_list-网络服务的名称,例如SSH,FTP,Portmap等。
- clients_list-用逗号分隔的有效主机名,IP地址或者网络地址的列表。
- options-一个可选动作,指定匹配规则时要执行的操作。
这两个文件的语法相同。
要记住的规则
使用TCP包装程序之前,我们需要了解以下重要规则。
请注意,TCP包装程序仅查询这两个文件(hosts.allow和hosts.deny)。
- 首先应用/etc/hosts.allow文件中的访问规则。它们优先于/etc/hosts.deny文件中的规则。因此,如果在/etc/hosts.allow文件中允许访问服务,则在/etc/hosts.deny中拒绝访问该服务的规则将被忽略。
- 两个文件(hosts.allow和hosts.deny)中每个服务仅允许一个规则。
- 规则的顺序非常重要。仅考虑给定服务的第一个匹配规则。这两个文件都相同。
- 如果两个文件中都没有针对服务的匹配规则,或者两个文件都不存在,则将向所有远程主机授予对该服务的访问权限。
- 这两个文件中的任何更改都将立即生效,而无需重新启动网络服务。
推荐的保护服务器安全的方法
通常,保护Linux服务器安全的最佳实践是阻止所有传入连接,并仅允许几个特定的主机或者网络。
为此,请编辑/etc/hosts.deny文件:
$sudo vi /etc/hosts.deny
添加以下行。
该线路拒绝与所有服务和所有网络的连接。
ALL: ALL
然后,编辑/etc/hosts.allow文件:
$sudo vi /etc/hosts.allow
并允许我们选择特定的主机或者网络。
sshd: 192.168.43.192 192.168.43.193
另外,我们可以指定有效的主机名而不是IP地址,如下所示。
sshd: server1.theitroad.lan server2.ostechnx.lan
另外,我们可以通过在/etc/hosts.allow文件本身中定义所有规则(允许和拒绝)来执行相同的操作。
编辑/etc/hosts.allow文件并添加以下行。
sshd: 192.168.43.192 192.168.43.193 sshd: ALL: DENY
我们无需在/etc/hosts.deny文件中指定任何规则。
根据上述规则,除两个主机192.168.43.192、192.168.43.193外,所有主机的所有传入连接都将被拒绝。
现在,尝试从上述主机以外的任何主机通过SSH到Linux服务器,我们将收到以下错误。
ssh_exchange_identification: read: Connection reset by peer
我们可以从Linux服务器的日志文件中对此进行验证,如下所示。
$cat /var/log/secure
输出示例:
Jun 16 19:40:17 server sshd[15782]: refused connect from 192.168.43.150 (192.168.43.150)
同样,我们可以在/etc/hosts.allow文件中为其他服务(例如vsftpd)定义规则,如下所示。
vsftpd: 192.168.43.192 vsftpd: ALL: DENY
同样,我们不需要在/etc/hosts.deny文件中定义任何规则。
根据上述规则,允许IP地址为192.168.43.192的远程主机通过FTP访问Linux服务器。
所有其他主机将被拒绝。
另外,我们可以在/etc/hosts.allow文件中以不同的格式定义访问规则,如下所示。
sshd: 192.168.43.192 #Allow a single host for SSH service sshd: 192.168.43.0/255.255.255.0 #Allow a /24 prefix for SSH vsftpd: 192.168.43.192 #Allow a single host for FTP vsftpd: 192.168.43.0/255.255.255.0 #Allow a /24 prefix for FTP vsftpd: server1.theitroad.lan #Allow a single host for FTP
允许除特定主机之外的所有主机
我们可以允许来自所有主机的传入连接,但不能允许来自特定主机的传入连接。
例如,要允许来自192.168.43子网中所有主机的传入连接,但不允许来自主机192.168.43.192的传入连接,请在/etc/hosts.allow文件中添加以下行。
ALL: 192.168.43. EXCEPT 192.168.43.192
在上述情况下,我们无需在/etc/hosts.deny文件中添加任何规则。
或者,我们可以指定主机名而不是IP地址,如下所示。
ALL: .theitroad.lan EXCEPT badhost.theitroad.lan
有关更多详细信息,请参见手册页。
$man tcpd