firewalld详解

华子目录

firewalld服务iptables服务区别

  • iptables是基于Linux内核netfilter子系统构建的,直接操作netfilter;而firewalld则通过libnftables库netfilter交互,提供了一个更高的抽象层
  • iptables使用基于表规则集,包括filter,nat,mangle,raw,security五个表;firewalld采用基于区域规则集,包括default,public,internal,external,dmz9区域
  • iptables配置较为复杂,需要用户掌握特定的命令行语法firewalld提供了更直观和灵活配置方式支持命令行图形界面
  • firewalld默认动作拒绝,则每个服务需要设置允许才能放行,而iptables默认每个服务允许,需要拒绝才能限制
  • 由于firewalld通过libnftables库netfilter交互,其性能相对于直接操作netfilter的iptables来说较低

9firewalld域

  • 开启firewalld后,数据包必须要经过某个域才能入站或出站
  • 每个域都有一个处理行为defaultacceptrejectdrop

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域
  • 常用域为:trustedblockpublic

域文件中的过滤规则

过滤规则优先级

  • 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

firewalldLinux路由器

准备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 毫秒

外网访问内网

  • 当访问server122端口时,实际登录的是server2
bash 复制代码
[root@server1 ~]# firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.0.200
  • 测试
相关推荐
itachi-uchiha42 分钟前
XX服务器上的npm不知道咋突然坏了
运维·服务器·npm
小丑西瓜66642 分钟前
网络基础概念
linux·网络·tcp/ip·c/c++
^毛小兔^1 小时前
[IDE]Linux下便携式GCC/G++编译器
linux·运维·ide
一只小鱼儿吖1 小时前
数据采集:各地区动态IP数据质量差异分析
网络·网络协议·tcp/ip
XY.散人1 小时前
初识Linux · 网络基础
网络
良许Linux1 小时前
循迹模块详解
linux
开心工作室_kaic1 小时前
springboot430校园食堂订餐系统boot(论文+源码)_kaic
运维·服务器·数据库·vue.js·旅游
silver6871 小时前
linux中top命令详解
linux
碧水澜庭1 小时前
k8s中用filebeat文件如何收集不同service的日志
运维·云原生·kubernetes
黑客Ela2 小时前
网络安全产品之认识防火墙
网络·web安全·php