Firewalld基本使用方法、及Firewalld 中 ipset的使用示例

firewalld 官方操作文档

https://qiniu.wsfnk.com/bokefiles/Red_Hat_Enterprise_Linux-9-Configuring_firewalls_and_packet_filters-zh-CN.pdf

firewalld的区域zone介绍(默认共9个,其中public是默认区域)、及配置文件介绍

file

# 每个zone区域都有对应的配置文件
    /usr/lib/firewalld/zones/         # zone配置文件目录
    /etc/firewalld/zones/public.xml   # 具体的zone规则配置文件

#配置文件结构(非常简单,主要有两个文件和三个目录)
    文件:firewalld.conf、lockdown-whitelist.xml
    目录:zones、services、icmptypes

#修改firewalld配置文件的方法(主要是三种)
    1、firewall-config:是图形化工具
    2、firewall-cmd: 命令行工具
    3、直接编辑xml文件

firewall常规操作

firewall-cmd --state        ##查看防火墙的状态

firewall-cmd --get-icmptypes        ##查看支持的所有ICMP类型
firewall-cmd --get-zones            ##查看所有区域
firewall-cmd --get-default-zone ##查看当前的默认区域
firewall-cmd --get-active-zones ##查看当前正在使用的区域
firewall-cmd --get-services     ##查看当前区域支持的服务
firewall-cmd --list-services        ##查看当前区域开放的服务列表
firewall-cmd --list-all         ##查看此区域内的所有配置,类似与iptables -L -n

firewall-cmd --zone=public --list-ports         # 查看开放的端口
firewall-cmd --reload       ##重载防火墙规则,不会中断连接,清除临时配置,加载配置文件中的永久配置
firewall-cmd --complete-reload ##重载防火墙,中断用户的连接(清除规则,重建规则,在更新之前首先会将策略设置为DROP,等更新完成之后再恢复为ACCEPT)

firewall-cmd --runtime-to-permanent     ## 保存当前配置到配置文件

firewall-cmd --get-active-zones                 # 查看激活的域
firewall-cmd --zone=public --list-rich-rules    # 查看添加的规则
firewall-cmd --set-default-zone=work ##更改默认的区域,
firewall-cmd --permanent --zone=public --set-target=<default|ACCEPT|REJECT|DROP>  # 为public区域设置默认的应对动作

firewall-cmd --query-masquerade     # 检查是否允许伪装IP(查询SNAT的状态)
firewall-cmd --add-masquerade       # 允许防火墙伪装IP(开启SNAT-源地址转换)
firewall-cmd --remove-masquerade    # 禁止防火墙伪装IP

firewalld判断次序

#对于一个接收到的请求具体使用哪个zone,firewalld是通过三种方式来判断的:
    1、source,来源地址
    2、Interface,接收请求的网卡
    3、firewalld配置的默认区域(zone)
这三个方式的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去找,如果前两个都找不到才会使用第三个默认区域。

#查询drop区域是否允许请求ssh和https服务的流量
    firewall-cmd --zone=drop --query-service=ssh
    firewall-cmd --zone=drop --query-service=https

新建--add或删除--remove规则:

--add-source=192.168.1.1            ##添加源地址的流量到指定区域
--remove-source=192.168.1.1         ##删除源地址的流量到指定区域
--remove-service=http               ##在home区域内将http服务删除在开放列表中删除

--add-forward-port=port=513:proto=tcp:toport=22:toaddr=192.168.100.101 ##端口转发

示例(Tips:--permanent 表示永久生效,但需--reload才生效)

# 1、紧急模式
firewall-cmd --panic-on     ## 启用应急模式,立即强制关闭所有网络连接
firewall-cmd --panic-off    ## 取消应急模式,但需要重启firewalld后才可以远程ssh
firewall-cmd --query-panic  ## 查看是否为应急模式

# 2、服务管理
firewall-cmd --get-services     ## 查看当前区域支持的服务
firewall-cmd --list-services    ## 查看当前区域开放的服务列表
firewall-cmd --add-service=https        ## 添加https服务
firewall-cmd --add-service={http,ntp}   ## 添加http,ntp多个服务
firewall-cmd --remove-service=https     ## 移除https服务

# 3、端口管理(单端口,多端口,端口范围)
firewall-cmd --list-ports           ## 查看开放的端口
firewall-cmd --add-port=80/tcp      ## 添加开放TCP 80端口
firewall-cmd --remove-port=80/tcp   ## 移除关闭TCP 80端口
firewall-cmd --add-port={80/tcp,8080/tcp} --permanent   ## 添加多个端口
firewall-cmd --add-port=5000-10000/tcp --permanent  ## 将端口范围添加到开放列表中;
firewall-cmd --zone=public --add-port=8388-8389/tcp     ## 开放TCP 8388-8389 端口范围

# 4、协议管理
firewall-cmd --list-protocols       ## 查看允许的协议
firewall-cmd --add-protocol=icmp    ## 开放icmp协议(即允许ping)
firewall-cmd --remove-protocol=l2tp ## 取消l2tp协议

# 5、网卡所在区域管理
firewall-cmd --get-active-zones     ## 查看各网卡所在区域
firewall-cmd --zone=public --query-interface=eth0       ## 查询eth0是否处于public区域
firewall-cmd --zone=public --remove-interface=eth1      ## 将eth1从public区域移除
firewall-cmd --zone=public --add-interface=eth1         ## 将eth1添加到public区域
firewall-cmd --zone=drop --change-interface=eth1        ## 将eth调整到drop区域

Rich(富)规则:

当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
.rich-rules 富规则,功能强,表达性语言,查看帮助:man 5 firewalld.richlanguage
.rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率
rich规则实施顺序有以下四点
    a.该区域的端口转发,伪造规则
    b.该区域的日志规则
    c.该区域的允许规则
    d.该区域的拒绝规则
每个匹配的规则都生效,所有规则都不匹配,该区域默认规则生效;

Rich规则选项:

--add-rich-rule='rule'        ##新建rich规则
--remove-rich-rule='rule' ##删除rich规则
--query-rich-rule='rule'  ##查看单条rich规则
--list-rich-rules           ##查看rich规则列表

Rich规则示例:

#拒绝ipv4|ipv6的8081端口流量
    firewall-cmd --remove-rich-rule='rule family="ipv4" port port="8081" protocol="tcp" drop'
    firewall-cmd --remove-rich-rule='rule family="ipv6" port port="8081" protocol="tcp" drop'

#拒绝来自192.168.0.11的所有流量
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
    #firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.11 reject'       # 不写掩码也行
    #firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.11 drop'     # drop也行

#拒绝来自192.168.0.11对http服务的访问
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 service name=http reject'

# 对 192.168.1.30 开放TCP 22端口
    firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.30/32" port protocol="tcp" port="22" accept'

# 拒绝 192.168.2.0/24网段 访问TCP 22端口
    firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" drop'
    # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" reject'

# 允许ipv6地址为2001:db8::/64子网的主机访问dns服务,并且每小时审核一次,300秒后自动取消(注意timeout在最后,且不在引号内)
    firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

#限制每分钟只有两个连接到ftp服务
    firewall-cmd --add-rich-rule='rule service name=ftp limitvalue=2/m accept'

#抛弃esp协议的所有数据包
    firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'

#接受所有192.168.1.0/24子网端口范置7900-7905的TCP流量
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'

防火墙端口转发策略

参考文章 https://www.cnblogs.com/hujinzhong/p/12603348.html
参考文章 https://www.ziji.work/centos/centos7-firewall-drop-ip.html
参考文章 https://www.cloudduo.cn/centos7x-firewall.html

#将原本访问本机888端口的流量转发到本机22端口
    firewall-cmd --add-forward-port=port=888:proto=tcp:toport=22

#将原本访问本机888端口的流量转发到ip为192.168.2.208的主机的22端口,需要开启masquerade
    firewall-cmd --add-masquerade
    firewall-cmd --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.2.208

#伪装,将来自局域网192.168.2.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址
    firewall-cmd --add-masquerade
    firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"

##开启SNAT
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'

##使用rule规则实现端口转发,to-addr选项如果不指定默认转发到本机
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.100.0/24 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.100.100'

firewalld 中 使用 ipset 做封堵策略(Tips:创建blacklist 必须使用 --permanent)

  1. Tips:ipset是ip地址的集合, firewalld使用ipset可以在一条规则中处理多个ip地址, 执行效果更高​对ip地址集合的管理也更方便
  2. Tips:与iptables所用的ipset命令的不同,不要混合使用firewall-cmd的ipset参数与linux平台上的ipset命令,避免引起冲突,
  3. Tips:firewalld的ipset会记录到/etc/firewalld/ipsets/目录下
## 基本参数注意事项
    #--new-ipset=sshblock   # 指定新ipset的名字为:sshblock
    #--type=hash:ip         # 指定类型为 hash:ip,这种形式不允许重复而且只有一个ip
                            # type选项中的hash:net对应的是ipv4的网络环境。 要创建用于IPv6的IP集,请添加--option = family = inet6

## firewalld 中 ipset 的常见用法命令介绍
    # 查看名为 blacklist 的ipset 列表文件内容
    cat /etc/firewalld/ipsets/blacklist.xml

    # 列出所有的ipsets(会得到 现有的 ipset 名称列表)
    firewall-cmd --permanent --get-ipsets
    #打印ipset的路径(会得到 /etc/firewalld/ipsets/blacklist.xml)
    firewall-cmd --permanent --path-ipset=blacklist
    #打印ipset的所有entry(会得到一行一个ip段儿)
    firewall-cmd --permanent --ipset=blacklist --get-entries

    #打印ipset的内容
    [root@OSS ipsets]# firewall-cmd --permanent --info-ipset=blacklist
    blacklist
    type: hash:ip
    options: 
    entries: 114.114.114.114 192.168.31.41

    # 删除一个ipset
    firewall-cmd --permanent --delete-ipset=blacklist
    # 在ipset中添加ip或 删除ip
    firewall-cmd --permanent --ipset=blacklist --add-entry=1.1.1.1
    firewall-cmd --permanent --ipset=blacklist --remove-entry=1.1.1.1
    # 把一个ipset 加入到禁止的规则
    firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset="blacklist" drop'
    # ipset 允许访问80、443端口
    firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset="china_ip"  port port=80 protocol=tcp accept'
    firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source ipset="CN"  port port=443 protocol=tcp accept'

## 场景C、导入现有ipset列表,然后做封堵动作(注意ip列表格式,一行一个)
    [root@TiGo2 ~]# cat nj_ip_list.txt 
    1.1.1.1/32
    192.168.31.0/24
    firewall-cmd --permanent --new-ipset=nj_ip --type=hash:net
    firewall-cmd --permanent --ipset=nj_ip --add-entries-from-file=nj_ip_list.txt

## 场景A、封禁ip
    # 1、firewalld 创建名为 blacklist 类型为 hash:ip 的 ipset 列表(当然你也可以直接使用ipset创建)
    firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
    # 2、向blacklist 添加ip
    firewall-cmd --permanent --ipset=blacklist --add-entry=222.222.222.222
    # 3、firewall 封禁 blacklist
    firewall-cmd --permanent --add-rich-rule='rule source ipset=blacklist drop'

## 场景B、封禁ip网段
    # 1、firewalld 创建名为 blacknet 类型为 hash:net 的 ipset 列表(当然你也可以直接使用ipset创建)
    firewall-cmd --permanent --new-ipset=blacknet --type=hash:net
    # 2、向blacklist 添加ip
    firewall-cmd --permanent --ipset=blacknet --add-entry=192.168.31.1/24
    # 3、firewall 封禁 blacknet
    firewall-cmd --permanent --add-rich-rule='rule source ipset=blacknet drop'
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/478.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2024/10/12作者: 辣条①号

目标:网络规划设计师、系统工程师、ceph存储工程师、云计算工程师。 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录