防火墙是具备很好的保护做用。***者必须首先穿越防火墙的安全防线,才能接触目标计算机。在公司里数据安全是最重要的,要求安所有门进行全公司进行服务器防火墙安全搭建,在原有的基础上进行安全的防火墙设置,有效避免安全隐患等问题,建议你们仍是花个十多分钟好好看一下防火墙的理论,这样便于后期问题排查,最后一小节有经常使用命令操做。docker
防火墙是指设置在不一样网络或网络安全域之间的一系列部件的组合,它能加强机构内部网络的安全性。它经过访问控制机制,肯定哪些内部服务容许外部访问,以及容许哪些外部请求能够访问内部服务。它能够根据网络传输的类型决定IP包是否能够传进或传出内部网。
防火墙经过审查通过的每个数据包,判断它是否有相匹配的过滤规则,根据规则的前后顺序进行一一比较,直到知足其中的一条规则为止,而后依据控制机制作出相应的动做。若是都不知足,则将数据包丢弃,从而保护网络的安全。
Linux系统的防火墙功能是由内核实现的。在2.4 版及之后的内核中,包过滤机制是netfilter.CentOS 6管理工具是iptables,CentOS 7管理工具是firewalld ,firewalld 是Linux新一代的防火墙工具,它提供了支持网络/防火墙区域 (zone) 定义网络连接以及接口安全等级的动态防火墙管理。
Netfilter,位于Linux内核中的包过滤防火墙功能体系,称为Linux防火墙“内核态”。firewall-cmd,位于/bin/firewall-cmd,是用来管理防火墙的命令工具,为防火墙体系提供过滤规则/策略,决定如何过滤或处理到达防火墙主机的数据包,称为Linux防火墙的“用户态”。习惯上,上述2种称呼均可以表明Linux防火墙。小程序
(1) netfilter框架
Linux内核包含了一个强大的网络子系统,名为netfilter,它能够为iptables内核防火墙模块提供有状态或无状态的包过滤服务,如NAT、IP假装等,也能够因高级路由或链接状态管理的须要而修改IP头信息。而firewalld能够动态管理防火墙,将netfilter的过滤功能集于一身,它也支持容许服务或者应用程序直接添加防火墙规则的接口,netfilter所处的位置如图1所示:安全
虽然防火墙模块构建在Linux内核,而且要对流经IP层的数据包进行处理,但它并无改变IP协议栈的代码,而是经过netfilter模块将防火墙的功能引入IP层,从而实现防火墙代码和IP协议栈代码的彻底分离。netfilter模块的结构。如图2所示:
数据包从左边进入IP协议栈,进行IP校验之后,数据包被PREROUTING处理,而后就进入路由模块,由其决定该数据包是转发出去仍是送给本机。若该数据包是送给本机的,则经过INPUT处理后传递给本机的上层协议;若该数据包应该被转发,则它将FORWARD处理,而后还要经POSTROUTING处理后才能传输到网络。本机进程产生的数据包要先通过OUTPUT处理后,再进行路由选择处理,而后通过POSTROUTING处理后再发送到网络。
iptables服务在/etc/sysconfig/iptables中储存配置,而firewalld将配置储存在 /usr/lib/firewalld/和/etc/firewalld/中的各类XML文件里,使用iptables的时候每个单独更改意味着清除全部旧有的规则和从/etc/sysconfig/iptables里读取全部新的规则,使用firewalld 却不会再建立任何新的规则,仅仅运行规则中的不一样。所以firewalld能够在运行时改变设置而不丢失现行配置。
Firewalld动态管理防火墙,不须要重启整个防火墙即可应用更改。于是也就没有必要重载全部内核防火墙模块。不过,要使用firewalld就要求防火墙的全部变动都要经过firewalld守护进程来实现,以确保守护进程中的状态和内核里的防火墙是一致的。另外,firewalld没法解析由iptables和iptables命令行工具添加的防火墙规则。 Firewalld防火墙堆栈示意图,如图3所示。服务器
FirewallD 提供了支持网络/防火墙区域(zone)定义网络连接以及接口安全等级的动态防火墙管理工具。firewalld经过将网络划分红不一样的区域(一般状况下称为 zones),制定出不一样区域之间的访问控制策略来控制不一样区域间传送的数据流。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,而且拥有运行时配置和永久配置选项。它也支持容许服务或者应用程序直接添加防火墙规则的接口。 之前的 system-config-firewall/lokkit 防火墙模型是静态的,每次修改都要求防火墙彻底重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。而模块的卸载将会破坏状态防火墙和确立的链接。
相反,firewall daemon 动态管理防火墙,不须要重启防火墙即可应用更改。于是也就没有必要重载全部内核防火墙模块了。不过,要使用 firewall daemon 就要求防火墙的全部变动都要经过该守护进程来实现,以确保守护进程中的状态和内核里的防火墙是一致的。另外,firewall daemon 没法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则。守护进程经过 D-BUS 提供当前激活的防火墙设置信息,也经过 D-BUS 接受使用 PolicyKit 认证方式作的更改。应用程序、守护进程和用户能够经过D-BUS请求启用一个防火墙特性。特性能够是预约义的防火墙功能,如:服务、端口和协议的组合、端口/数据报转发、假装、ICMP 拦截或自定义规则等。该功能能够启用肯定的一段时间也能够再次停用。网络
网络区域定义了网络链接的可信等级。这是一个一对多的关系,这意味着一次链接能够仅仅是一个区域的一部分,而一个区域能够用于不少链接。一个IP能够看做是一个区域、一个网段能够看做是一个区域,局域网、互联网均可以看做是一个区域。例如:app
配置或者增长区域:可使用任何一种 firewalld 配置工具来配置或者增长区域,以及修改配置。工具备例如 firewall-config 这样的图形界面工具, firewall-cmd 这样的命令行工具,以及D-BUS接口。或者也能够在配置文件目录中建立或者拷贝区域文件。 @PREFIX@/lib/firewalld/zones 被用于默认和备用配置,/etc/firewalld/zones 被用于用户建立和自定义配置文件。
修改区域:区域设置以 ZONE= 选项 存储在网络链接的ifcfg文件中。若是这个选项缺失或者为空,firewalld 将使用配置的默认区域。若是这个链接受到 NetworkManager 控制,也可使用 nm-connection-editor 来修改区域。
由NetworkManager控制的网络链接:防火墙不可以经过 NetworkManager 显示的名称来配置网络链接,只能配置网络接口。所以在网络链接以前 NetworkManager 将配置文件所述链接对应的网络接口告诉 firewalld 。若是在配置文件中没有配置区域,接口将配置到 firewalld 的默认区域。若是网络链接使用了不止一个接口,全部的接口都会应用到 fiwewalld。接口名称的改变也将由 NetworkManager 控制并应用到firewalld。为了简化,网络链接将被用做与区域的关系。若是一个接口断开了,NetworkManager也将告诉firewalld从区域中删除该接口。当firewalld由systemd或者init脚本启动或者重启后,firewalld将通知NetworkManager把网络链接增长到区域。框架
CentOS 7中使用firewall-config图形界面管理的防火墙策略。也可使用firewall-cmd命令行工具进行管理, firewall-cmd 支持所有防火墙特性,对于状态和查询模式,命令只返回状态,没有其它输出。另外还能够直接编辑/etc/firewalld/中的配置文件用来管理firewalld的策略。ssh
firewall-cmd支持防火墙的全部特性,管理员能够用它来改变系统或用户策略,经过 firewall-cmd用户能够配置防火墙容许经过的服务、端口、假装、端口转发、和ICMP过滤器和调整 zone(区域)设置等功能。
firewall-cmd工具支持两种策略管理方式,运行时和永久设置,须要分别设置二者:tcp
防火墙管理命令格式:
firewall-cmd [Options…]
firewall-cmd支持上百参数,下表为经常使用Options说明,如表所示:ide
firewall-cmd命令 | 说明 |
---|---|
--get-default-zone | 查询当前默认区域 |
--set-default-zone=<ZONE> | 设置默认区域,会更改运行时和永久配置 |
--get-zones | 列出全部可用区域 |
--get-active-zones | 列出正在使用的全部区域(具备关联的接口或源)机器接口和源信息 |
--add-source=<CIDR> [--zone=<ZONE>] | 未来自IP地址或网络/子网掩码<CIDR>的全部流量路由到指定区域。 |
--remove-source=<CIDR> [--zone=<ZONE>] | 从指定区域中删除用于路由来自IP地址或网络/子网掩码<CIDR>的全部流量的规则 |
--add-interface=<INTERFACE>[--zone=<ZONE>] | 未来自<INTERFACE>的全部流量路由到指定区域 |
--change-interface=<INTERFACE>[--zone=<ZONE>] | 将接口与<ZONE>而非其当前区域关联 |
--list-all [--zone=<zone>] | 列出<ZONE>的全部已配置接口、源、服务和端口 |
--list-all-zones | 检索全部区域的全部信息(接口、源、端口、服务等) |
--add-service=<SERVICE>[--zone=<ZONE>] | 容许到<SERVICE>的流量 |
--add-port=<PORT/PROTOCOL>[--zone=<ZONE>] | 容许到<PORT/PROTOCOL>端口的流量 |
--remove-service=<SERVICE>[--zone=<ZONE>] | 从区域容许列表中删除<SERVICE> |
--remove-port=<PORT/PROTOCOL>[--zone=<ZONE>] | 从区域容许列表中删除<PORT/PROTOCOL>端口 |
--reload | 丢弃运行时配置,并应用持久配置 |
firewall-config支持防火墙的全部特性,管理员能够用它来改变系统或用户策略,经过 firewall-config 用户能够配置防火墙容许经过的服务、端口、假装、端口转发、和ICMP过滤器和调整 zone(区域)设置等功能以使防火墙设置更加的自由、安全和强健。
firewall-config工做界面。如图4所示。
firewall-config工做界面分红三个部分:上面是主菜单,中间是配置选项卡,包括区域、服务设置选项卡,底部是状态栏,状态栏从左到右以此是链接状态、默认区域、锁定状态、应急模式。
在左下方角落寻找“已链接”字符,这标志着 firewall-config工具已经链接到用户区后台程序 firewalld。
firewall-config 主菜单包括四个选项:文件,选项,查看,帮助。其中选项子菜单是最主要的,它包括几个部分:
firewall-config 配置选项卡包括:运行时和永久。
区域选项卡是一个主要设置界面,firewalld 提供了10种预约义的区域,区域配置选项和通用配置信息能够在 firewall.zone(5) 的手册里查到,
区域选项卡有八个子选项卡,分别是服务、端口、假装、端口转发、ICMP过滤器、富规则、接口、来源,如图3-1-5所示。
(4)firewall-config 服务选项卡
预约义了几十种重要服务,可经过命令firewall-cmd --get-services查询,服务是端口、协议、模块和目标地址的集合,该选项卡配置只能在永久配置视图中修改服务,不能在运行时配置中修改。
服务选项卡底下包含端口和协议、模块、目标地址三种子选项卡,如图所示。。
管理员能够规定哪些用户可使用用户交互模式和限制防火墙可用特性。
端口元数据信息(由 Lennart Poettering 提议),拥有一个端口独立的元数据信息是很好的。应用程序或服务的端口是动态的,于是端口自己并不能描述使用状况,因此对 /etc/services 的端口和协议静态分配模型不是个好的解决方案,也没有反映当前使用状况。。
元数据信息能够用来为防火墙制定简单的规则。下面是一些例子:
这里的元数据信息不仅有特定应用程序,还能够是一组使用状况。例如:组“所有共享”或者组“文件共享”能够对应于所有共享或文件共享程序(如:torrent 文件共享)。这些只是例子,于是,可能并无实际用处。
这里是在防火墙中获取元数据信息的两种可能途径:
第二种解决方案的好处是不须要为有新的元数据组和归入改变(可信级.用户偏好或管理员规则等等)从新编译内核。这些抽象规则的添加使得 firewall daemon 更加自由。即便是新的安全级也不须要更新内核便可轻松添加。
实际应用中对sysctl 设置常常出现错误。
一个例子是,在 rc.sysinit 正运行时,而提供设置的模块在启动时没有装载或者从新装载该模块时会发生问题。
另外一个例子是 net.ipv4.ip_forward ,防火墙设置.libvirt 和用户/管理员更改都须要它。若是有两个应用程序或守护进程只在须要时开启 ip_forwarding ,以后可能其中一个在不知道的状况下关掉服务,而另外一个正须要它,此时就不得不重启它。
sysctl daemon 能够经过对设置使用内部计数来解决上面的问题。此时,当请求者再也不须要时,它就会再次回到以前的设置状态或者是直接关闭它。
firewalld 和 iptables service 之间最本质区别是:
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
(2) systemctl是CentOS7的服务管理工具中主要的工具,它融合以前service和chkconfig的功能于一体。
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
(3) 配置firewalld-cmd
#《实例一》防火墙查询 firewall-cmd --version //查看版本 firewall-cmd --help // 查看帮助 firewall-cmd --state // 显示状态 firewall-cmd --get-services //获取支持服务列表(firewalld内置服务支持) firewall-cmd --zone=public --list-ports //查看全部打开的端口 firewall-cmd --list-forward-ports //查看转发的端口 fierewall-cmd –reload //从新加载防火墙策略 firewall-cmd --get-active-zones //查看区域信息 firewall-cmd --list-all-zones //列出所有启用的区域的特性 firewall-cmd --list-services //显示防火墙当前服务 firewall-cmd --get-zone-of-interface=eth0 //查看指定接口所属区域 firewall-cmd --panic-on //拒绝全部包 firewall-cmd --panic-offfir //取消拒绝状态 firewall-cmd --query-panic //查看是否拒绝 *# 《实例二》 运行时区域策略设置示例(注:如下示例不加zone的为默认区域public) firewall-cmd --add-service=ssh //容许 ssh 服务经过 firewall-cmd --remove-service=ssh //禁止 ssh 服务经过 firewall-cmd --add-service=samba --timeout=600 //临时容许 samba 服务经过 600 秒 firewall-cmd --add-service=http --zone=work //容许http服务经过work区域 firewall-cmd --zone=work --add-service=http //从work区域打开http服务 firewall-cmd --zone=internal --add-port=443/tcp //打开 443/tcp 端口在内部区域(internal) firewall-cmd --zone=internal --remove-port=443/tcp //关闭443/tcp 端口在内部区域(internal) firewall-cmd --add-interface=eth0 //打开网卡eth0 firewall-cmd --remove-interface=eth0 //关闭网卡eth0 #《 实例三》 永久区域策略设置示例(注:如下示例不加zone的为默认区域public;永久设置均需从新加载防火墙策略或重启系统) firewall-cmd --permanent --add-service=ftp //永久容许 ftp 服务经过 firewall-cmd --permanent --remove-service=ftp //永久禁止 ftp 服务经过 firewall-cmd --permanent --add-service=http --zone=external //永久容许http服务经过external区域 firewall-cmd --permanent --add-service=http --zone=external //永久容许http服务经过external区域 firewall-cmd --permanent --zone=internal --add-port=111/tcp //打开 111/tcp 端口在内部区域(internal) firewall-cmd --permanent --zone=internal --remove-port=111/tcp //关闭 111/tcp 端口在内部区域(internal) firewall-cmd --permanent --add-interface=eth0 //永久打开网卡eth0 firewall-cmd --permanent --remove-interface=eth0 //永久关闭网卡eth0 firewall-cmd --permanent --zone=public --add-port=8080-8083/tcp //添加多个端口 firewall-cmd --permanent --zone=public --remove-port=81/tcp //删除某个端口 firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.51" accept" //删除某个IP firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept" // firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept" //针对某个ip段访问 firewall-cmd --reload //添加操做后别忘了执行重载才会生效
欢迎各位关注我的公号“没有故事的陈师傅”