对于之前的Linux发行版来说,其防火墙管理工具包 括 Iptables、IP6tables以 及ebtables等。 在Linux7中则提供了名为Firewalld的管理工具,其包含在Firewalld软件包中。因为普通用户无法直接操作内核空间的Netfilter组件,所以需要使用以上工具对其进行管理。
因 为Firewalld是Linux7默认的管理工具,为了防止和Iptables产生冲突,可以编写一个简单的脚本,包含“#!/bin/bash”、“for SERVICE in iptables ip6tables ebtables”、“systemctl mask ${SERVICE}.service”、“done”等行,执行“chmod 755 xxx.sh”、“./xxx.sh”命令,执行该脚本,其名称假设为“xxx.sh”,就可以禁用之前的管理工具。
Linux7支 持Trusted、Home、Internal、Work、Public、External、DMZ、Block、Drop等区域。区域定义了绑定的网络连接,接口以及源地址的可信程度。区域是服务、端口、协议、IP伪装、端口/报文转发、ICMP过滤以及富规则的组合,区域可以绑定到接口以及源地址,区域其实就是一组规则的集合。其配置方法有三种,一是直接编辑配置文件,配置文件保存在“etc/firewalld”目录,其中包含“firewalld.conf”主配置文件,名为“services”的服务目录,名为“zones”的区域目录等。二是使用图形界面工具firewall-config,当运行该命令后,在区域列表中显示所有的区域名称,Public是默认区域。三是使用命令行工具firewall-cmd,例如执行“firewall-cmd --getzones”命令,显示所有的区域。 执 行“firewall-cmd--get-default-zones” 命令,查看默认的区域。
对于trusted区域来说,允许所有进来的流量。例如,在本机上安装了HTTPD服务,可以提供Web访问服务。
但是在防火墙保护下,默认状态外界是无法访问的。执行“firewall-cmd --getactive-zones”命令,显示当前的活动区域为Public。Public区域会拒绝进入的流量,除非和出去的流量相关联。
当然,对于SSH、dhcpv6-client等预先定义的服务来说,是允许连接的。执行“firewall-cmd --setdefault-zones=trusted”命令,将默认区域设置为trusted。这样,外界就可以访问本机的Web服务了。
对应的,执行“firewallcmd --set-defaultzones=block”命令,将当前区域设置为Block,那么将拦截所有进入的流量,除非和出去的流量相关联。这比Public区域要严格。
注意,这种拒绝依然会返回错误信息。例如对于ping探测来说,会被Block区域拦截,但是会给探测者返回“无法访问目标主机”的错误信息。对于Drop区域来说,会丢弃所有进入的流量。除非和出去的流量相关联。但是这种拒绝不会返回任何错误信息。当设置为Drop后,如果希望其允许SSH连接进入的话,可以执行“firewall-cmd --addservice=ssh”命令,将SSH服务添加到当前区域。
执 行“firewal-cmd--list-all”命令,显示当前区域的所有规则。当然,执行“firewal-cmd --listall-zone=public”命令,可以查看指定区域(这里为Public)的所有规则。执行“firewall-cmd --list-allzone”命令,可以查看所有区域的规则。除了按需开放服务外,也可以灵活的开启端口。
例如对于FTP服务来说,既可以执行“firewall-cmd--add-service=ftp”命令,也可以执行“firewall-cmd--add-port=21/tcp”命令,来开放FTP服务。当然,这些服务必须预先设置好。执行“firewall-cmd --getservices”命令,可以显示一些预先的好的服务。进入“/usr/lib/firewalld/services”目录,在其中显示所有预先定义的服务的配置文件(后缀为“.xml”)。
例如执行“vim samba.xml”命令,可以查看与Samba服务相关的定义信息,在其中显示与其关联的需要开放的端口信息(例如UDP 137/138/138,TCP 445 等)。对 应 的,执 行“firewallcmd --remove-service=ftp”或 者“firewall-cmd--remove-port=21/tcp”命令,可以禁止FTP服务通过防火墙。
注 意,对 于“Drop”区域来说,其规则中添加的“Source”地址是被拒绝的,但是添加的“service”服务以及“Port”端口是允许开放的。在当前区域为“Drop”的情况下,执行“firewall-cmd --addsource=172.16.1.0/24”命令,则拒绝指定IP范围内的网络连接通过防火墙。执行“firewall-cmd --addsource=172.16.1.100/32”命令,对于地址为“172.16.10100”的主机来说,是无法通过防火墙进行连接的。
如果想禁止多个地址,连续执行上述命令即可,例如继续执行“firewallcmd --add-source=172.16.1.109/32”命 令,可 以 将IP为“172.16.10.100” 和“172.16.1.109”的主机拒之门外。执行“firewallcmd --set-defaultzones=public”命令,将当前区域设置为“Public”。执行“firewal-cmd --listall”命令,显示该区域的所有规则。执行“firewalcmd --addl-service=http”命令,允许外界访问本机的Web服务。执行“firewalcmd --permanent-addservice=ftp”和“firewallcmd --reload”命令,可以添加永久性的规则,允许外界访问本机的FTP服务。
这和之前的规则不同,之前的规则在系统重启后会消失,而本规则不会出现这种情况。
执 行“f i r e w a lc m d --c h a n g einterface=enoxxxxxxxx -zone=trusted”命令,可以将指定的网络接口(该接口当前属于“Public”区域)添加到“trusted”区域。之后执行“firewall-cmd --getactive-zones”命令,可以看到当前活动区域由“Public”变成了“trusted”。这就说明,活动区域必须和特定网络接口相关联。
例如对于某防火墙主机来说,配置了三块网卡,分别连接内网、外网和DMZ区域,对于内网来说,一般设置为Trusted区域,这样该区域就必须和特定的网卡关联方可。在同一时刻可以存在多个活动区域。
对于防火墙来说,规则的制定是极为重要的。防火墙会首先检测数据包的源地址,如果其匹配区域中的源规则,就会被该区域路由。之后防火墙会根据数据包中的进入接口检查匹配的区域,并由匹配的区域进行处理。最后才根据默认区域的规则,对数据包进行检测。
除了区域和服务之外,FireWalld同时也提供了“Direct rules”(直接规则)和“Rich Rules”(富规则)这两个选项。
前者主要用于使服务和应用程序能够增加规则,可以对服务和应用程序进行有效控制。相对于富规则来说,其灵活性较差难以管理,一般很少使用其对防火墙进行管理和控制。富规则提供了更为复杂和精细的配置,其语法相对来说比较复杂。能够对数据包的源地址,目标地址进行过滤,针对服务、端口、协议、ICMP 拦截、伪装、端口转发等动作进行控制,对于流量可以进行更加精细的管控,并且可以将流量信息记录到日志和审计中,根据具体情况可以执行接受,拒绝和丢弃等操作。
例如执行“firewallc m d --p e r m a n e n t--zone=classroom -add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'”命令,对于自定义 区 域“classroom” 增加一条富规则,作用是针对IPv4流量进行控制,拒绝源地址为192.168.0.11的连接。执行“firewallcmd --reload”,“firewallcmd --list-rich-rules-zone=xxx”命 令,列 出“xxx”区域中的所有的富规则。执行firewall-cmd--remove-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'”命令,可以移除指定的富规则。
对应的,执行执行firewall-cmd --permanent--remove-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'”命令,可以永久的移除指定的富规则。
执 行“firewall-cmd--add-rich-rule='rule service name=ftp limit value=2/m accept'”命令,对于当前区域增加一条富规则,作用是针对FTP连接进行控制,只允许在每分钟内接受两个新连接。执行“firewall-cmd --permanent--add-rich-rule='rule protocol name=esp drop'”命令,对于当前区域增加一条富规则,作用是禁止IPSec中的ESP协议进行连接。
执 行“firewall-cmd--permanent --zone=xxx-add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port=7900-8000 protocol=tcp accept'”命令,对于区域“xxx”增加一条富规则,作用是针对IPv4流量进行控制,允许源地址为192.168.1.0/24,端口来自7900到8000的TCP连接通过防火墙。
为了便于监控流量信息,还可以将其记录到日志中。例如执行“firewall-cmd--permanent --zone=xxx-add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept'”命令,表示针对区域“xxx”添加一条富规则,将服务名为“ssh”的流量放行,并将其记录到日志中,其自定义前缀为“ssh”,等级为“notice”,记录的速率为每分钟三条。日志的级别包括emerg(恐慌)/alert(报警)/crit(紧急)/error(错误)/warning(警 告)/notice(提醒)/info(正常信息)/debug(调试)等。执行“grep ssh /var/log/message”命令,就可以检索到这些日志信息。
执 行“firewall-cmd--add-rich-rule='rule family=ipv6 source address="2001:db8::/64"service name="dns" audit limt value="1/h" reject'-timeout=300”命 令,可以为当前区域添加一条富规则,作用是针对IPv6流量进行控制,拒绝源地址为“2001:db8::/64”,服务名为“dns”的流量,并对其进行审计,速率为每小时处理一条消息,该规则超时时间为300毫秒。
当安装了HTTPD之后,执 行“systemctl start https” 命 令,启 动Web服 务。 执 行“firewallc m d --p e r m a n e n t--zone=public --addr i c h-r u l e='r u l e family=ipv4 source address=172.16.1.0/24 service name=http log p r e f i x="N E W H T T P"level="notice" limit value="3/s" accept'”命令,添加一条富规则,对源地址为172.16.1.0/24,服务名为“http”的连接进行记录,前日志前缀为“NEW HTTP”,速率为每秒3条,对这样的连接放行。
执 行“firewall-cmd--reload”命令进行加载,执行“tail -f /var/log/messages”命令,监视日志的变化情况。
在Linux 7的防火墙机制中,提供了地址伪装和端口转发功能。对于端口转发,实际分为SNAT和DNAT两部分。
对于前者来说,可以实现源地址转换,常用于内网用户共享上网。对于后者来说,可以实现目标地址转换,常用来实现端口的映射发布内网服务器,允许外界用户进行访问。
例如,当内网中的主机需要访问外网中的某台Web主机的话,就需要在防火墙上对内网地址进行伪装,将其伪装成外网地址,然后才可以实现上述访问要求。
在防火墙主机上至少需要安装两块网卡,分别连接内网和外网。执行“firewall-cmd -listall”命令,在默认情况下当前区域的规则列表中的“masquerade:”栏 中 显示“no”,说明伪装并没有打开。执行“firewall-cmd--permanent --zone=public-add-masquerade”命令,为Public区域添加伪装。
执 行“firewall-cmd--reload”和“firewall-cmd-list-all”命令,显示伪装功能已经打开。是因为在上面的例子中,已经为Public区域设置了相应的富规则,允许172.16.1.0/24网段的主机通过防火墙来访问外网,而且将连接内外网的接口添加到了Public区域的“interrface”接口列表中了。
这样伪装效果就发挥了出来,内网中该网段内的主机就可以通过防火墙访问外网Web主机了。
对于端口转发来说,即可以从本机的一个端口转发到另一个端口,也可以从本机的一个端口转发到另一个系统,这只是在伪装接口的情况下有用,其前提是伪装功能要打开。注意,端口转发只是用于Ipv4。
例如,当外网主机想访问某内网主机的Telnet服务,就可以通过端口转发来实现,即将内网目标主机的TCP 23端口通过防火墙转发出去。
执 行“firewall-cmd--permanent --zone=public--add-forward-port=por t=23:proto=tcp:toport=2 3:toaddr=172.16.1.100”,“firewall-cmd --reload”命令,就可以将IP为172.16.1.100内网主机的TCP 23端口通过防火墙转发出去。外网主机通过访问防火墙主机的TCP 23端口,就可以映射到特定的内网主机TCP 23端口上。 执 行“firewall-cmd--permanent --zone=work--add-rich-rule= 'rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 p r o t o c o l=t c p t oport=8080'”、“firewall-cmd--reload”命令,使用富规则实现转口转发,可以将指定源地址TCP80端口访问转发到本系统的TCP 8080端口。这样,就实现了针对本系统的端口转发功能。
应该指出,在一个区域中(例如“Public”),规则的匹配顺序是伪装和转口转发优先级最高,之后是日志记录功能,再次是允许规则,最后是拒绝规则。
处理使用系统自带的区域和服务外,Linux 7的防火墙也允许用户自定义所需的区域和服务。防火墙配置文件分别存储在“/usr/lib/firewalld” 和“/etc/firewalld”目录中。
对于前者来说是系统默认的,对于后者来说是当前使用的。如果要自定义区域和服务,就需要以前者为模版。
防火墙区域的定义信息存储在“.xml”格式的文件中,进入“/etc/firewalld/zones”目录中,执行“cat public.xml”命 令,显 示Public区域的配置信息,在其中包含该区域的所有规则信息。可以在其中直接添加规则,实现灵活的规则编辑操作。
进 入“/u s r/l i b/firewalld/zones”目录,在其中显示各种默认的区域配置信息。执行“cat public.xml”命令,查看默认的区域配置信息,包括默认开放的服务。但是其中并没有包含任何规则。
了解了这些内容,实现自定义区域操作就很简单了。例如执行“firewall-cmd--new-zone --permanent--new-zone=workzone”,“firewall-cmd --reload”命令,可以自定义一个名为“workzone”的区域。进入“/etc/firewalld/zones”目录中,可以看到该区域配置文件。当然,该文件默认中的配置信息为空。
执 行“f i r e w a l lc m d --l i s t-a l l--zone=workzone”命令,显示其不包含任何规则信息。之后可以按照上面谈到的方法,执行各种命令,为其添加所需的规则。
例如执行“firewallc m d --c h a n g einterface=enoxxxxxx -zone=workzone”命令,将指定的网络接口添加到该自定义区域。执行“firewall-cmd-zone=workzone --addservice=ssh --permanent”,“firewall-cmd --reload”命令,为该区域添加SSH服务,即允许连接SSH服务。这样,在客户端连接与上述“enoxxxxxx”相关的IP时,就可以访问该机的SSH服务了。
当然,也可以进入“/etc/firewalld/zones”目录中,执行“vi workzone.xml”命令进行编辑,添加“