centos从iptables到firewalld
2021-09-15 17:46:19 阿炯

CentOS从7.0 开始将原先的防火墙iptables换成了FirewallD。FirewallD支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项,被称作动态管理防火墙,也就是说不需要重启整个防火墙便可应用更改。CentOS 7默认安装了firewalld,若没有安装,执行 yum install firewalld firewalld-config安装,其中firewalld-config是GUI工具。

Firewalld开源防火墙守护程序诞生于2011年,2021年Firewalld才发布了 1.0 版本,2023年6月下旬2.0版本正式发布,2.0 更新内容如下:
增加了对 NFTables flowtable 的支持,它是一种软件快速路径,可以显著提高转发性能;
启用NftablesFlowtable,将网络转发的iperf性能提高了59%左右;
增加了一个新的区域优先级功能;
取消了TFTP客户端服务;
增加了对服务文件的支持,以处理许多游戏的防火墙配置;
为Zabbix Java Gateway、Zabbix Web Service、OpenTelemetry等添加了服务文件。

发行信息可见GitHub地址


目录
netfilter
iptables
FirewallD
相关文章

netfilter


iptables、firewalld这些软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核的netfilter完成的。netfilter是Linux 2.4内核引入的包过滤引擎。由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。iptables、firewalld等等都是在用户空间修改过滤表规则的便捷工具。

Linux内部结构可以分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间


netfilter在数据包必须经过且可以读取规则的位置,共设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中:
PREROUTING 数据包刚进入网络接口之后,路由之前
INPUT 数据包从内核流入用户空间
FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤
OUTPUT 数据包从用户空间流出到内核空间
POSTROUTING 路由后,数据包离开网络接口前

链其实就是包含众多规则的检查清单,每一条链中包含很多规则。当一个数据包到达一个链时,系统就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则就继续检查下一条规则,如果该数据包不符合链中任一条规则,系统就会根据该链预先定义的默认策略来处理数据包。

当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出


可以看出,刚从网络接口进入的数据包尚未进行路由决策,还不知道数据要走向哪里,所以进出口处没办法实现数据过滤,需要在内核空间设置转发关卡、进入用户空间关卡和离开用户空间关卡。

iptables

iptablses按照用途和使用场合,将5条链各自切分到五张不同的表中。也就是说每张表中可以按需要单独为某些链配置规则。例如,mangle表和filter表中都能为INPUT链配置规则,当数据包流经INPUT位置(进入用户空间),这两个表中INPUT链的规则都会用来做过滤检查。


五张表,每张表侧重于不同的功能:
filter 数据包过滤功能。只涉及INPUT, FORWARD, OUTPUT三条链。是iptables命令默认操纵的表。
nat 地址转换功能。NAT转换只涉及PREROUTING, OUTPUT, POSTOUTING三条链。可通过转发让局域网机器连接互联网
mangle 数据包修改功能。每条链上都可以做修改操作。修改报文元数据,做防火墙标记等。
raw 快速通道功能。为了提高效率,优先级最高,符合raw表规则的数据包会跳过一些检查。
security 需要和selinux结合使用,内置规则比较复杂,通常都会被关闭。

iptables还支持自定义规则链。自定义的链必须和某个特定的链关联起来。可在某个链中设定规则,满足一定条件的数据包跳转到某个目标链处理,目标链处理完成后返回当前链中继续处理后续规则。因为链中规则是从头到尾依次检查的,所以规则的次序是非常重要的。越严格的规则应该越靠前。

iptablse服务管理

service iptables start|stop|restart|status
service iptables save   //定义的所有内容,在重启时都会失效。调用save命令可以把规则保存到文件/etc/sysconfig/iptables中。
iptables-save    //保存规则
iptables-restore    //加载规则。开机的时候,会自动加载/etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables2     //加载自定义的规则文件
//iptables服务配置文件:/etc/sysconfig/iptables-config
//iptables规则文件:/etc/sysconfig/iptables
echo "1">/proc/sys/net/ipv4/ip_forward   //打开iptables转发

iptables命令参考

iptables [-t TABLE] COMMAND [CHAIN] [CRETIRIA]...  [-j  ACTION]

缺省表名为filter。命令中用到的序号(RULENUM)都基于1。

COMMAND 命令选项
-A|--append  CHAIN    //链尾添加新规则
-D|--delete  CHAIN [RULENUM]    //删除链中规则,按需序号或内容确定要删除的规则
-I|--insert  CHAIN [RULENUM]    //在链中插入一条新的规则,默认插在开头
-R|--replace CHAIN  RULENUM    //替换、修改一条规则,按序号或内容确定
-L|--list   [CHAIN [RULENUM]]    //列出指定链或所有链中指定规则或所有规则
-S|--list-urles [CHAIN [RULENUM]]    //显示链中规则
-F|--flush [CHAIN]    //清空指定链或所有链中规则
-Z|--zero [CHAIN [RULENUM]]    //重置指定链或所有链的计数器(匹配的数据包数和流量字节数)
-N|--new-chain CHAIN    //新建自定义规则链
-X|--delete-cahin [CHAIN]    //删除指定表中用户自定义的规则链
-E|--rename-chain OLDCHAIN NEWCHAIN    //重命名链,移动任何引用
-P|-policy CHAIN TARGET    //设置链的默认策略,数据包未匹配任意一条规则就按此策略处理

CRETIRIA 条件匹配

分为基本匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配。

基本匹配:(可使用 ! 可以否定一个子句,如-p !tcp)
-p|--proto  PROTO    //按协议匹配,如tcp、udp、icmp,all表示所有协议。 (/etc/protocols中的协议名)
-s|--source ADDRESS[/mask]...    //按数据包的源地址匹配,可使用IP地址、网络地址、主机名、域名
-d|--destination ADDRESS[/mask]...     //按目标地址匹配,可使用IP地址、网络地址、主机名、域名
-i|--in-interface INPUTNAME[ +]    //按入站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING链
-o|--out-interface OUTPUTNAME[+]    //按出站接口(网卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING链

扩展匹配:(如: -p tcp  -m tcp  --dport 80)
-m|--match MATCHTYPE  EXTENSIONMATCH...    //扩展匹配,可能加载extension

隐式扩展匹配

对-p PROTO的扩展,或者说是-p PROTO的附加匹配条件,-m PROTO 可以省略,所以叫隐式
-m tcp   //-p tcp的扩展
    --sport  [!]N[:M]    //源端口, 服务名、端口、端口范围。
    --dport  [!]N[:M]    //目标端口,服务名、端口、端口范围
    --tcp-flags CHECKFLAGS FLAGSOFTRUE  //TCP标志位:SYN(同步),ACK(应答),RST(重置),FIN(结束),URG(紧急),PSH(强迫推送)。多个标志位逗号分隔。CHECKFLAGS为要检查的标志位,FLAGSOFTRUE为必须为1的标志位(其余的应该为0)
    --syn    //第一次握手。 等效于 --tcpflags syn,ack,fin,rst syn   四个标志中只有syn为1
-m udp   //-p udp的扩展
    --sport N[-M]
    --dport N[-M]
-m icmp  //隐含条件为-p icmp
    --icmp-type  N    //8:echo-request  0:echo-reply

显示扩展匹配

-m state
    --state    //连接状态检测,NEW,ESTABLISHED,RELATED,INVALID
-m multiport
    --source-ports   PORT[,PORT]...|N:M    //多个源端口,多个端口用逗号分隔,
    --destination-ports PORT[,PORT]...|N:M    //多个目的端口
    --ports    //多个端口,每个包的源端口和目的端口相同才会匹配
-m limit
    --limit   N/UNIT    //速率,如3/minute, 1/s, n/second , n/day
    --limit-burst N    //峰值速率,如100,表示最大不能超过100个数据包
-m connlimit
    --connlimit-above N  //多于n个,前面加!取反
-m iprange
    --src-range IP-IP
    --dst-range IP-IP
-m mac                    
    --mac-source    //mac地址限制,不能用在OUTPUT和POSTROUTING规则链上,因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址
-m string
    --algo [bm|kmp]    //匹配算法
    --string "PATTERN"    //匹配字符模式
-m recent
    --name    //设定列表名称,默认为DEFAULT
    --rsource    //源地址
    --rdest    //目的地址
    --set    //添加源地址的包到列表中
    --update    //每次建立连接都更新列表
    --rcheck    //检查地址是否在列表
    --seconds    //指定时间。必须与--rcheck或--update配合使用
    --hitcount    //命中次数。必须和--rcheck或--update配合使用
    --remove    //在列表中删除地址
-m time
    --timestart h:mm
    --timestop  hh:mm
    --days DAYS    //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗号分隔
-m mark
    --mark N    //是否包含标记号N
-m owner
    --uid-owner 500    //用来匹配来自本机的封包,是否为某特定使用者所产生的,可以避免服务器使用root或其它身分将敏感数据传送出
    --gid-owner O    //用来匹配来自本机的封包,是否为某特定使用者群组所产生的
    --pid-owner 78    //用来匹配来自本机的封包,是否为某特定进程所产生的
    --sid-owner 100    //用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包

ACTION 目标策略(TARGET)

-j|--jump TARGET    //跳转到目标规则,可能加载target extension
-g|--goto  CHAIN    //跳转到指定链,不再返回
ACCEPT    规则验证通过,不再检查当前链的后续规则,直接跳到下一个规则链。
DROP    直接丢弃数据包,不给任何回应。中断过滤。
REJECT    拒绝数据包通过,会返回响应信息。中断过滤。
--reject-with  tcp-reset|port-unreachable|echo-reply
LOG    在/var/log/messages文件中记录日志,然后将数据包传递给下一条规则。详细位置可查看/etc/syslog.conf配置文件
--log-prefix "INPUT packets"
ULOG    更广范围的日志记录信息
QUEUE    防火墙将数据包移交到用户空间,通过一个内核模块把包交给本地用户程序。中断过滤。
RETURN    防火墙停止执行当前链中的后续规则,并返回到调用链。主要用在自定义链中。
custom_chain    转向自定义规则链
DNAT    目标地址转换,改变数据包的目标地址。外网访问内网资源,主要用在PREROUTING。完成后跳到下一个规则链
--to-destination ADDRESS[-ADDRESS][:PORT[-PORT]]
SNAT    源地址转换,改变数据包的源地址。内网访问外网资源。主机的IP地址必须是静态的,主要用在POSTROUTING。完成后跳到下一个规则链。
--to-source ADDRESS[-ADDRESS][:PORT[-PORT]]
MASQUERADE   源地址伪装,用于主机IP是ISP动态分配的情况,会从网卡读取主机IP。直接跳到下一个规则链。
--to-ports 1024-31000
REDIRECT    数据包重定向,主要是端口重定向,把包分流。处理完成后继续匹配其他规则。能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
--to-ports 8080
MARK    打防火墙标记。继续匹配规则。
--set-mark 2
MIRROR    发送包之前交换IP源和目的地址,将数据包返回。中断过滤。

辅助选项:
-t|--table TABLE    //指定操作的表,默认的表为filter
-n|--numeric    //用数字形式显示地址和端口,显示主机IP地址而不是主机名
-x|--exact    //计数器显示精确值,不做单位换算
-v|--verbose  (x3)   //查看规则列表时,显示更详细的信息
-line-numbers    //查看规则表时,显示在链中的序号
-V|--version
-h|--help   
[option]  --help    //查看特定选项的帮助,如iptables -p icmp --help
--fragment -f    //match second or further fragments only
--modprobe=<command>    //try to insert modules using this command
--set-counters PKTS BYTES   //set the counter during insert/append

state  TCP链接状态:
NEW    第一次握手,要起始一个连接(重设连接或将连接重导向)
ESTABLISHED    数据包属于某个已经建立的连接。第二次和第三次握手   (ack=1)
INVALID    数据包的连接编号(Session ID)无法辨识或编号不正确。如SYN=1 ACK=1 RST=1   
RELATED    表示该封包是属于某个已经建立的连接,所建立的新连接。如有些服务使用两个相关的端口,如FTP的21和20端口一去一回,FTP数据传输(上传/下载)还会使用特殊的端口只允许NEW和ESTABLISHED进,只允许ESTABLISHED出可以阻止反弹式木马。

使用示例:
iptables -F //删除iptables现有规则
iptables -L [-v[vv] -n]   //查看iptables规则
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT    //在INPUT链尾添加一条规则
iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT    //在INPUT链中插入为第2条规则
iptables -D  INPUT 2    //删除INPUT链中第2条规则
iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT    //替换修改第三条规则
iptables -P INPUT DROP    //设置INPUT链的默认策略为DROP
//允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
//允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INTPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
//允许HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
//限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
//限制SSH连接速率(默认策略是DROP)
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT  
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
 
//防止syn攻击(限制syn的请求速度)
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
//防止syn攻击(限制单个ip的最大syn连接数)
iptables --A INPUT --i eth0 --p tcp --syn -m connlimit --connlimit-above 15 -j DROP
 
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP   //利用recent模块抵御DOS攻击
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH   //单个IP最多连接3个会话
iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP  //只要是新的连接请求,就把它加入到SSH列表中。5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。
 
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP    //防止单个IP访问量过大
iptables --A OUTPUT --m state --state NEW --j DROP  //阻止反弹木马
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT   //防止ping攻击
 
//只允许自己ping别人,不允许别人ping自己
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
//对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 
//SNAT 基于原地址转换。许多内网用户通过一个外网 口上网的情况。将我们内网的地址转换为一个外网的IP,共用外网IP访问外网资源。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
//当外网地址不是固定的时候。将外网地址换成 MASQUERADE(动态伪装):它可以实现自动读取外网网卡获取的IP地址。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
//DNAT 目标地址转换。目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2

FirewallD

FirewallD与iptables关系:


firewalld底层仍旧是基于iptables的,但还是有很多不同的地方:

1)、iptables在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,其中前者是默认的配置,请不要修改。可以在/etc/firewalld/中编辑自己的配置,firewalld优先使用/etc/firewalld/中的配置。

2)、使用 iptables,每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同之处。因此,firewalld 可以在运行时间内,改变设置而不丢失现行连接。

firewalld中zone概念(区域)

RHEL7中的不过貌似其实现方式还是和iptables一样的,但是不像mariaDB那样兼容MySQL命令,FirewallD无法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则

FirewallD使用区域(zone)的概念来管理,每个网卡对应一个zone,这些zone的配置文件可在/usr/lib/firewalld/zones/下看到,默认的是public.由firewalld 提供的区域按照从不信任到信任的顺序排序:
drop(丢弃)任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。
block(阻塞)任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。
public(公开) 在用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机,只允许选中的连接接入。
external(外部)用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机,只允许选中的连接接入。
dmz(隔离区)用以允许隔离区(dmz)中的电脑有限地被外界网络访问,只接受被选中的连接。
work(工作)用在工作网络。你信任网络中的大多数计算机不会影响你的计算机,只接受被选中的连接。
home(家庭)用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机,只接受被选中的连接。
internal(内部)用在内部网络。你信任网络中的大多数计算机不会影响你的计算机,只接受被选中的连接。
trusted(信任)允许所有网络连接。

firewalld中的过滤规则
source: 根据源地址过滤
interface: 根据网卡过滤
service: 根据服务名过滤
port: 根据端口过滤
icmp-block: icmp 报文过滤,按照 icmp 类型配置
masquerade: ip 地址伪装
forward-port: 端口转发
rule: 自定义规则

其中,过滤规则的优先级遵循如下顺序
source
interface
conf

firewalld常用命令

fierwalld可以直接修改配置文件进行配置,也可以通过配置工具的命令,这里因为是远程操作为了确保开启后ssh端口是开放的,所以直接修改配置文件。先查看/etc/firewalld/firewalld.conf中DefaultZone的值,默认是DefaultZone=public,这时/etc/firewalld/zones/目录下应该有个public.xml文件,打开它修改成:
<?xml version="1.0" encoding="utf-8"?>
<zone>
    <short>Public</short>
    <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
    <service name="dhcpv6-client"/>
    <service name="ssh"/>
    <service name="http"/>
    <service name="https"/>
</zone>

这就代表在public zone中开放ssh(22)、http(80)、https(443)端口,其中对应每一个在/usr/lib/firewalld/services/下*.xml文件定义好的服务类型,比如http.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<service>
    <short>WWW (HTTP)</short>
    <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
    <port protocol="tcp" port="80"/>
</service>

所以也可以直接在public.xml中这样:
<?xml version="1.0" encoding="utf-8"?>
<zone>
    <short>Public</short>
    <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
    <service name="dhcpv6-client"/>
    <service name="ssh"/>
    <port protocol="tcp" port="80"/> #等效的
    <service name="https"/>
</zone>

每次改配置文件还是比较麻烦的,firewalld可以使用firewall-config和firewall-cmd进行配置,前者是由于GUI模式下,后者为命令行下工具,一些常用命令如下:
systemctl start firewalld #启动
systemctl status firewalld #或者firewall-cmd --state 查看状态
sytemctl disable firewalld #停止并禁用开机启动
systemctl enable firewalld #设置开机启动
systemctl stop firewalld #禁用
firewall-cmd --version #查看版本
firewall-cmd --help #帮助信息
firewall-cmd --get-active-zones #查看区域信息
firewall-cmd --get-zone-of-interface=eth0 #查看指定接口所属区域
firewall-cmd --panic-on #拒绝所有包
firewall-cmd --panic-off #取消拒绝状态
firewall-cmd --query-panic #查看是否拒绝
firewall-cmd --reload #更新防火墙规则
firewall-cmd --complete-reload #断开再连接
firewall-cmd --zone=public --add-interface=eth0 #将接口添加到public区域,默认接口都在public。若加上--permanet则永久生效
firewall-cmd --set-default-zone=public #设置public为默认接口区域
firewall-cmd --zone=pulic --list-ports #查看所有打开的端口
firewall-cmd --zone=pulic --add-port=80/tcp #把tcp 80端口加入到区域
firewall-cmd --zone=public --add-service=http #把http服务加入到区域
firewall-cmd --zone=public --remove-service=http #移除http服务

部分命令共同的参数说明:
--zone=ZONE 指定命令作用的zone,省缺的话命令作用于默认zone
--permanent 有此参数表示命令只是修改配置文件,需要reload才能生效;无此参数则立即在当前运行的实例中生效,不过不会改动配置文件,重启firewalld服务就没效果了。
--timeout=seconds 表示命令效果持续时间,到期后自动移除,不能和--permanent同时使用。例如因调试的需要加了某项配置,到时间自动移除了,不需要再回来手动删除。也可在出现异常情况时加入特定规则,过一段时间自动解除。

参考连接

Fedora-FirewallD/zh-cn
Set Up a Firewall Using FirewallD on CentOS 7


下节摘录自钱魏Way的博客空间,感谢原作者。

本节介绍在Linux操作系统中使用和配置Firewalld规则的方法,将展示如何添加、删除、启用和禁用防火墙规则和区域。这些方法适用于CentOS 7/8、RHEL 7/8、Fedora、SUSE/openSUSE 15系统上。当前防火墙对于控制进出Linux服务器的网络流量至关重要,它使用户可以通过定义一组防火墙规则来控制主机上的传入网络流量。必须在面向Internet的生产服务器上启用它,以保护这些服务器免遭未经授权的访问,这是确保网络级别系统安全的关键。

FirewallD介绍

FirewallD是防火墙守护程序。它提供了一个动态管理的防火墙,该防火墙带有Linux内核提供的称为Netfilter的极其强大的过滤系统。它提供了用于数据包筛选、网络地址转换和端口转换的各种功能,并提供了控制网络数据包的功能,如传入、传出或转发。

FirewallD使用区域和服务的概念,而iptables使用链和规则。与iptables相比,FirewallD提供了一种非常灵活的方式来处理防火墙管理。

可以按照指定的要求将每个区域配置为接受或拒绝某些服务或端口,并且可以将其与一个或多个网络接口关联。默认区域将设置为公共区域,并附加了相关的网络接口。

Firewalld具有两层设计:
Core layer:核心层负责处理配置和iptables、ip6tables、ebtables和ipset等后端。
D-Bus layer:带有防火墙的D-Bus接口是更改和创建防火墙配置的主要方法。

防火墙区域

通常firewalld带有一组预配置的区域。以下是FirewallD提供的区域,运行以下命令以列出区域:
$ firewall-cmd --get-zones
block dmz drop external home internal public trusted work

以下是注解:
block:任何传入连接都会被ipmp-host禁止的IPv4消息和icmp6-adm禁止的IPv6拒绝。仅允许在此系统内启动的网络连接。
dmz:用于位于非军事区的计算机,这些计算机可公开访问且对内部网络的访问受限。仅接受选定的传入连接。
drop:丢弃所有传入的连接,而无需任何通知。仅允许传出连接。
external:用于在系统充当路由器时启用NAT伪装的外部网络。仅允许选择的传入连接。
home:用于家庭网络,并且同一网络上的其他计算机通常是受信任的。仅接受选定的传入连接。
internal:用于内部网络,并且通常信任网络上的其他系统。仅接受选定的传入连接。
public:用于公共区域,但是您不应该信任网络上的其他计算机。仅接受选定的传入连接。
trusted:接受所有网络连接。
work:在工作区域中使用,大多数情况下都信任同一网络上的其他计算机。仅接受选定的传入连接。

防火墙服务

防火墙服务配置是预定义的服务,如果安装/启用了服务,则会自动加载这些服务。它包含防火墙服务条目的信息,例如端口、模块和目标地址。

要列出可用的服务模块,请运行以下命令:
$ firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd bacula bacula-client bgp..

防火墙运行时和永久设置

Firewalld使用两种独立的配置,即运行时和永久配置:
Runtime Configuration:运行时配置在系统重新启动时将不会永久保存,并且firewalld服务停止。这意味着运行时配置不会自动保存到永久配置。

Permanent Configuration:永久配置存储在配置文件中,并且将在每次重新引导或服务重新加载/重新启动时被加载并成为新的运行时配置。请注意,要使更改永久生效,需要对firewall-cmd使用–permanent选项。

在Linux中安装和启用FirewallD

默认情况下,Firewalld已安装在CentOS 7/8、RHEL 7/8、Fedora、SUSE/openSUSE 15上,但是如果系统中未安装Firewalld,则可以按以下方式安装:
# yum install firewalld [CentOS 7/RHEL 7]
# dnf install firewalld [CentOS 8/RHEL 8/Fedora]
# zypper install firewalld [openSUSE Leap]

安装完成后,您需要使用以下命令启动并启用firewalld:
# systemctl start firewalld
# systemctl enable firewalld

要检查firewalld的状态,请运行以下命令:
# firewall-cmd --state

使用和配置Firewalld

注:内容有:区域管理、打开和关闭端口、在Firewalld中添加和删除服务、使用Firewalld进行端口转发、带防火墙的丰富规则、防火墙的直接规则。

1、区域管理
Firewalld为每个区域提供不同级别的安全性,并将公共区域设置为默认区域。要查看默认区域,请运行以下命令:
# firewall-cmd --get-default-zone
public

要查看默认区域的区域配置,请运行以下命令,您无需提及区域名称,因为它是默认区域。以下输出显示公共区域处于活动状态并设置为默认区域,该区域与wlan0 & eth0接口相关联。当前允许ssh和dhcp客户端服务进行通信。

注意:默认情况下,所有活动接口都将分配给默认区域。
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 wlan0
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

通过使用选项“–zone”和“–change-interface”的组合,可以轻松更改区域界面。例如,要将“eth0”界面分配给“home”区域,请运行以下命令:
# firewall-cmd --zone=home --change-interface=eth0

要查看所有活动区域,请运行以下命令,它显示活动区域和关联的接口:
# firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: wlan0

要更改默认区域,请使用以下格式。例如,要将默认区域更改为home,请运行以下命令:
# firewall-cmd --set-default-zone=home

要打印特定的区域配置,请运行以下命令,此输出显示允许的规则、端口和服务的列表:
# firewall-cmd --zone=home --list-all
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh mdns samba-client dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

要获取所有可用区域的列表,请运行以下命令:
# firewall-cmd --get-zones

要找出与eth0接口关联的区域,请运行以下命令:
$ firewall-cmd --get-zone-of-interface=eth0
home

要创建新区域,请使用以下命令。例如,要创建一个名为“ywnz”的新区域,请运行:
# firewall-cmd --permanent --new-zone=ywnz
success

要将运行时设置迁移到永久设置,请运行:
# firewall-cmd --runtime-to-permanent

2、打开和关闭端口

端口是使操作系统能够接收和发送网络流量以及将其转发到与其关联的特定系统服务的逻辑设备。打开特定端口可使用户从外部访问系统,这存在安全风险。因此,仅在必要时才打开某些服务所需的端口。

要获取当前区域中允许的端口的列表,请运行以下命令:
# firewall-cmd --list-ports

将端口添加到允许的端口中以打开它以接收传入流量:
# firewall-cmd --add-port=port_number/port_type

例如,以下命令将打开当前区域的端口80:
# firewall-cmd --permanent --add-port=80/tcp
success

同样,要从允许的端口中删除特定端口,请运行以下命令:
# firewall-cmd --remove-port=80/tcp

可以每次使用以下命令确认是否已添加或删除端口:
# firewall-cmd --list-ports

如果要打开特定区域的端口,请运行以下命令。例如,以下命令将打开本地区域的端口80:
# firewall-cmd --permanent --zone=home --add-port=80/tcp

同样,要从允许的端口中删除特定区域的特定端口,请运行:
# firewall-cmd --zone=home --remove-port=80/tcp

可以使用以下命令来确认是否已为特定区域每次添加或删除端口:
# firewall-cmd --zone=home --list-ports

3、在Firewalld中添加和删除服务

防火墙服务配置是预定义的服务,如果启用了服务,则会自动加载这些服务。预定义服务的使用使用户更容易启用和禁用对服务的访问。它包含防火墙服务条目的信息,例如端口、模块和目标地址。预定义的服务位于“/usr/lib/firewalld/services”目录中。

服务配置采用与端口管理相同的模型,但是您无需记住任何端口,可以一次完成所有配置。

例如,执行以下命令以允许samba服务进入“home”区域。samba服务需要启用以下端口集:“139 and 445 TCP”以及“137 and 138 UDP”。

当添加“samba”服务时,所有端口都将同时被激活,因为所有端口信息都在samba服务配置中,通过端口管理选项允许使用samba服务时,将手动激活所有samba端口:
# firwall-cmd --permanent --zone=home --add-service=samba
succes

要删除samba服务,请运行以下命令:
# firewall-cmd --permanent --zone=home --remove-service=ftp

可以每次使用以下命令确认是否已添加或删除该服务:
# firewall-cmd --zone=home --list-services

要获取有关samba服务的更多信息,请运行以下命令:
# firewall-cmd --zone=home --info-service=samba

要一次添加多个服务,请执行以下命令。例如,要添加http和https服务,请运行以下命令:
# firwall-cmd --permanent --zone=home --add-service={http,https}

4、使用Firewalld进行端口转发

端口转发是一种将所有传入网络流量从一个端口转发到另一个内部端口或另一台计算机上的外部端口的方法。在将流量从一个端口重定向到另一个端口或另一个地址之前,应该了解以下三件事:
1)、数据包到达哪个端口。
2)、使用什么协议。
3)、您想重定向他们的地方。

注意:端口转发需要伪装。使用下面显示的命令启用所需区域的伪装。伪装充当路由器(NAT – network address translation),可用于将小型LAN与Internet连接。

要启用IP伪装,请输入以下命令:
# firewall-cmd --permanent --zone=external --add-masquerade

要检查是否为外部区域启用了IP伪装,请运行以下命令:
# firewall-cmd --zone=external --query-masquerade

要将端口重定向到同一系统上的另一个端口,请运行以下命令,示例方案:将端口80的所有数据包重定向到端口8080:
# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080

要将流量转发到另一台服务器,请运行以下命令,示例方案:将端口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

例如,要允许来自特定源(子网)的流量仅允许来自特定子网的服务器连接,请运行以下命令:
# firewall-cmd --permanent --zone=home --add-source=192.168.1.0/24

5、带防火墙的丰富规则

丰富的语言可让您以一种易于理解的方式创建更复杂的防火墙规则,但难以记住这些丰富的规则,因此请导航至“man firewalld.richlanguage”并查找示例。

Rich Rule的通用规则结构:
rule
  [source]
  [destination]
  service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
  [log]
  [audit]
  [accept|reject|drop|mark]

要允许来自地址192.168.0.0/24的IPv4连接,请运行以下命令:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" accept'

要允许来自地址192.168.0.0/24的ssh服务的IPv4连接,请运行以下命令:
# 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'

同样使用端口选项:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" port port=22 protocol=tcp accept'

要拒绝来自主机192.0.2.0的ssh服务的IPv4流量,请运行:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" port port=22 protocol=tcp reject'

注意:要删除任何丰富的规则,请使用“–remove-rich-rule”选项,而不是“–add-rich-rule”。

要在公共区域中列出丰富规则,请运行:
# firewall-cmd --zone=public --list-rich-rules

6、防火墙的直接规则

直接规则类似于iptables命令,这对熟悉iptables命令的用户很有用。或者,您可以在“/etc/firewalld/direct.xml”文件中编辑规则,然后重新加载防火墙以使这些规则处于活动状态。直接规则主要由服务或应用程序用来添加特定的防火墙规则。以下直接规则将打开服务器上的端口8080:
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
# firewall-cmd --reload

要在当前区域中列出直接规则,请运行:
# firewall-cmd --direct --get-all-rules

7、小结

在本节中将了解firewalld的完整用法,例如区域、允许/拒绝服务和端口、端口转发、丰富规则、直接规则等。并且应用起来并不复杂,按照以上方法就可以自行操作了。firewall-cmd 命令常用操作示例如下:

firewall-cmd --state #查看 firewalld 服务状态
firewall-cmd --get-zones #查看所有域。域可以简单理解为设备的使用场景,不同场景采用不同的防火墙策略集合,如 public 域表示公共场景,trusted 域表示信任所有网络连接,home 域表示家庭场景,work域表示工作场景,internal 域表示内部网络,external 表示外部网络,dmz 表示非军事区,block 表示拒绝所有网络连接,drop 表示丢弃所有网络信息且无回复,libvirt 表示虚拟网络。
firewall-cmd --get-default-zone #查看默认域,默认域为 public
firewall-cmd --set-default-zone=public #设置默认域为 public
firewall-cmd --get-active-zones #查看默认域信息
firewall-cmd --list-ports #查看所有允许的端口策略
firewall-cmd --zone=public --add-port=80/tcp --permanent #在 public 域增加 TCP 协议访问 80 端口的策略并永久生效,如果只想临时增加就去掉--permanent
firewall-cmd --zone=public --query-port=80/tcp #查看 public 域 TCP 协议访问 80 端口的策略
firewall-cmd --zone=public --remove-port=80/tcp --permanent #在 public 域删除 TCP 协议访问 80 端口的策略并永久生效
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.153/24" port port="80" protocol="tcp" accept' #添加指定 ip 地址以 TCP 协议访问 80 端口的策略
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.153/24" port port="80" protocol="tcp" accept' #删除指定 ip 地址以 TCP 协议访问 80 端口的策略
firewall-cmd --list-services #查看所有允许的服务策略
firewall-cmd --get-services #查看所有支持的服务
firewall-cmd --zone=public --add-service=httpd --permanent #在 public 域增加 httpd 服务相关的所有策略并永久生效
firewall-cmd --zone=public --query-service=httpd #查看 public 域 httpd 服务相关策略
firewall-cmd --zone=public --remove-service=httpd --permanent #在 public 域删除 httpd 服务相关的所有策略并永久生效
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.153/24" service name="httpd" accept' #添加指定 ip 地址访问 httpd 服务的策略
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.153/24" service name="httpd" accept' #删除指定 ip 地址访问 httpd 服务的策略
firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop' #禁止外部设备 ping 本机
firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp reject' #禁止外部设备 ping 本机,与上例的区别:drop 是丢包,访问端接收不到任何答复;reject 是拒绝,访问端会显示拒绝信息
firewall-cmd --reload #重新加载防火墙配置
firewall-cmd --add-masquerade --permanent #开启 IP 伪装功能,转发流量到指定 ip 时需要开启此功能
firewall-cmd --remove-masquerade --permanent #禁止 IP 伪装功能
firewall-cmd --query-masquerade #查看 IP 伪装是否开启
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080 #增加 80 端口到 8080 端口流量转发的策略
firewall-cmd --permanent --remove-forward-port=port=80:proto=tcp::toport=8080 #删除 80 端口到 8080 端口流量转发的策略
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.153:toport=8080 #增加 80端口到指定 ip 的 8080 端口流量转发的策略,注意开启 IP 伪装功能
firewall-cmd --permanent --remove-forward-port=port=80:proto=tcp:toaddr=192.168.1.153:toport=8080 #删除80 端口到指定 ip 的 8080 端口流量转发的策略
firewall-cmd --panic-on #开启应急状态,此时拒绝任何访问
firewall-cmd --panic-off #关闭应急状态
firewall-cmd --query-panic #查看应急状态是否开启