14.2.3 规则配置
现在,我们的两块网卡都是在public区域中。下面我们来给public区域配置规则,让其允许某些服务被访问。
firewall-cmd --add-service=http --zone=public
注:给区域 增加允许被访问的服务。
现在,我们可以在主机A和B上访问linux的web服务看一下,是可以打开的。说明区域中的services项是指允许本机被访问的服务,http服务的端口是TCP 80,也就是说允许了TCP 80端口的通信。
PS:本章开始就讲过,firewall防火墙主要是针对本机做保护的,如果我们这台Linux主机仍是像上一章的身份一样,是一个网关路由器的话,在内网的主机B内架设一个web服务,主机A访问是不成功的。总结来说就是:firewall除了external和dmz外,其余七个区域都是针对本机服务做保护的,即允许或拒绝的都访问本机的服务,不做路由转发管理。
要在区域中去除服务,用如下命令:
firewall-cmd --remove-service=http --zone=public ---去除服务
上面的实验,我们是给区域加入的http服务,那么其他服务firewall都支持哪些服务呢?我们也是可以通过命令查看到的:
firewall-cmd --get-services ---查看firewall所有可识别的服务
也就是说,firewall支持、识别图中这些服务,可以直接加到区域的services项中。其实本质上firewall真正识别的还是这些服务的端口port,在系统中每个服务都有一个对应的配置文件,记录着每个服务对应的端口,从而让firewall允许这些端口的通信。
但是,如果有软件服务,并不在这些服务中,即firewall不能识别的服务,是我们人为安装的特殊软件服务,那么就不可以加入到services项中了,因为firewall不识别。那么,我们可以把这种服务的端口,加入到区域的port项中做允许。如:oracle数据库软件的端口TCP 1521 就不在上图的列表中,所以只能用增加允许端口的方式做允许。
firewall-cmd --add-port=1521/tcp --zone=public ---给区域增加允许被访问的端口
firewall-cmd --remove-port=1521/tcp --zone=public ---删除允许的端口
以上命令,大家可以自己操作一下试试,也可以把http服务从区域中删除后,增加TCP80端口,也可以实现相同的效果。
我们在查看区域内规则时,除了看到services和port之外,还有一项sources,这项是设置源ip的,但是功能却不是允许sources指定的客户机访问本机。这里需要特殊区别一下,sources项的功能是:sources中设置的源地址,通信时按照所在的区域执行,不再看网卡所在的区域了。来看以下案例:
firewall-cmd --change-interface=ens33 --zone=trusted
我们把ens33网卡转到trusted区域中,用主机A访问Linux的web服务可成功。因为走的是ens33网卡,且该网卡在trusted区域中。
firewall-cmd --add-sources=202.0.0.0/24 --zone=public
以上命令给public区域添加sources项为202.0.0.0/24网段。则主机A再次访问Linux的web服务不通了。因为主机A的ip在202.0.0.0/24段内,则访问web服务器时走的是public区域,public区域未允许http服务所以就被拒绝了。虽然走的也是ens33网卡,但是未按网卡所在区域执行。
firewall-cmd --remove-sources=202.0.0.0/24 --zone=public ---删除
再查看一下区域,看见ip段不在该区域中了。
14.3 配置NAT
上几节我们介绍了使用firewall防火墙保护本机服务。当然,既然firewall是基于iptables工作的,那么一定也支持nat功能。当然,我们可以在public等区域中开启nat,通过设置masquerade、forward-ports等项可以实现,但一般我们都是在external或dmz区域中做配置。下面我们到配置最为简单的external区域中做演示。
14.3.1 配置SNAT
Firewall的九大区域中,external区域就是专做nat的区域,会自动做数据包的源地址转换,所以只要将外网卡转入这个区域就可以启用nat了。
开启snat有两种方式,一般使用第二种方式较多:
方式一:设置external区域为默认区域
firewall-cmd --set-default-zone=externat
方式二:配置外网卡到external区域
firewall-cmd --change-interface=ens33 --zone=external
图中可见,其实external区域与public区域的区别就在于masquerade项,该项为yes即表示开启了nat功能,masquerade项的意思是做ip伪装,即地址转换了。
以上任一方式配置nat后,我们都可以在主机A上部署web服务,然后在内网主机B访问主机A的网站,再分别运行netstat -n命令查看通信的封装(查看过程、结果与iptables中的snat实验相同),证明snat的成功。
14.3.2 配置DNAT
DNAT又称端口映射,我们需要在外网卡上指定映射端口,这个命令比较长,参数较多,我们慢慢讲来:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.10.2 --zone=external --- PS:这是一整条命令,只是由于过长才会回行显示
这个命令中,给add-forward-port定义了映射功能,其实命令参数如果写成--add-forward-port="port=80:proto=tcp:toport=80:toaddr=192.168.10.2"样子,可能会更好理解一些,""中是给参数设置的值,里面的port、proto是设置的映射端口和协议,后面toport、toaddr是指定的内网真实服务器的端口和ip。但是在命令中是不写""的,所以看起来=号有点多,有点乱。
端口映射开启后,我们可以在主机B上部署web服务,从主机A上访问http://202.0.0.2地址,即访问路由器的映射端口,以验证访问到了主机B上网站。
14.5 永久保存配置
同iptables一样,我们在命令中所做的配置,都是临时生效的。但是firewall更人性化一些,若要重启仍然生效,无需配置配置文件,只需要在命令后加-- permanent参数即可。如:firewall-cmd --set-default-zone=trusted --permanent 。
14.6 应急预案panic
在firewall工作过程中,若出现意外,如:firewall被攻击或被黑客攻克了,为了服务器安全,我们可以启用应急预案,将所有通信全部拒绝。命令如下:
firewall-cmd --panic-on ---启动应急预案,将拒绝一切通信
以上panic预案,虽然效果与drop区域相同,但panic的优先级、安全性会比drop区域高,即即便区域的防护被攻破了,还有panic一道屏障可以保护主机。且panic的命令执行后是永久生效的。无需加—permanent参数。
其他命令如下:
firewall-cmd --panic-off ---关闭应急
firewall-cmd --query-panic ---查询当前panic的状态
14.7 自定义服务
前面我们使用过firewall-cmd --get-services 命令查看过firewall支持的左右服务,其实每个服务在系统中都有一个服务文件,存放在/usr/lib/firewalld/services/目录中,可以ls查看一下:
可见,里面都是一些.xml文件,每一个服务对应一个,里面记录了这个服务的相关信息。我们来打开一个看看:vi http.xml :
可见,文件里是以xml语言编写的文件,其实即使我们不懂xml语言也无所谓,只需要知道里面是标签制语言,即<单词>与</单词>是一对对应的标签,类似于{}一样,表示了一个容器,包括了一些信息。这里的服务文件里面中<service></service>标签定义了一个服务,里面<short></short>定义了服务的简称,<description></description>标签里定义了这个服务的简介、描述,<port />标签中指定了本服务的协议和端口,所以我们之前讲过给firewall的区域增加http服务,等同于增加tcp 80 端口。
有了以上了解,我们就可以模仿以上格式,编写自定义服务了:
cd /usr/lib/firewalld/services
vi oracle.xml
<?xmlversion="1.0" encoding="utf-8"?>
<service>
<short>Oracle</short>
<description>Oracle is a dababasesystem.</description>
<port protocol="tcp"port="1521"/>
</service>
systemctl restart firewall
firewall-cmd --get-services
重启firewall服务后,再次查看可识别服务后,就可以查看到oracle的服务了。我们就可以给区域增加服务了,如:
firewall-cmd --add-service=oracle --zone=public
PS:我们也可以复制一个已有服务的.xml文件,改名改内容做此操作,会更简单一些。
14.8 iptables与firewall的关系
关于iptables与firewall的关系,我们之前讲过,firewall是基于iptables工作的,或者说firewall是iptables的一个外壳,我们输入的firewall命令,实质是由firewall生成iptables的命令,给iptables执行的。我们可以做如下证明:
firewall-cmd --set-default-zone=drop ---设置默认有效区域为drop区域
执行完以上命令后,可以firewall-cmd --list-all查一下drop中是否包含了两块网卡,如果没有,则需要手动转一下网卡。因为firewall中设置默认区域后,所有网卡应该会自动转移到默认中,但若之前手动转动过网卡所在区域,则网卡不会转到默认区域中了,需要手动调整。
这样我们再用主机A或主机B访问Linux上的web网站,会发现不通了。但是我们执行 iptables -F 清空所有链后,再次用主机A或主机B访问Linux上的web网站就会发现又通了,所以可以证明firewall是基于iptables工作的。
我们再深入介绍一下,执行下面命令:
systemctl restart iptables ---重启服务,恢复各链的默认规则
systemctl restart firewall
firewall-cmd --set-default-zone=public
firewall-cmd --add-service=http --zone=public ---增加允许的服务
iptables -L ---查看各链规则,可见如下结果(内容较多,分别截几个图):
因为public区域是保护本机服务被访问的,按照iptables的原理,应该是INPUT链负责审核的,所以我们只查看INPUT链的内容。上面第一张图中可见,INPUT链中调用了INPUT_ZONES链,而INPUT_ZONES链又调用IN_public链(第二张图),IN_public链又调用了IN_public_allow链(第三张图),IN_public_allow链中最后一条允许了http协议(第四张图)。所以可以证明firewall中允许了服务后,实质上在iptables允许了相同服务,也就证明了运行firewall命令,实质是由firewall生成iptables的命令,给iptables执行的。
PS:这里的iptables的INPUT链中调用了另一个链,其实iptables中除了我们讲过的常用三个链和nat的两个链之外,还有一种自定义链。我们可以把规则加入到自定义链中,然后用常用的链调用这些自定义链。这样可以将规则写到自定义链中,被常用链调用,就无需把相同的规则在每个链中都写一次了,简化、方便了链中规则的编写。此例中的INPUT_ZONES、IN_public等几个链就可以视为自定义链,只不过不是人为创建的,而是由firewall创建的。
14.9 selinux简介
我们知道Linux中还有一个类似于防火墙的工具:selinux。很多人把selinux归类于防火墙,其实这是不太准确的。
iptables和firewall是Linux中正规的防火墙软件,是为了审核进出的数据包,以屏蔽访问、保护本机的。
但是selinux并不能够审核进出的数据包,它是保护本机服务或进程的。举例说明,当有客户端访问本机的web服务时,正常情况下,本机内应该启动一个web进程相应客户,而这时selinux会保护进程,不让web服务启动进程相应客户,从而起到了保护功能。所以我们说selinux是保护本机服务、进程的。
临时关闭selinux,可以使用setenforce 0,但这样仅是当前生效,重启后selinux又会启动了,所以可以更改selinux的配置文件,让selinux永久关闭,操作如下:
vi /etc/selinux/confi
改:SELINUX=disabled ---永久关闭
好了,关于selinux我们就介绍这些,因为在实际生产环境中,一般都会把selinux永久关闭,很少会使用到selinux,所以本书中也不做具体介绍了。