华子目录
- `firewalld服务`与`iptables服务`区别
- `9`种`firewalld域`
- `firewalld`相关文件
- 常用配置
- `域文件`中的`过滤规则`
- `firewalld`可视化工具`firewall-config`
- `firewall-cmd`命令行工具
- `firewalld富规则`
- `firewalld的高级规则`
- `firewalld`做`Linux路由器`
firewalld服务与iptables服务区别
- iptables是基于- Linux内核的- netfilter子系统构建的,直接操作- netfilter;而- firewalld则通过- libnftables库与- netfilter交互,提供了一个- 更高的抽象层
- iptables使用- 基于表的- 规则集,包括- filter,nat,mangle,raw,security五个表;- firewalld采用基于- 区域的- 规则集,包括- default,public,internal,external,dmz等- 9个- 区域
- iptables的- 配置较为- 复杂,需要- 用户掌握- 特定的命令行语法;- firewalld提供了- 更直观和灵活的- 配置方式,- 支持命令行和- 图形界面
- firewalld默认- 动作是- 拒绝,则- 每个服务需要设置- 允许才能- 放行,而- iptables里- 默认是- 每个服务是- 允许,需要- 拒绝的- 才能限制
- 由于firewalld通过libnftables库与netfilter交互,其性能相对于直接操作netfilter的iptables来说较低
9种firewalld域
- 当
开启firewalld后,数据包必须要经过某个域才能入站或出站
每个域都有一个处理行为(default、accept、reject、drop)
firewalld域根据信任级别分成9个域
firewalld使用的域是public域
| 区域 | 默认策略规则 | 
|---|---|
| 阻塞区域(block) | 拒绝流入的流量,返回icmp-host-prohibited消息,除非与流出的流量相关(允许ssh) | 
| 工作区域(work) | 拒绝流入的流量,除非与流出的流量相关(允许ssh) | 
| 家庭区域(home) | 拒绝流入的流量,除非与流出的流量相关(允许ssh) | 
| 公共区域(public) | 不相信网络上的任何计算机,只有选择接受传入的网络连接(允许ssh) | 
| 隔离区域(dmz) | 也称为 非军事区域,内外网络之间增加的一层网络,起到缓冲作用,允许ssh,其余拒绝 | 
| 信任区域(trusted) | 允许所有的数据包 | 
| 丢弃区域(drop) | 拒绝流入的流量,没有任何回复,除非与流出的流量相关 | 
| 内部区域(internal) | 等同于home区域 | 
| 外部区域(external) | 拒绝流入的流量,除非与流出的流量相关(允许ssh) | 
firewalld相关文件
- firewalld主配置文件- /etc/firewalld/firewalld.conf
- firewalld的- 配置文件有- 两个主要的目录- /usr/lib/firewalld/zones(- 系统配置文件,- 尽量不要修改)和- /etc/firewalld/zones(- 用户配置文件,可以- 自行修改)
- 每个域单独对应一个xml配置文件,文件名为<zone名称>.xml
            
            
              bash
              
              
            
          
          [root@server1 ~]# cd /etc/firewalld/
[root@server1 firewalld]# ls
firewalld.conf  icmptypes  lockdown-whitelist.xml  services
helpers         ipsets     policies                zones
[root@server1 firewalld]# vim firewalld.conf
DefaultZone=public   #设置了默认的防火墙区域
FirewallBackend=nftables  #指定了firewalld使用的防火墙后端是nftables
            
            
              bash
              
              
            
          
          [root@server ~]# cd /usr/lib/firewalld/zones
[root@server zones]# ls
block.xml  drop.xml      home.xml      nm-shared.xml  trusted.xml
dmz.xml    external.xml  internal.xml  public.xml     work.xml
[root@server zones]# cd /etc/firewalld/zones
[root@server zones]# ls
public.xml  public.xml.old常用配置
用法是:
- 把可信任的IP地址添加到trusted域,
- 把不可信任的IP地址添加到block域,
- 把要公开的网络服务添加到public域,
常用域为:trusted、block、public
域文件中的过滤规则
过滤规则优先级:
- source(- 最高)(- IP地址)
- interface(- 次之)(- 接口)
- 默认域(- 最低)

| 规则 | 作用 | 
|---|---|
| scources | 源IP地址过滤(常用) | 
| interfaces | 网卡过滤 | 
| services | 服务名(实际是关联端口)过滤 | 
| ports | 端口过滤 | 
| icmp-block | ICMP报文过滤 | 
| masquerade | IP地址伪装(nat) | 
| forward-ports | 端口转发过滤 | 
| rule | 自定义规则 | 
firewalld可视化工具firewall-config
安装
            
            
              bash
              
              
            
          
          #在firewalld启动的情况下,下载firewall-config包
[root@server ~]# yum  install  firewall-config  -y  # 安装图形化界面使用
            
            
              bash
              
              
            
          
          # 虚拟机中执行,不要在xshell执行
[root@server ~]# firewall-config
firewall-cmd命令行工具
firewalld命令生效模式
- runtime模式:- 运行时模式,- 立即生效,- 重启失效
- --permanent模式:- 永久模式,重启生效
firewall-cmd参数
| 参数 | 作用 | 
|---|---|
| --version | 查看 firewalld版本 | 
| --state | 查看 firewalld的状态 | 
| --zone=<区域名> | 指定区域 | 
| --get-default-zone | 查询默认的区域名称 | 
| --set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 | 
| --get-zones | 显示 可用的区域 | 
| --get-services | 显示 预先定义的服务 | 
| --get-active-zones | 显示当前 正在使用的区域与网卡名称 | 
| --add-source= | 将来自 此IP或网段的流量导向指定的区域 | 
| --remove-source= | 不再将来自 此IP或网段的流量导向某个指定区域 | 
| --add-interface=<网卡名称> | 将来自 该网卡的所有流量都导向某个指定区域(只有没被关联的网卡,才能被添加) | 
| --change-interface=<网卡名称> | 将 某个网卡与区域进行关联 | 
| --list-all | 显示 当前区域的网卡配置参数、资源、端口以及服务等信息 | 
| --list-all-zones | 显示 所有区域的网卡配置参数、资源、端口以及服务等信息 | 
| --add-service=<服务名> | 设置 默认区域允许该服务的流量 | 
| --add-port=<端口号/协议> | 设置 默认区域允许该端口的流量 | 
| --remove-service=<服务名> | 设置 默认区域不再允许该服务的流量 | 
| --remove-port=<端口号/协议> | 设置 默认区域不再允许该端口的流量 | 
| --reload | 让 永久生效的配置规则立即生效,并覆盖当前的配置规则,和--permanent搭配使用 | 
- 如果使用了
--permanent,则一定要使用--reload再加载,否则规则不生效
--add-interface中只有没被关联的网卡,才能被添加
参数使用示例
            
            
              bash
              
              
            
          
          #查看默认区域
[root@server1 ~]# firewall-cmd --get-default-zone
public
            
            
              bash
              
              
            
          
          #设置默认区域
[root@server1 ~]# firewall-cmd --set-default-zone=trusted
success
[root@server1 ~]# firewall-cmd --get-default-zone
trusted
[root@server1 ~]# firewall-cmd --set-default-zone=public
            
            
              bash
              
              
            
          
          #列出可用的区域
[root@server1 ~]# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
            
            
              bash
              
              
            
          
          # 查看firewalld支持的服务 
#(不支持nginx服务,需要手动添加)
[root@server ~]# firewall-cmd   --get-services   
            
            
              bash
              
              
            
          
          #正在使用的区域与网卡名称
[root@server1 ~]# firewall-cmd --get-active-zones
public
  interfaces: eth1 eth0
            
            
              bash
              
              
            
          
          #当前区域的网卡配置参数、资源、端口以及服务等信息
[root@server1 ~]# firewall-cmd --list-all
public (active)
  target: default   #如果流量不匹配任何允许的规则,它将根据默认策略处理
  icmp-block-inversion: no  #ICMP阻塞反转设置为"否",意味着不会反转ICMP阻塞规则,即按照正常规则处理ICMP流量  
  interfaces: eth0 eth1  #影响的网络接口eth0和eth1
  sources:   #此处为空,表示没有指定特定的源地址或网络
  services: cockpit dhcpv6-client ssh  #允许的服务
  ports:    #为空,表示没有指定特定的端口或协议
  protocols:   #为空,表示没有指定特定的端口或协议
  forward: yes   #允许转发,意味着此区域允许IP转发
  masquerade: no   #(伪装/NAT),此处设置为"否",表示不使用伪装(NAT)功能
  forward-ports:  #为空,表示没有指定特定的端口转发规则或源端口
  source-ports:  #为空,表示没有指定特定的端口转发规则或源端口
  icmp-blocks:  #为空,表示没有指定要阻塞的ICMP类型
  rich rules:   #为空,表示没有定义富规则。富规则允许创建更复杂的防火墙规则,可以基于源/目标地址、端口、协议、接口等多种条件
            
            
              bash
              
              
            
          
          #查看指定区域的网卡配置参数、资源、端口以及服务等信息
[root@server1 ~]# firewall-cmd --zone=trusted --list-all
            
            
              bash
              
              
            
          
          #所有区域的网卡配置参数、资源、端口以及服务等信息
[root@server1 ~]# firewall-cmd --list-all-zones
--add-service=<服务名>

            
            
              bash
              
              
            
          
          #添加http服务
[root@server1 ~]# firewall-cmd --add-service=http
success

--remove-service=<服务名>
        
            
            
              bash
              
              
            
          
          #移除服务
[root@server1 ~]# firewall-cmd --remove-service=http
success
--add-port=端口号/协议
- 修改nginx的端口为8080
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --add-port=8080/tcp
success

--remove-port=端口号/协议
        
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --remove-port=8080/tcp
success

--add-source=
        
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --permanent --add-source=172.25.254.1/24 --zone=trusted
[root@server1 ~]# firewall-cmd --reload

--remove-source=
        
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --permanent --remove-source=172.25.254.1/24 --zone=trusted
[root@server1 ~]# firewall-cmd --reload

--change-interface=网卡名
        
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --get-active-zones
public
  interfaces: eth1 eth0
trusted
  sources: 172.25.254.0/24
            
            
              bash
              
              
            
          
          #将网卡与区域进行关联
[root@server1 ~]# firewall-cmd --change-interface=eth1 --zone=trusted
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --get-active-zones
public
  interfaces: eth0
trusted
  interfaces: eth1
  sources: 172.25.254.0/24编辑域文件添加nginx服务
- 在/etc/firewalld/services/下添加nginx.xml文件,编辑完就会生效
            
            
              bash
              
              
            
          
          # 查看支持的服务列表
[root@server ~]# firewall-cmd   --get-services 
[root@server ~]# yum  install  nginx  -y
# 此时添加nginx服务会报错
[root@server ~]# firewall-cmd --permanent --add-service=nginx
Error: INVALID_SERVICE: Zone 'public': 'nginx' not among existing services
# 编辑服务配置文件,编辑完就生效
[root@server ~]# vim  /etc/firewalld/services/nginx.xml 
# 添加如下内容:
<service>
        <short>Nginx</short>
        <description>nginx</description>
        <port protocol="tcp"  port="80"/>
        <port protocol="tcp"  port="443"/>
</service>
[root@server ~]# firewall-cmd --permanent --add-service=nginx  
[root@server ~]# firewall-cmd  --reload 
#就会发现有nginx的服务
[root@server ~]# firewall-cmd   --get-services   firewalld富规则
- firewalld富规则:用于- 更细致、更详细的- 防火墙策略配置,它可以针对- 系统服务、端口号、源地址和目标地址等诸多信息进行更有- 正对性的- 策略配置
- firewalld富规则优先级最高


            
            
              bash
              
              
            
          
          # 如:
[root@server ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="源IP" service name="http"   reject'
            
            
              bash
              
              
            
          
          [root@server ~]# firewall-cmd  --permanent --add-rich-rule='rule family="ipv4" source address="192.168.80.130" protocol  value="icmp"  reject'
[root@server ~]# firewall-cmd  --reload 
[root@server ~]# firewall-cmd --list-all
# 测试:定位node1中进行ping  192.168.80.129  发现目标不可达firewalld的高级规则
- 通过firewall-cmd工具,可以使用--direct选项在运行时间里增加或者移除链。如果不熟悉iptables,直接使用接口非常危险,因为可能导致防火墙被入侵
- 直接端口模式适用于- 服务或程序,以便在- 运行时间内增加- 特定的防火墙规则
- 直接端口模式添加的- 规则优先应用
例子:仅允许172.25.254.1访问主机的8080端口
            
            
              bash
              
              
            
          
          #查看高级规则
[root@server1 ~]# firewall-cmd --direct --get-all-rules
#使用iptables查看链名
[root@server1 ~]# iptables -nL
            
            
              bash
              
              
            
          
          #添加高级规则
[root@server1 ~]# firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 1 -s 172.25.254.1 -p tcp --dport 8080 -j ACCEPT
            
            
              bash
              
              
            
          
          #查看
[root@server1 ~]# firewall-cmd --direct --get-all-rules
ipv4 filter IN_public_allow 1 -s 172.25.254.1 -p tcp --dport 8080 -j ACCEPT
            
            
              bash
              
              
            
          
          #移除高级规则
[root@server1 ~]# firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 1 -s 172.25.254.1 -p tcp --dport 8080 -j ACCEPTfirewalld做Linux路由器
准备2台主机
- 一台server1,一个nat网卡,一个仅主机网卡
- 一台server2,一个仅主机网卡
内网主机访问外网


            
            
              bash
              
              
            
          
          [root@server2 ~]# route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --permanent --add-masquerade
[root@server1 ~]# firewall-cmd --reload- 测试
            
            
              bash
              
              
            
          
          [root@server2 ~]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) 比特的数据。
64 比特,来自 183.2.172.42 (183.2.172.42): icmp_seq=1 ttl=127 时间=32.9 毫秒
64 比特,来自 183.2.172.42 (183.2.172.42): icmp_seq=2 ttl=127 时间=33.2 毫秒
64 比特,来自 183.2.172.42 (183.2.172.42): icmp_seq=3 ttl=127 时间=32.5 毫秒外网访问内网
- 当访问server1的22端口时,实际登录的是server2
            
            
              bash
              
              
            
          
          [root@server1 ~]# firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.0.200
- 测试
