Linux防火墙设置 FirewallD

Posted sforiz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux防火墙设置 FirewallD相关的知识,希望对你有一定的参考价值。

entos从7.0 开始将原先的防火墙iptables换成了FirewallD。FirewallD支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项,被称作动态管理防火墙,也就是说不需要重启整个防火墙便可应用更改。centos7默认安装了firewalld,若没有安装,执行 yum install firewalld firewalld-config 安装,其中firewalld-config是GUI工具。FirewallD与iptables关系:

firewalld底层仍旧是基于iptables的,但还是有很多不同的地方:

  • iptables在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,其中前者是默认的配置,请不要修改。可以在/etc/firewalld/中编辑自己的配置,firewalld优先使用/etc/firewalld/中的配置。
  • 使用 iptables,每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同之处。因此,firewalld 可以在运行时间内,改变设置而不丢失现行连接。

firewalld中zone概念(区域)

RHEL7中的不过貌似其实现方式还是和iptables一样的,但是不像mariaDB那样兼容mysql命令,FirewallD无法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则

FirewallD使用区域(zone)的概念来管理,每个网卡对应一个zone,这些zone的配置文件可在/usr/lib/firewalld/zones/下看到,默认的是public.由firewalld 提供的区域按照从不信任到信任的顺序排序:

  • drop(丢弃)任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。
  • block(阻塞)任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。
  • public(公开) 在用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
  • external(外部)用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。
  • dmz(隔离区)用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。
  • work(工作)用在工作网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
  • home(家庭)用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
  • internal(内部)用在内部网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。
  • trusted(信任)允许所有网络连接。

firewalld中的过滤规则

  • source: 根据源地址过滤
  • interface: 根据网卡过滤
  • service: 根据服务名过滤
  • port: 根据端口过滤
  • icmp-block: icmp 报文过滤,按照 icmp 类型配置
  • masquerade: ip 地址伪装
  • forward-port: 端口转发
  • rule: 自定义规则

其中,过滤规则的优先级遵循如下顺序

  • source
  • interface
  • conf

firewalld常用命令

fierwalld可以直接修改配置文件进行配置,也可以通过配置工具的命令,这里因为是远程操作为了确保开启后ssh端口是开放的,所以直接修改配置文件。

先查看/etc/firewalld/firewalld.conf中DefaultZone的值,默认是DefaultZone=public,这时/etc/firewalld/zones/目录下应该有个public.xml文件,vi打开它修改成:

1 2 3 4 5 6 7 8 9 <? xml version = "1.0" encoding = "utf-8" ?> < zone >      < short > Public < / short >      < description > For use in public areas . You do not trust the other computers on networks to not harm your computer . Only selected incoming connections are accepted . < / description >      < service name = "dhcpv6-client" / >      < service name = "ssh" / >      < service name = "http" / >      < service name = "https" / > < / zone >

这就代表在public zone中开放ssh(22)、http(80)、https(443)端口,其中对应每一个在/usr/lib/firewalld/services/下*.xml文件定义好的服务类型,比如http.xml文件如下:

1 2 3 4 5 6 <? xml version = "1.0" encoding = "utf-8" ?> < service >      < short > WWW ( HTTP ) < / short >      < description > HTTP is the protocol used to serve Web pages . If you plan to make your Web server publicly available , enable this option . This option is not required for viewing pages locally or developing Web pages . < / description >      < port protocol = "tcp" port = "80" / > < / service >

所以也可以直接在public.xml中这样:

1 2 3 4 5 6 7 8 9 <? xml version = "1.0" encoding = "utf-8" ?> < zone >      < short > Public < / short >      < description > For use in public areas . You do not trust the other computers on networks to not harm your computer . Only selected incoming connections are accepted . < / description >      < service name = "dhcpv6-client" / >      < service name = "ssh" / >      < port protocol = "tcp" port = "80" / > #等效的      < service name = "https" / > < / zone >

每次改配置文件还是比较麻烦的,firewalld可以使用firewall-config和firewall-cmd进行配置,前者是由于GUI模式下,后者为命令行下工具,一些常用命令如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 systemctl start firewalld #启动 systemctl status firewalld #或者firewall-cmd –state 查看状态 sytemctl disable firewalld #停止并禁用开机启动 systemctl enable firewalld #设置开机启动 systemctl stop firewalld #禁用 firewall - cmd version #查看版本 firewall - cmd help #帮助信息 firewall - cmd get - active - zones #查看区域信息 firewall - cmd get - zone - of - interface = eth0 #查看指定接口所属区域 firewall - cmd panic - on #拒绝所有包 firewall - cmd panic - off #取消拒绝状态 firewall - cmd query - panic #查看是否拒绝 firewall - cmd reload #更新防火墙规则 firewall - cmd complete - reload #断开再连接 firewall - cmd zone = public add - interface = eth0 #将接口添加到public区域 , 默认接口都在public。若加上–permanet则永久生效 firewall - cmd set - default - zone = public #设置public为默认接口区域 firewall - cmd zone = pulic list - ports #查看所有打开的端口 firewall - cmd zone = pulic add - port = 80 / tcp #把tcp 80端口加入到区域 firewall - cmd zone = public add - service = http #把http服务加入到区域 firewall - cmd zone = public remove - service = http #移除http服务

部分命令共同的参数说明:

  • –zone=ZONE 指定命令作用的zone,省缺的话命令作用于默认zone
  • –permanent 有此参数表示命令只是修改配置文件,需要reload才能生效;无此参数则立即在当前运行的实例中生效,不过不会改动配置文件,重启firewalld服务就没效果了。
  • –timeout=seconds 表示命令效果持续时间,到期后自动移除,不能和–permanent同时使用。例如因调试的需要加了某项配置,到时间自动移除了,不需要再回来手动删除。也可在出现异常情况时加入特定规则,过一段时间自动解除。

参考连接:

拓展知识:Linux中的防火墙

netfilter

iptables、firewalld这些软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核的netfilter完成的。netfilter是Linux 2.4内核引入的包过滤引擎。由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。iptables、firewalld等等都是在用户空间修改过滤表规则的便捷工具。

linux内部结构可以分为三部分,从最底层到最上层依次是:硬件–>内核空间–>用户空间

netfilter在数据包必须经过且可以读取规则的位置,共设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中:

  • PREROUTING 数据包刚进入网络接口之后,路由之前
  • INPUT 数据包从内核流入用户空间
  • FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤。
  • OUTPUT 数据包从用户空间流出到内核空间。
  • POSTROUTING 路由后,数据包离开网络接口前。

链其实就是包含众多规则的检查清单,每一条链中包含很多规则。当一个数据包到达一个链时,系统就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则就继续检查下一条规则,如果该数据包不符合链中任一条规则,系统就会根据该链预先定义的默认策略来处理数据包。

当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWAR

以上是关于Linux防火墙设置 FirewallD的主要内容,如果未能解决你的问题,请参考以下文章

必看!盘点一下Linux中firewalld防火墙的相关设置

Linux防火墙基础(Firewalld命令的使用)

Firewalld-防火墙之后起之秀

linux firewalld 防火墙简单命令

Linux(CentOS 7)firewalld防火墙

linux下防火墙的配置:firewalld的管理