微信公众号:运维开发故事,作者:wanger
防火墙是具有很好的保护作用。***者必须首先穿越防火墙的安全防线,才能接触目标计算机。在公司里数据安全是最重要的,要求安全部门进行全公司进行服务器防火墙安全搭建,在原有的基础上进行安全的防火墙设置,有效避免安全隐患等问题,建议大家还是花个十多分钟好好看一下防火墙的理论,这样便于后期问题排查,最后一小节有常用命令操作。
防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。它通过访问控制机制,确定哪些内部服务允许外部访问,以及允许哪些外部请求可以访问内部服务。它可以根据网络传输的类型决定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可以看作是一个区域、一个网段可以看作是一个区域,局域网、互联网都可以看作是一个区域。例如:
配置或者增加区域:可以使用任何一种 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的策略。
firewall-cmd支持防火墙的所有特性,管理员可以用它来改变系统或用户策略,通过 firewall-cmd用户可以配置防火墙允许通过的服务、端口、伪装、端口转发、和ICMP过滤器和调整 zone(区域)设置等功能。
firewall-cmd工具支持两种策略管理方式,运行时和永久设置,需要分别设置两者:
防火墙管理命令格式:
firewall-cmd [Options…]
firewall-cmd支持上百参数,下表为常用Options说明,如表所示:
firewall-cmd命令 | 说明 |
---|---|
–get-default-zone | 查询当前默认区域 |
–set-default-zone= | 设置默认区域,会更改运行时和永久配置 |
–get-zones | 列出所有可用区域 |
–get-active-zones | 列出正在使用的所有区域(具有关联的接口或源)机器接口和源信息 |
–add-source= [–zone=] | 将来自IP地址或网络/子网掩码的所有流量路由到指定区域。 |
–remove-source= [–zone=] | 从指定区域中删除用于路由来自IP地址或网络/子网掩码的所有流量的规则 |
–add-interface=[–zone=] | 将来自的所有流量路由到指定区域 |
–change-interface=[–zone=] | 将接口与而非其当前区域关联 |
–list-all [–zone=] | 列出的所有已配置接口、源、服务和端口 |
–list-all-zones | 检索所有区域的所有信息(接口、源、端口、服务等) |
–add-service=[–zone=] | 允许到的流量 |
–add-port=<PORT/PROTOCOL>[–zone=] | 允许到<PORT/PROTOCOL>端口的流量 |
–remove-service=[–zone=] | 从区域允许列表中删除 |
–remove-port=<PORT/PROTOCOL>[–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 //添加操作后别忘了执行重载才会生效
欢迎各位关注微信公号“运维开发故事”