前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十四章 Firewall防火墙(二)

第十四章 Firewall防火墙(二)

作者头像
晓天
发布2019-07-04 14:36:27
1.2K0
发布2019-07-04 14:36:27
举报
文章被收录于专栏:Linux、云计算技术交流

第十四章 Firewall防火墙(二)

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,所以本书中也不做具体介绍了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第十四章 Firewall防火墙(二)
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档