firewalld详解

华子目录

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 ACCEPT

firewalld做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
  • 测试
相关推荐
小白的码BUG之路6 小时前
linux -- ssh两台机器相连
运维·服务器·ssh
2603_969579286 小时前
备份最常用的三个软件是什么软件
网络
缓慢更新8 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Data_Journal8 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
续写烂尾8 小时前
贴片 SD NAND、eMMC、TF 卡规格怎么定?硬件工程师选型清单
运维·服务器·网络
不昀8 小时前
网口Link Up后仍然掉线,怎样区分物理链路和数据通路问题?
linux·以太网
重生之高冷汉堡包8 小时前
移动代理 VS 住宅代理IP:性能成本对比与选择
网络
迪康妍妍8 小时前
终端管控实操:封堵网盘与IM外发通道的落地思路
运维·网络·安全·架构·安全性测试
sxgzzn9 小时前
如何选择合适的开关柜在线监测工具?
运维·重构·无人机·开关柜局放在线监测·光伏运维管理系统
科技小E9 小时前
监控设备品牌杂乱无法互通?EasyGBS打通孤岛,统一汇聚视频
服务器·网络·音视频