firewalld防火墙配置

2023-10-26

firewalld是自CentOS 7以来带有一个动态的、可定制而无需重新启动防火墙守护程序或服务。firewall-cmd就是iptables/nftable的前端。在CentOS 8中,nftables取代iptables成为默认的Linux网络包过滤框架。本文介绍如何为您的CentOS 8设置防火墙,并借助firewall-cmd管理工具进行管理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
firewall-cmd 命令选项

  • block: 对于 IPv4,任何传入连接都会被 icmp-host-prohibited 消息拒绝,对于 IPv6 则是
    icmp6-adm-prohibited。
  • dmz:应用于你的DMZ区域的计算机,这些计算机可公开访问,但对内部网络的访问受到限制。仅接受选定的传入连接。
  • drop:任何传入连接都将在没有任何通知的情况下被丢弃。只允许传出连接。
  • external:用于在系统中充当路由器时启用 NAT 伪装的外部网络。只允许选定的传入连接。
  • home:用于家庭网络。仅接受选定的传入连接。
  • internal:用于内部网络,网络上的其他系统通常是可信任的。仅接受选定的传入连接。
  • public:用于公共区域,仅接受选定的传入连接。
  • trusted:接受所有网络连接。
  • work:用于工作区域,同一网络上的其他计算机大多受信任。仅接受选定的传入连接。

在这里插入图片描述
–get-zones 列出所有可用区域
–get-default-zone 查询默认区域
–set-default-zone= 设置默认区域
–get-active-zones 列出当前正使用的区域

–add-source=[–zone=] 添加源地址的流量到指定区域,如果无–zone= 选项,使用默认区域
–remove-source= [–zone=] 从指定区域中删除源地址的流量,如无–zone= 选项,使用默认区域
–add-interface=[–zone=] 添加来自于指定接口的流量到特定区域,如果无–zone= 选项,使用默认区域
–change-interface=[–zone=] 改变指定接口至新的区域,如果无–zone= 选项,使用默认区域

–add-service= [–zone=] 允许服务的流量通过,如果无–zone= 选项,使用默认区域
–add-port=<PORT/PROTOCOL>[–zone=] 允许指定端口和协议的流量,如果无–zone= 选项,使用默认区域
–remove-service= [–zone=] 从区域中删除指定服务,禁止该服务流量,如果无–zone= 选项,使用默认区域
–remove-port=<PORT/PROTOCOL>[–zone=] 从区域中删除指定端口和协议,禁止该端口的流量,如果无–zone= 选项,使用默认区域
–reload 删除当前运行时配置,应用加载永久配置

–list-services 查看开放的服务
–list-ports 查看开放的端口
–list-all [–zone=] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无–zone= 选项,使用默认区域

查看默认zone

firewall-cmd --get-default-zone

默认zone设为dmz

firewall-cmd --set-default-zone=dmz

在internal zone中增加源地址192.168.0.0/24的永久规则

firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24

在internal zone中增加协议mysql的永久规则

firewall-cmd --permanent –zone=internal --add-service=mysql

Firewalld防火墙白名单问题
在使用Firewalld防火墙创建白名单时,发现存在一个问题。

在使用rich rule创建规则时,端口转发规则会优先匹配,且在端口不开的情况下,参与端口转发的本地端口均可被所有IP访问。

解决方案就是,删除掉全局的端口转发,即:

<forward-port to-port="" protocol="" port=""/>

然后根据白名单设置允许的端口转发:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="xxx.xxx.xxx.xxx" forward-port port=xxxx protocol=xxx to-port=xxxx' --permanent

这样就可以使用白名单限制未经允许的IP访问参与转发的端口了。

顺便提供一个firewalld添加白名单的脚本,首先确保你的firewalld zone位于public:

ip_array=('xxx.xxx.xxx.xxx/xx' 'xxx.xxx.xxx.xxx/xx')
for ip in $(ip_array[@])
do
    firewall-cmd --add-rich-rule='rule family="ipv4" source address=$ip forward-port port=xxxx protocol=tcp to-port=xxxx' --permanent
done

https://blog.csdn.net/m0_37682535/article/details/105994877?utm_term=centos7.4%E9%99%90%E5%88%B6%E4%BB%85%E8%83%BD%E6%9F%90%E4%B8%AAip%E8%AE%BF%E9%97%AE%E6%9F%90%E4%B8%AA%E7%AB%AF%E5%8F%A3&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-6-105994877&spm=3001.4430

设置端口转发

端口转发是一种将任何传入网络流量从一个端口转发到另一个内部端口或另一台机器上的外部端口的方法。

注意:端口转发必须开启IP伪装。使用下面显示的命令为external区域启用伪装。

# firewall-cmd --permanent --zone=external --add-masquerade 

要检查是否为区域启用了 IP 伪装,请运行以下命令:

# firewall-cmd --zone=external --query-masquerade 
yes

显示yes,表示已经开启伪装。

要将端口重定向到同一系统上的另一个端口,例如:将80端口的所有数据包重定向到8080端口:

# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
success

如果要将流量转发到另一台服务器,例如:将所有 80 端口的数据包重定向到 IP 为 10.0.0.75 的服务器上的 8080 端口:

# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.0.75
success

例如,要允许来自特定源地址的流量,仅允许从特定子网连接到服务器,请运行以下命令:

# firewall-cmd --permanent --zone=home --add-source=192.168.1.0/24
success

要允许来自地址 192.168.0.0/24 的访问,请运行以下命令:

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success

在这里插入图片描述
要允许来自地址 192.168.0.0/24 的连接访问 ssh 服务,请运行以下命令:

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept'
success

在这里插入图片描述
要拒绝来自192.168.10.0/24的流量访问ssh服务,请运行以下命令:

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port=22 protocol=tcp reject'
success

在这里插入图片描述

加载新规则以生效

firewall-cmd --reload

开放和关闭端口

# firewall-cmd --list-ports 

# firewall-cmd --permanent --add-port=8080/tcp

# firewall-cmd --remove-port=8080/tcp

要一次添加多个服务,请执行以下命令。例如,要添加 http 和 https 服务,请运行以下命令:

# firewall-cmd --permanent --zone=home --add-service={http,https}
success

# firewall-cmd --info-service=samba
samba
  ports: 137/udp 138/udp 139/tcp 445/tcp
  protocols: 
  source-ports: 
  modules: netbios-ns
  destination: 

获取所有可用的区域

firewall-cmd --get-zones
  • block–拒绝所有传入的网络连接。仅从系统内部启动的网络连接是可能的。
  • dmz –经典非军事区(DMZ)区域,它提供对LAN的有限访问,并且仅允许选定的传入端口。
  • drop –丢弃所有传入网络连接,并且仅允许传出网络连接。
  • external-对于路由器连接类型很有用。您还需要LAN和WAN接口,以使伪装(NAT)正常工作。
  • home –适用于您信任其他计算机的局域网内的家用计算机,例如笔记本电脑和台式机。仅允许选择的TCP / IP端口。
  • internal–当您主要信任LAN上的其他服务器或计算机时,用于内部网络。
  • public–您不信任网络上的任何其他计算机和服务器。您仅允许所需的端口和服务。对于云服务器或您所托管的服务器,请始终使用公共区域。
  • trust–接受所有网络连接。我不建议将该区域用于连接到WAN的专用服务器或VM。
  • work–在信任同事和其他服务器的工作场所中使用。

配置firewalld

关闭iptable防火墙
systemctl mask iptables
systemctl mask ip6tables        

systemctl unmask firewalld         #执行命令,即可实现取消服务的锁定
systemctl mask firewalld         # 下次需要锁定该服务时执行
systemctl reloadt firewalld.service         #重载配置
systemctl is-enabled firewalld.service       #查看服务是否开机启动
systemctl list-unit-files|grep enabled #查看已启动的服务列表
firewall-cmd --list-ports       #查看所有打开的端口 
firewall-cmd --list-services      #查看所有允许的服务 

开启firewalld防火墙
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone public
firewall-cmd --list-ports       #查看所有打开的端口 
firewall-cmd --list-services      #查看所有允许的服务 
firewall-cmd --permanent --zone=public --list-all
firewall-cmd --permanent --zone=public --add-port 8080/tcp
firewall-cmd ---reload

端口转发

  1. 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开
    放监听了

  2. 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080        # 将80端口的流量转发至8080

firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1              # 将80端口的流量转发至192.168.0.1

firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080        # 将80端口的流量转发至192.168.0.1的8080端口

案例
rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率

rich规则示例

拒绝从192.168.0.11的所有流量,当address 选项使用source 或 destination
时,必须用family= ipv4 |ipv6.

firewall-cmd --permanent --zone=classroom --add-rich-rule='rule
family=ipv4 source address=192.168.0.11/32 reject‘

限制每分钟只有两个连接到ftp服务

firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m
accept

抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包

firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop

接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量

firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4
source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'

rich日志规则实例

接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息

firewall-cmd --permanent --zone=work --add-rich-rule='rule service
name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept

从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每
小时最大记录一条信息

firewall-cmd --add-rich-rule='rule family=ipv6 source
address="2001:db8::/64" service name="dns" audit limit value="1/h"
reject' --timeout=300

规则示例
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source
address=172.25. X .10/32 service name="http" log level=notice
prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://server X .example.com

伪装和端口转发
NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式
伪装NAT
firewall-cmd --permanent --zone= --add-masquerade
firewall-cmd --query-masquerade 检查是否允许伪装
firewall-cmd --add-masquerade 允许防火墙伪装IP
firewall-cmd --remove-masquerade 禁止防火墙伪装IP
示例:

firewall-cmd --add-rich-rule='rule family=ipv4 source
address=192.168.0.0/24 masquerade'

端口转发
端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。
通常要配合地址伪装才能实现
 firewall-cmd --permanent --zone= --add-forward-
port=port= :proto= [:toport= ][:toaddr
= ]
说明:toport= 和toaddr= 至少要指定一个
示例:
转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254

firewall-cmd --add-masquerade 启用伪装

firewall-cmd --zone=public --add-forward-
port=port=9527:proto=tcp:toport=80:toaddr=
192.168.0.254

rich规则

转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP

firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source
address=192.168.0.0/24 forward-port port=80 protocol=tcp to-
port=8080'

rich规则示例
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source
address=172.25. X .10/32 forward-port port=443 protocol=tcp to-
port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com

如何查找您的默认区域

如果您没有更改它,则默认区域设置为public,并且所有网络接口都分配给此区域,用户可以将网络接口和源分配给区域。其中一个区域设置为默认区域。要获取默认区域运行,请执行以下操作:

#firewall-cmd --get-default-zone
public

查看活动区域和分配给它们的网络接口,请执行以下操作:

firewall-cmd --get-active-zones

以下输出显示接口ens33和ens34已分配给public区域:
在这里插入图片描述

如何查看与公共区域关联的防火墙规则或服务

firewall-cmd --list-all           列出默认区域所有设置
firewall-cmd --list-all-zones          查看所有区域设置
firewall-cmd --get-default-zone  查看默认区域

在这里插入图片描述
可以看到流量与ssh、dhcpv6-client服务相关,则允许进入。
在这里插入图片描述
在这里插入图片描述

firewall-cmd --list-all --zone=public

在这里插入图片描述
从上面的输出中,我们可以看到public区域处于活动状态,并使用默认目标Reject。输出还显示该区域由eth0和eth1接口使用,并允许DHCP客户端和SSH流量。

  • default:不做任何事情
  • ACCEPT:接受数据包
  • REJECT 拒绝数据包,返回拒绝的信息
  • DROP:丢弃数据包,并且不做任何答应

要设置区域的target,请使用–zone选项指定区域,并使用–set-target选项指定目标。例如,要将公共区域的目标更改为DROP,您可以运行:

firewall-cmd --zone=public --set-target=DROP

创建新的区域

firewalld还允许您创建自己的区域。当您想要创建每个应用程序的规则时,这很方便。在以下示例中,我们将创建一个名为memcached的新分区,打开端口11211,并仅允许从IP地址192.168.100.30进行访问:

firewall-cmd --new-zone=visitors --permanent

放某些端口和添加

firewall-cmd --zone=visitors --add-port=80/tcp --permanent
firewall-cmd --zone=visitors --add-port=53/tcp --permanent
firewall-cmd --zone=visitors --add-source=10.10.2.0/24 --permanent

重新加载Firewalld守护程序以激活更改:

firewall-cmd --reload

如果CentOS 8上配置nginx,我需要使用firewall-cmd打开端口80/443。假设您不需要cockpit或dhcpv6-client等不必要的服务,可以通过修改规则将其删除。例如,删除服务dhcpv6-client和cockpit:

firewall-cmd --remove-service=cockpit --permanent
firewall-cmd --remove-service=dhcpv6-client --permanent
firewall-cmd --reload

运行时Firewalld配置更改是临时的。当您重新启动CetnOS8服务器时,它们就消失了。例如,以下命令将临时打开Nginx/Apache Web服务器的TCP端口80/443(Https):

firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --add-service=https

当您重新启动Linux机器或重新启动Firewalld服务本身时,不会保留上述规则。

如何将规则添加到永久集并重新加载Firewalld?只需将添加–permanent参数即可

firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --reload

如何查找Firewalld支持的服务列表

sudo firewall-cmd --get-services

前面都是预备的内容,下文才是firewalld的主体,如何向firewalld中添加规则

如何将服务添加到特定的区域?
指定特定的zone区域名称,并且使用–add-service添加服务名称

firewall-cmd --zone=public --add-service=dns --permanent

如何永久从区域中删除(删除)服务

firewall-cmd --zone=public --remove-service=dns --permanent

如何永久允许/打开TCP/UDP端口/协议

firewall-cmd --zone=public --add-port=8080/tcp --permanent

验证结构,可以使用以下命令验证

firewall-cmd --list-ports

如何永久拒绝/阻止TCP/UDP端口/协议

firewall-cmd --zone=public --remove-port=23/tcp --permanent

查看所有已开放的临时端口(默认为空):

firewall-cmd --list-ports;

查看所有永久开放的端口(默认为空):

firewall-cmd --list-ports --permanent;

添加临时开放端口:

firewall-cmd --add-port=8086/tcp;

添加永久开放的端口:

firewall-cmd --add-port=8086/tcp --permanent;

关闭临时端口:

firewall-cmd --remove-port=8086/tcp;

关闭永久端口:

firewll-cmd --remove-port=8086/tcp --permanent;

配置结束后需要输入重载命令并重启防火墙以生效配置:

firewall-cmd --reload;

systemctl restart firewalld;

打开端口和源IP

Firewalld还允许您快速启用来自可信IP地址或特定端口的所有流量,而无需创建服务定义

开放源IP

要允许来自特定IP地址(或范围)的所有传入流量,请使用–zone选项指定区域,并使用–add-source选项指定源IP。例如,要允许公共区域中来自192.168.172.32的所有传入流量,请运行:

firewall-cmd --zone=public --add-source=192.168.172.32

firewalld与ICMP控制

如何阻止和启用ICMP?
首先,使用以下命令检查我们正在使用的ICMP类型。

firewall-cmd --get-icmptypes

要查看ICMP请求当前是否被阻止,请执行以下操作:

firewall-cmd --zone=external --query-icmp-block=echo-request

如果返回no的话,要阻止ICMP请求,请执行以下操作:

firewall-cmd --zone=external --add-icmp-block=echo-request
firewall-cmd --zone=external --add-icmp-block=echo-reply
firewall-cmd --runtime-to-permanent

在这里插入图片描述
firewalld在icmp处理上有些bug,即便你已经使用持久配置了,也不会立即生效的,此时建议还是reload一下

在完全不提供任何信息的情况下阻止ICMP请求
要完全隐藏此信息,您必须丢弃所有ICMP请求,这是以前iptables防火墙一贯使用的DROP大法。

  • 首先,将external的target设定为DROP
firewall-cmd --zone=external --set-target=DROP --permanent
firewall-cmd --reload

验证external区域的target是否为DROP?
在这里插入图片描述
注意:不要迷信firewalld会对ICMP数据包的过滤会动态生效的,在没有reload之前,你原先在客户端测试icmp请求依然显式答应。

我们在192.168.50.0/24找其他主机测试一下ping是否没返回任何错误信息,如下图在一台Linux主机中显示"0 received 100% packet loss"

#ping10.10.10.10

direct规则配置

对所有HTTP和HTTPS流量执行相同的操作:

firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p tcp -m multiport --dport 80,443 \
-m state --state NEW,RELATED,ESTABLISHED \
-j ACCEPT

开放ssh端口

firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-p tcp --dport 22 \
-m state --state NEW,RELATED,ESTABLISHED \
-j ACCEPT

记录所有转发流量的日志

firewall-cmd --permanent --direct \
--add-rule ipv4 filter FORWARD 0 -i enp34 -o enp33 \
-j LOG --log-prefix "forward_traffic "

最后一条默认规则

firewall-cmd --permanent --direct 、
--add-rule ipv4 filter FORWARD 0 -i ens34 -o ens33 \
-j REJECT

配置完以上规则,我们重新加载firewalld

firewall-cmd --reload

黑名单管理

恶意IP地址的端口扫描
在这里插入图片描述
防止端口扫描为例,这个案例中会用到这些direct规则

ipv4 mangle PORT_SCANNING 0 -m recent --name portscan --rcheck --seconds 25200 -j DROP
ipv4 mangle PORT_SCANNING 1 -m recent --name portscan --remove
ipv4 mangle PORT_SCANNING 2 -p tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix port_scan:
ipv4 mangle PORT_SCANNING 3 -p tcp --dport 139 -m recent --name portscan --set -j DROP
ipv4 mangle PORT_SCANNING 4 -p tcp --dport 138 -m recent --name portscan --set -j LOG --log-prefix port_scan:
ipv4 mangle PORT_SCANNING 5 -p tcp --dport 138 -m recent --name portscan --set -j DROP
ipv4 mangle PORT_SCANNING 6 -p tcp --dport 137 -m recent --name portscan --set -j LOG --log-prefix port_scan:
ipv4 mangle PORT_SCANNING 7 -p tcp --dport 137 -m recent --name portscan --set -j DROP

根据前面一篇的日志管理,我们将防火墙日志保存在/var/log/iptables.log这个文件中,也就是上文第一个插图的日志记录。我们需要从日志中提取有用的源IP地址。你应该要想到“Python大法好,信Python得脱身!!”

  • 下面的python程序就是从/var/log/iptables.log日志文件中提取每行记录的跟源IP地址的关键字,
  • 并将这些源IP地址追加到一个集合中。
  • 最后将set集合中的ip地址逐行写入一个叫ipList.txt的文本当中

为什么要用set,而不用list呢?因为set数据接口可以除去重复的IP地址。这个Python程序没什么好说的,一目了然。

#!/usr/bin/python3 
import os,re

logFile='/var/log/iptables.log'
blkIpFile='~/iplist.txt'

ip_pat=re.compile(r'SRC=(\d+\.\d+\.\d+\.\d+)')

if not os.path.exists(logFile):
    raise FileNotFoundError("{}文件不存在!!".format(logFile))

keyWords=["port_scan","syn_attack"]

res=None
blackIPs=set()

with open(logFile,'r') as f:
    data=f.readlines()
    
    for line in data:
        for word in keyWords:
            if word in line:
                res=ip_pat.findall(line)
                if len(res):
                    print("找到源ip:{}".format(res[1]))
                    blackIPs.add(res[1])
                break
            #if
        #end-for
    #end-for
#end-with

if not os.path.exists(blkIpFile):
    raise FileNotFoundError("{}文件不存在".format(blkIpFile))

with open(blkIpFile,'w') as f:
    
    if len(blackIPs)==0:
        raise ValueError("参数blackIPs为空!!\n")
    for item in blackIPs:
        f.write("{}\n".format(item))
    #end-for
#end-with

运行上面的脚本后,我们可以查看iplist.txt这个文本,笔者都惊呆了,运行短短十多天的服务器居然遭到650多个恶意IP地址

接下来,需要用到firewalld的ipset选项,将上面的iplist.txt文件导入到firewalld的规则中,

ipset指定的IP地址集可以在防火墙区域中用作源地址过滤,也可以用作rich规则中的源地址。 在Red Hat Enterprise Linux 7中,首选方法是在direct规则中使用用firewalld创建的ipset。

以本文为例,创建一个名为“blk_src_ips”的ipset

firewall-cmd --permanent --new-ipset=blk_src_ips --type=hash:net

type选项中的hash:net对应的是ipv4的网络环境。 要创建用于IPv6的IP集,请添加–option = family = inet6选项。

接下来,就是使用–add-entries-from-file选项将iplist.txt的内容导入到blk_src_ips的ipset空间中

firewall-cmd --permanent --ipset=blk_src_ips --add-entries-from-file=~/iplist.txt

跟着,我们在drop区域中定义一条源规则,将blk_src_ips的地址集作为源规则的源IP,我们之所以要使用drop区域是因为drop区域默认就是任何绑定到该区域的IP地址或端口的数据包都一律丢弃。

firewall-cmd --permanent --zone=drop --add-source=ipset:blk_src_ips

最后一步,非常关键,一定要确保drop区域是防火墙最后要被执行的默认区域,因此一定要补上这条命令

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --reload

在这里插入图片描述
运行一段时间,或许你会发现的默认区域的策略已经生效了,PRE_drop这条链中正是匹配ipset:blk_src_ips这个地址集的,刚好有一个数据包被拦截并且丢弃,这样已经说明刚才的配置已经生效了。
在这里插入图片描述
由于我们的日志文件可能每天会捕获到来自不同恶意源ip地址的新记录。我们不可能都将上面的python脚本每天都人工执行一遍,此时可以使用crontab的任务计划让python脚本每天设定的时间点执行一次,自动让ipset规则刷新一次
通过sudo crontab -e 命令,配置如下任务计划,让其在每天凌晨0点开始执行

 0 0 * * * ~/set_ip.py

rich规则是运行10.10.10.4的一台主机访问防火墙的ssh端口

firewall-cmd --zone=internal --add-rich-rule="rule \
family=ipv4 source address=10.10.10.4/32  \
service name=ssh log prefix=\"ssh connect:\" 
level=\"notice\" accept"

为以下几种攻击类型的添加以下目标动作的chain

  • 端口扫描 chain名称是PORT_SCANNING
  • IP欺骗,chain名称是SPOOFING
  • sync攻击,chain名称是SYN_ATTACK
  • tcp泛洪,chain名称是TCP_FLOOD
firewall-cmd --permanent --direct --add-chain ipv4 filter PORT_SCANNING
firewall-cmd --permanent --direct --add-chain ipv4 filter SPOOFING
firewall-cmd --permanent --direct --add-chain ipv4 filter SYN_ATTACK
firewall-cmd --permanent --direct --add-chain ipv4 filter TCP_FLOOD

https://www.jianshu.com/p/b84315f4ea6c

实用实例

针对指定IP
允许指定ip的所有流量

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" accept" # 表示允许来自192.168.2.1的所有流量

允许指定ip的指定协议

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept" # 允许192.168.2.208主机的icmp协议,即允许192.168.2.208主机ping

允许指定ip访问指定服务

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept" # 允许192.168.2.208主机访问ssh服务

允许指定ip访问指定端口

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" port protocol="tcp" port="22" accept" # 允许192.168.2.1主机访问22端口

指定网段
将指定ip改为网段

firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept"

表示允许192.168.2.0/24网段的主机访问22端口 。

禁止指定ip/网段

各个命令中,将 accept 设置为 reject表示拒绝,设置为 drop表示直接丢弃(会返回timeout连接超时)

表示禁止192.168.2.0/24网段的主机访问22端口 。

firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" reject"

源自此IP或子网的流量导向指定的区域。

  • –permanent代表永久设置
  • -reload 代表使用永久设置立马生效。
  • –zone代表设置的区域
  • 不写就是默认区域。
firewall-cmd --permanent --zone=public --add-source=192.168.0.0/24

firewall-cmd --permanent --zone=public --remove-source=192.168.0.0/24

添加或移除mysql服务

firewall-cmd --permanent --zone=public --add-service=mysql

firewall-cmd --permanent --zone=public --remove-service=mysql

添加或移除端口

firewall-cmd --permanent --zone=public --add-port=3306

firewall-cmd --permanent --zone=public --remove-port=3306

允许或取消icmp协议流量,即ping

firewall-cmd --zone=drop --add-protocol=icmp

firewall-cmd --zone=drop --remove-protocol=icmp

生产可用

查看所有打开的端口

firewall-cmd--zone=public --list-ports

查看区域信息

firewall-cmd--get-active-zones

查看指定接口所属区域

firewall-cmd--get-zone-of-interface=eth0

将规则同时添加到持久规则集和运行时规则集中

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=http

要得到所有区域的配置

sudo firewall-cmd --list-all-zones

防火墙的区域
要找到默认区域

sudo firewall-cmd --get-default-zone

要修改默认区域

sudo firewall-cmd --set-default-zone=internal

要查看你网络接口使用的区域

sudo firewall-cmd --get-active-zones

要得到特定区域的所有配置

firewall-cmd --zone=public --list-all

在这里插入图片描述
要启用或禁用 HTTP 服务

sudo firewall-cmd --zone=public --add-service=http --permanent
启用http和https
sudo firewall-cmd --permanent --add-service={http,https} --permanent

sudo firewall-cmd --zone=public --remove-service=http --permanent

允许或者拒绝任意端口/协议
比如:允许或者禁用 12345 端口的 TCP 流量

sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

下面是在同一台服务器上将 80 端口的流量转发到 12345 端口

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

用 FirewallD 构建规则集
将 eth0 的默认区域设置为 dmz。 在所提供的默认区域中,dmz(非军事区)是最适合于这个程序的,因为它只允许 SSH 和 ICMP

sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0

把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中

sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent

sudo firewall-cmd --reload     重新加载 FirewallD 让规则立即生效

如果你运行 firewall-cmd --zone=dmz --list-all, 会有下面的输出

dmz (default)
  interfaces: eth0
  sources:
  services: http https ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

高级配置
允许来自主机 192.168.0.14 的所有 IPv4 流量

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'

允许从特定子网/ IP访问端口

$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" service name="ssh"

source address="192.168.0.12/32" accept' --permanent

拒绝来自主机 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'

在这里插入图片描述
允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量,并将流量转发到 6532 端口上

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'

将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade)

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'

列出你目前的丰富规则

sudo firewall-cmd --list-rich-rules




扩展

本章节的复习作业

1:红帽RHEL7系统中iptables已经被firewalld服务彻底取代?

答案:错,在系统中iptables和firewalld服务均可使用。

2:请您简述下防火墙拒绝规则中的DROP和REJECT动作有何不同之处?

答案:DROP动作是丢包,不响应,而REJECT动作是拒绝请求,回应给对方拒绝信息。

3:如何把iptables服务的INPUT规则链默认策略设置为DROP动作?

答案:执行命令iptables -P INPUT DROP后即可生效。

4:使用iptables命令配置禁止来自于192.168.10.0/24网段访问本机sshd服务(22端口)的防火墙策略应该怎么写?

答案:执行命令iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j REJECT后即可生效。

5:请您简述下firewalld防火墙管理工具的zone区域作用?

答案:咱们可以依据不同的工作场景来调用不同的firewalld区域,实现对大量防火墙策略的快速切换。

6:如何在firewalld防火墙管理工具中把默认的zone区域设置为dmz?

答案:执行命令firewall-cmd --set-default-zone=dmz后即可生效。

7:如何让firewalld防火墙管理工具中永久生效策略(Permanent)立即生效可用呢?

答案:执行命令firewall-cmd --reload后即可生效。

8:使用SNAT源地址转换协议的目的是什么?

答案:SNAT源地址转换协议是为了解决IP地址资源匮乏问题而设计的技术协议,SNAT技术能够使得多个内网用户通过一个外网IP地址上网。

9:Tcp_wrappers服务分别有允许策略配置文件和拒绝策略配置文件,请问匹配顺序是怎么样的?

答案:Tcp_wrapper会依次匹配允许策略配置文件→拒绝策略配置文件,如果都没有匹配到也会默认放行流量。

1、防火墙报错
WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.
在这里插入图片描述
解决办法 :
在vim编辑器命令模式输入 /AllowZoneDrifting 进行搜索,然后将yes更改为no,按ESC键退出编辑模式到命令模式,输入:wq 保存退出。

#vi /etc/firewalld/firewalld.conf

在这里插入图片描述

# systemctl start firewalld.service 
# systemctl status firewalld.service

在这里插入图片描述

参考链接 :

https://www.linuxprobe.com/linux-firewall-rules.html
Linux中配置Firewalld:添加、删除、启用和禁用防火墙规则和区域
https://www.ywnz.com/linuxaq/9235.html

https://www.jianshu.com/p/ec18f9faaa69

3篇:Linux防火墙-firewalld与ICMP控制 :https://www.jianshu.com/p/0b456b13a716

第6篇:Linux防火墙 direct规则配置 :
https://www.jianshu.com/p/69f56f2b3a36

第11篇:Linux防火墙 黑名单管理 :
https://www.jianshu.com/p/6ca7ec4c914d

第9篇 Linux防火墙-日志管理
https://www.jianshu.com/p/b84315f4ea6c

第9篇:Linux rsyslog日志服务
https://www.jianshu.com/p/166fc8c7bd55

第1篇:Linux防火墙-firewalld配置
https://www.jianshu.com/p/ec18f9faaa69

CentOS 上的 FirewallD 简明指南
https://www.linuxprobe.com/centos-firewalld-linux.html

https://www.linuxprobe.com/firewall-iptables.html

https://www.jianshu.com/p/64bda2ed387f

https://www.cnblogs.com/stulzq/p/9808504.html

第8章 Iptables与Firewalld防火墙
https://www.ywnz.com/linuxpx/232.html

如何在 Linux 中配置 firewalld 规则
https://www.linuxprobe.com/linux-firewall-rules.html

在Ubuntu 18.04/16.04系统上安装和使用Firewalld的方法
https://ywnz.com/linuxaq/4293.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

firewalld防火墙配置 的相关文章

  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 迭代哈希数组

    我编写了下面的例程 迭代哈希值 0 7 并打印出每个哈希值中特定键的值 我需要获取每个哈希中 b4 的值 我想取消 0 7 当存在不同数量的哈希值时使用更智能的东西 例如 有时只有 2 个 也可能有 160 个 my out decode
  • Perl Tk 模块有哪些缺点?

    与在 Perl 中创建 GUI 的其他解决方案相比 Tk 模块有哪些缺点 我最近浏览了 Perl 的各种 gui 模块 这是我的总结 免责声明 最终我发现现有模块都不能满足我的需求 所以我开始编写自己的 gui 工具包 Tk 工作起来很不错
  • 如何在线程创建和退出时调用函数?

    include
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Perl YAML 模块无法识别标量类型

    我加载以下 yaml 文件 foo bar s 1 hx 0x34 用这段代码 use YAML qw LoadFile Dump use Data Dumper my d LoadFile test yaml print Dumper d
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • Perl 非贪婪

    我遇到非贪婪正则表达式 regex 的问题 我已经看到有关于非贪婪正则表达式的问题 但它们没有回答我的问题 Problem 我正在尝试匹配 lol 锚点的 href Note 我知道这可以通过 Perl HTML 解析模块来完成 我的问题是
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 使用 Perl 获取 值

    因此 我有一个报告工具 可以在 HTML 文件中输出作业调度统计信息 并且我希望使用 Perl 来使用这些数据 但我不知道如何单步浏览 HTML 表 我知道如何使用 jQuery 来做到这一点 find tr each function v
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的

随机推荐

  • 在Windows 10上安装WSL2

    TOC WSL2 在Windows10上安装 前提条件 是否支持Virtualization WSL2 是基于hyper V的 所以windows 机器必须支持虚拟化 如果是虚机的那就要支持嵌套的虚拟化 网上一堆看BIOS的太麻烦了 简单的
  • 【ffmpeg教程】【无损快速转换】两行代码 快速无损转换mkv flv视频文件 第一期

    ffmpeg教程 无损快速转换 两行代码 快速无损转换mkv flv视频文件 第一期 前言 环境准备 脚本编写 运行脚本 前言 视频版教程 无损快速转换 两行代码 快速无损转换mkv flv视频文件 导入Premiere教程 环境准备 工具
  • C#中得到两个数百分比 (转)

    此方法得到的百分比后小数太多 不行 double percent Convert ToDouble 2 Convert ToDouble 34 string result percent 100 ToString 得到的是5 8823529
  • 如何处理VS联合Qt没有ui_.h文件

    首先声明我使用的是VS2019 QT5 9 0 在初学VS联合QT时 发现自己VS中的资源管理器中没有ui h文件 在网上搜寻了一些解决方案 得出的大致结论就是 现在版本的VS中已经不会自动生成GeneratedFiles文件夹 那么其中的
  • 【数据结构与算法】深入浅出递归和迭代的通用转换思想

    深入浅出递归和迭代的通用转换思想 一般来说 能用迭代的地方就不要用递归 理论上讲 所有的递归和迭代之间都能相互转换 刷题碰到 一天一道LeetCode 130 Surrounded Regions所以来总结一下递归和迭代 一 何为迭代 首先
  • Microsoft365与Office到底啥区别?如何选择下载安装哪个版本?

    Microsoft 365 是一种订阅服务 可确保你始终拥有最新的 Microsoft 新式生产力工具 存在针对家庭和个人 中小型企业 大型企业 学校以及非营利组织的 Microsoft 365 计划 适用于家庭和商业的 Microsoft
  • 如何做好“向上管理”

    mghio 读完需要 10分钟 速读仅需 4 分钟 0 什么是 向上管理 向上管理用一句话来描述就是 在工作中为了取得更好的工作成果 有意识地配合你的领导一起工作的过程 请注意这里的有意识这个词 1 为什么要 向上管理 首先先来看看领导眼中
  • pthread_mutex_lock用法

    条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制 主要包括两个动作 一个线程等待 条件变量的条件成立 而挂起 另一个线程使 条件成立 给出条件成立信号 为了防止竞争 条件变量的使用总是和一个互斥锁结合在一起 条件变量是利用线程
  • 9.1-深度生成模型

    文章目录 图像处理 创作 PixelRNN 练习生成模型 自动编码器 宝可梦生成 图像处理 创作 有关generation model 这里有一篇很好的reference 在这篇reference里开头引用Richard Feynman的话
  • 【Tool】制作多系统启动盘

    前言 我一个U盘 64G的 总不能只装一个ubuntu就不能用了吧 所以百度一大堆多系统启动盘的软件 太难搞了 我灵机一动 我512G的硬盘都能分为两个区分别做系统区和存储区 为什么u盘不能分好几个区装好几系统呢 步骤 思路 把系统盘文件复
  • java smtp怎么开启_java-一个简单的本地SMTP

    java 一个简单的本地SMTP 我想测试用于发送电子邮件的Java代码 我不想使用任何商业邮件客户端或连接到任何外部邮件提供商 例如Gmail或Yahoo 我想知道是否存在允许用户配置虚拟电子邮件地址和服务器 本地 的软件 这些软件可以在
  • mac编程提示 Undefined symbol: _OBJC_CLASS_$_xxxx

    使用cocoa编程 编译提示报错 Showing All Issues Undefined symbol OBJC CLASS NSAlert 解决办法 link Binary With Libraries 添加 Foundation fr
  • TNS-12542: TNS: 地址已被占用

    TNS 12542 TNS 地址已被占用 监听该对象时出错 DESCRIPTION ADDRESS PROTOCOL TCP HOST HKY PORT 1521 TNS 12560 TNS 协议适配器错误 TNS 00512 地址已在使用
  • rocketMq中文文档

    title 用户指引 date 2017 12 29 categories 文档翻译 为什么是RocketMQ 动机 在早期阶段 我们在ActiveMQ 5 x 早于5 3 的基础上构建我们的分布式消息中间件 我们的跨国业务使用它来实现异步
  • 将Go程序打包成Docker镜像

    将Go程序打包成Docker镜像 1 Go程序 hello go 文件的内容 package main import fmt func main fmt Println hello world 2 编写Dockerfile文件 FROM g
  • 练习:可迭代的对象和四个函数—— enumerate()、zip()、map()、filter()

    Python 官网 https www python org 这里 才 python 前沿 可惜是英文原版 所以 我要练习英文阅读 我的CSDN主页 My Python 学习个人备忘录 我的HOT博 自学并不是什么神秘的东西 一个人一辈子自
  • a标签的用法,base标签用法

    在前端开发中 经常会遇到 a标签 超链接 a 标签定义超链接 用于从一张页面链接到另一张页面 a 元素最重要的属性是 href 属性 它指示链接的目标 超链接 a href http www baid com target blank 跳转
  • Unity游戏项目_3D迷宫(游戏源码免费)

    目录 一 效果图 二 讲解 三 资源分享 总结 一 效果图 游戏开始界面 游戏画面 游戏结束界面 二 讲解 主要代码如下 1 链接代码 using System Collections using System Collections Ge
  • 浅拷贝与深拷贝

    目录 什么是拷贝 浅拷贝 前端浅拷贝方法 java后端深拷贝方法 深拷贝 前端深拷贝方法 java后端深拷贝方法 需要注意的事情 什么是拷贝 拷贝是指对对象进行复制的操作 是为了创建一个与原对象具有相同值的新对象 以便在不改变原对象的情况下
  • firewalld防火墙配置

    firewalld是自CentOS 7以来带有一个动态的 可定制而无需重新启动防火墙守护程序或服务 firewall cmd就是iptables nftable的前端 在CentOS 8中 nftables取代iptables成为默认的Li