16

初探 Firewalld

 5 years ago
source link: https://mp.weixin.qq.com/s/GWWPPwvsNGOwMPUepFhE9w?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

yIv6BfB.gif

MZjyq2a.gif

本文主要从概念及架构、核心组成、常用命令等几个方面详细介绍了Firewalld,并 附加介绍了iptables四表五链和netfilter的知识。

上篇文章回顾:Linux日志服务初识

1、Firewalld提供更加智能化的防火墙管理规则,优化策略配置方案,支持网络“zones(域)”,并为网络及其关联的链接、接口或源分配信任级别,不同信任级别默认开放服务不同。

2、支持IPV4,IPV6,以太网桥以及IPSET防火墙设置。

3、运行时态与永久配置分离,运行时态可手动更改,重置后回到永久配置(文件配置)

4、优化iptables添加规则,还支持图形界面(本文不介绍),除了iptables,还有ip6tables和ebtables规则。

概念及架构

空间架构分为上下两层。

1、上层:firewalld D-Bus:命令主接口,修改防火墙配置主要方式。

firewall-cmd:主要命令行操作方式。

firewall-config:离线命令行操作模式,因为直接作用于firewalld永久配置中,所以在firewall运行时不建议直接操作。

firewall-config:图形配置模式。

firewall-applet:防火墙小程序。

2、下层(核心层):负责处理配置和后端,并含有iptables,ip6tables,ebtables,ipset模块加载器。

FFRbaa3.jpg!web

空间结构图示

建议使用NetworkManager,虽然firewalld不依赖它,但是NetworkManager会解决一些网络设备重命名的通知等问题。

3、Firewalld支持zones,services,IPsets和ICMP类型。

核心组成

1、ZONE(防火墙区域定义链接、接口或源地址绑定的信任级别),共10(还有一种为default)种,直接为网域种的其他计算机建立信任关系度,不用进行麻烦的配置操作,只需要选择一个zone即可,如若不满足需要,还可手动添加信任服务。

Drop : 任何传入的网络的数据包都被丢弃

Block : 任何传入网络的数据包都被拒绝(包括ICMP),只能启动网络链接

Public : 在公共区域内使用,近接受选定的传入链接(默认:仅ssh或dhcpv6-client服务链接)

External : 用于伪装,出去的ipv4网络链接通过此区域伪装和转发(默认:仅接受ssh服务链接)

Dmz : 对内部网络访问权限限制(默认:仅接受ssh服务链接)

Work : 用于工作区(默认:仅接受ssh,ipp-client或dhcpv6-client服务链接 )

Home : 用于家庭区(默认:仅接受ssh,mdns,ipp-client,samba-client或dhcpv6-client服务链接)

Internal : 内部,对网络上的其他计算机信任的较高,默认大部分服务

Trusted : 最高信任级别,接受所有网络链接

public 配置(/etc/firewalld/zones)

2、NetworkManager存在的意义

1)NetworkManager(接口管理者)不能处理网络链接,它的作用是告诉firewalld将用于此链接的网络接口分配给该链接的配置中定义的区域,当然存在网络配置的系统都支持ifcfg文件的系统

2)网络链接由网络脚本处理

3、配置规则(当然,规则这种东西都是看起来繁杂冗长,常用的就几个)

规则介绍:

  • version=”string”  版本提供

  • target=”ACCEPT|%%REJECT%%|DROP”  接受,拒绝或丢弃与任何规则(端口,服务等)不匹配的每个数据包

  • short  可选开始和结束的标记,用于名称备注

  • description  可选的开始和结束的标记,用于描述备注

  • interface  可选的空元素标记 ,只有一个name属性,一般使name=”string”方式绑定服务到zone的接口上

  • source  可选的空元素标记,可多次使用。它可用于将源地址、地址反馈、MAC地址或ipset绑定到区域。属性如下:

    address=”address[/mask]” 源是IP地址或具有IPv4、IPv6掩码的网络IP地址;

    mac=”MAC” 源是MAC地址。它必须是xx:xx:xx:xx:xx:xx形式;

    ipset=”ipset” 源是一个ipset;

  • port  可选的空元素标记,可以多次使用具有多个端口条目。属性如下:

    port=”portid[-portid]”  端口可以是单个端口号portid,也可以是端口范围portid-portid

    protocol=”tcp|udp”  协议可分为TCP/UDP

  • protocol  可选的空元素标记,可以多次使用具有多个协议条目。属性如下:

    value=”string”

  • icmp-block  可选的空元素标记,可以多次使用具有多个条目,每个icmp-block标记只有一个强制属性:

    name=”string”

  • icmp-block-inversion  可选的空元素标记,只能在区域配置中使用一次。该标志反转icmp块处理。仅接受启用的ICMP类型,并在区域中拒绝所有其他类型

  • masquerade  伪装,可选的空元素标记。它只能在区域配置中使用一次,不能用于IPV6。

  • forward-port  可选的空元素标记,可以多次使用具有多个端口或数据包转发条目。forward-port有强制和可选属性:

    强制属性: port=”portid[-portid]”,protocol=”tcp|udp”

    可选属性: 用于本地转发,仅添加到端口。

to-port=”portid[-portid]” 要转发到的目标端口或端口范围。

to-addr=”address” 目标IPv4地址

  • source-port  可选的空元素标记,可多次使用具有多个源端口条目。源端口所有属性都是必需的:

    port=”portid[-portid]”

    protocol=”tcp|udp”

常用规则示例:

  • 规则示例

<?xml version="1.0" encoding="utf-8"?>
<zone>
      <short>Home</short>
      <description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="mdns"/>
      <service name="samba-client"/>
      <service name="dhcpv6-client"/>
</zone>
  • 服务示例

<?xml version="1.0" encoding="utf-8"?>
<service>
         <short>FTP</short>
         <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
         <port protocol="tcp" port="21"/>
         <module name="nf_conntrack_ftp"/>
</service>
  • IPSet示例

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:mac">
           <short>mac-list</short>
           <entry>00:11:22:33:44:55</entry>
</ipset>
  • Helper(助手示例)用于安全地使用链接跟踪帮助程序

<?xml version="1.0" encoding="utf-8"?>
<helper module="nf_conntrack_ftp">
              <port protocol="tcp" port="21"/>
</helper>
  • ICMP类型,限制ICMP在Internet协议(IP)中的信息交换,回应或者不回应 等等

<?xml version="1.0" encoding="utf-8"?>
<icmptype>
          <short>Echo Request (ping)</short>
          <description>This message is used to test if a host is reachable mostly with the ping utility.</description>
</icmptype>
  • 一般来说,不用进行配置中的规则修改。如若需要修改,可使用常用命令进行规则指定。

更多规则:

详见https://firewalld.org/documentation/man-pages/firewalld.richlanguage

常用命令

1、基础命令

firewall-cmd --state           #查看firewalld的状态
firewall-cmd --get-active-zones       #查看当前活动的区域,并附带一个目前分配给他们的接口列表  
firewall-cmd --get-defailt-zone       #查看默认区域
firewall-cmd --set-default-zone=dmz    #设置默认区域
firewall-cmd --get-zones           #查看所有可用域区
firewall-cmd --permanent --zone=internal --add-source=172.25.254.60/24          #设置源地址的所属zone (--permanent参数表示永久生效设置,如果没有指定--zone参数,则表示加入到默认区域)
firewall-cmd --permanent --zone=internal --remove-source=172.25.254.60/24       #删除网络地址
firewall-cmd --reload          #重载配置,并不会中断服务
firewall-cmd --complete-reload      #完全重载,会中断服务

2、添加服务

firewall-cmd --zone=public --add-service=http                  #在运行时环境的公共区域打开http服务
firewall-cmd --permanent --zone=public --add-service=http      #永久设定,在公共区域打开http服务

3、使用 –direct选项,在运行时里添加或移除链(iptables四表五链)

firewall-cmd --direct --add-rule ipv4filter IN_public_allow 0 -p tcp --dport 80 -j ACCEP      #添加规则,指定运行所有链接进入80端口
firewall-cmd --direct --remove-ruleipv4 filter IN_public_allow 0 -p tcp --dport 80 -j ACCEPT   #删除规则
firewall-cmd --direct--get-all-rules              #列出规则

4、使用现有文件创建新服务(在不熟悉配置命令及其规则的情况下,不建议使用这种方式)

firewall-cmd --permanent --new-service-from-file=myservice.xml --name=mynewservice

附加知识点(iptables四表五链,netfilter)

1、防火墙于iptables的内在关联

简而言之,iptables算是防火墙的基石,火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专门的数据包过滤表中,这些表集成在Linux内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。

而netfilter/iptables进行IP过滤规则的添加,编辑和移除规则。

netfilter组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

Iptables组件是一种工具,也成为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。

UrMZJzN.jpg!web

Linux内核过滤结构

2、iptables四表五链

  • Filter表 —— 三个链:INPUT、FORWARD、OUTPUT

    作用:过滤数据包  内核模块:iptables_filter.

  • Nat表 —— 三个链:PREROUTING、POSTROUTING、OUTPUT

    作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

  • Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

    作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

  • Raw表 —— 两个链:OUTPUT、PREROUTING

    作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

2InMJf3.jpg!web

四表五链对应关系

3、链表处理逻辑

  • INPUT —— 进来的数据包应用此规则链中的策略

  • OUTPUT —— 外出的数据包应用此规则链中的策略

  • FORWARD —— 转发数据包时应用此规则链中的策略

  • PREROUTING —— 对数据包作路由选择前应用此链中的规则

    (记住!所有的数据包进来的时侯都先由这个链处理)

  • POSTROUTING —— 对数据包作路由选择后应用此链中的规则

    (所有的数据包出来的时侯都先由这个链处理)

EfQJR3Z.jpg!web

链表处理逻辑

参考资料:

https://firewalld.org/documentation/

https://www.cnblogs.com/clouders/p/6544584.html

BRfAnui.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK