简介:iptables 是 Linux 传统的防火墙工具,基于 Netfilter 框架,通过定义规则表来控制进出系统的网络流量。
特点:
filter、nat)和 链(如 INPUT、OUTPUT)来管理规则。简介:firewalld 是一个基于 nftables 的防火墙管理工具,提供了一个动态的方式来配置防火墙规则。
特点:
iptables 更易于管理,尤其适用于需要经常更改规则的场景。简介:nftables 是 Linux 系统中新一代防火墙框架,旨在替代 iptables。它提供了一个统一的接口来配置防火墙规则。
特点:
iptables 提供了更多扩展功能,支持更复杂的过滤和处理操作。| 特性 | iptables | firewalld | nftables |
|---|---|---|---|
| 背景 | 传统防火墙工具,基于 Netfilter | 基于 nftables,动态管理规则 | 新一代防火墙框架,替代 iptables |
| 配置方式 | 静态配置,基于表和链 | 动态配置,基于区域和服务管理 | 使用 nft 命令,统一配置规则 |
| 动态性 | 配置较静态,需要重启防火墙服务 | 支持动态管理规则,无需重启 | 动态规则修改,高效处理 |
| 使用难度 | 较高,需要深入理解表和链的概念 | 较简单,通过区域和服务管理规则 | 配置简洁,适合高性能需求 |
| 性能 | 性能较为稳定,但在复杂规则下性能下降 | 性能优于 iptables,依赖 nftables | 更高效的规则查找和处理,性能优越 |
| 适用场景 | 高度定制、防火墙需求复杂的环境 | 适合中小型环境,易于管理 | 适合高性能需求和新系统 |
x/etc/init.d/iptables restart/etc/init.d/iptables status/etc/init.d/iptables stopchkconfig iptables offservice iptables restartservice iptables statusservice iptables stopchkconfig iptables offsystemctl restart iptables.servicesystemctl status iptables.servicesystemctl stop iptables.servicesystemctl disable iptables.service
xxxxxxxxxxsystemctl restart nftables.servicesystemctl status nftables.servicesystemctl stop nftables.servicesystemctl disable nftables.service
CentOS 7.0默认使用的是firewalld作为防火墙管理工具
xxxxxxxxxxfirewall-cmd --statesystemctl restart firewalld.servicesystemctl status firewalld.servicesystemctl stop firewalld.servicesystemctl disable firewalld.service
RHEL默认是关闭selinux的,但是安装图形化界面的RHEL会安装selinux。
xxxxxxxxxxvi /etc/sysconfig/selinuxSELINUX=disabled#临时关闭SELinuxsetenforce 0#临时打开SELinux#setenforce 1#查看状态sestatus -v#永久关闭sed -i 's/^\(SELINUX=\).*/\1disabled/' /etc/sysconfig/selinux
1、直接修改iptables文件
xxxxxxxxxx# vi /etc/sysconfig/iptables添加一条配置规则,如要想开放23的端口,如下所示:-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
2、使用命令操作
xxxxxxxxxxiptables -A INPUT -s 192.168.1.5 -i eth0 -p tcp --dport 22 -j ACCEPT追加【允许来自192.168.1.5的tcp数据包从eth0接口访问本机22端口】到最后iptables -A INPUT -s 192.168.1.5 -i eth0 -p tcp --dport 23 -j DROP追加【丢弃来自192.168.1.5的tcp数据包从eth0接口访问本机23端口】到最后# 应该使用追加iptables -I INPUT 1 -s 192.168.1.5 -i eth0 -p tcp --dport 22 -j ACCEPT插入【允许来自192.168.1.5的tcp数据包从eth0接口访问本机22端口】到第1行iptables -A FORWARD -s 192.168.1.1 -j DROP丢弃192.168.1.1访问外网的数据包iptables -A OUTPUT -d www.baidu.com -j DROP丢弃访问www.baidu.com的数据包iptables -R INPUT 1 -p tcp --dport 23 -j ACCEPT修改第一条规则iptables -D INPUT 1删除第一条入站规则iptables -n -L INPUT列出所有入站规则,-n 显示端口号service iptables save保存iptables规则文件保存于:cat /etc/sysconfig/iptables
xxxxxxxxxx#开放端口nft add rule ip filter input tcp dport 80 accept#删除端口nft delete rule ip filter input tcp dport 80 accept# 列出所有规则nft list ruleset# 删除特定规则(根据规则编号)sudo nft delete rule ip filter input handle <rule_number>#重新载入,更新防火墙规则nft -f /etc/nftables.conf
xxxxxxxxxx#开放端口firewall-cmd --permanent --zone=public --add-port=9300/tcpfirewall-cmd --permanent --zone=public --add-port=5047/udp#删除端口firewall-cmd --permanent --zone=public --remove-port=80/tcp#重新载入,更新防火墙规则firewall-cmd --reload#列出开放的端口firewall-cmd --list-portsfirewall-cmd --zone=public --add-rich-rule="rule family='ipv4' source address='124.163.191.135' port port=22 protocol=tcp drop" --permanentfirewall-cmd --zone=public --add-rich-rule="rule family='ipv4' source address='124.163.191.135' drop" --permanentfirewall-cmd --list-rich-rules
语法:
iptables [-t table] command [match] [-j target/jump]
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。
各个规则表的功能如下:
nat 此规则表拥有 Prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。
mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则链。除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。
filter 这个规则表是预设规则表,拥有INPUT、FORWARD 和 OUTPUT三个规则链,这个规则表顾名思义是用来进行封包过滤的理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。
主要包含::命令表用来增加(-A、-I)删除(-D)修改(-R)查看(-L)规则等;
常用参数用来指定协议(-p)、源地址(-s)、源端口(--sport)、目的地址(-d)、目的端口(--dport)、进入网卡(-i)、出去网卡(-o)等设定包信息(即什么样的包);用来描述要处理包的信息。
常用处理动作用 -j 来指定对包的处理(ACCEPT、DROP、REJECT、REDIRECT等)。
常用命令(-A追加规则、-D删除规则、-R修改规则、-I插入规则、-L查看规则)
命令-A,--append
范例 iptables -A INPUT ...
说明新增规则(追加方式)到某个规则链(这里是INPUT规则链)中,该规则将会成为规则链中的最后一条规则。
命令-D,--delete
范例 iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令-R, --replace
范例 iptables -R INPUT1-s 192.168.0.1 -j DROP
说明取代现行规则,规则被取代后并不会改变顺序。(1是位置)
命令-I,--insert
范例 iptables -I INPUT1--dport 80 -j ACCEPT
说明插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。
命令-L, --list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
命令-F, --flush
范例 iptables -F INPUT
说明 删除某规则链(这里是INPUT规则链)中的所有规则。
命令-Z,--zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
命令-N, --new-chain
范例 iptables -N allowed
说明 定义新的规则链。
命令-X, --delete-chain
范例 iptables -X allowed
说明 删除某个规则链。
命令-P, --policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
命令-E,--rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。
(-p协议、-s源地址、-d目的地址、--sport源端口、--dport目的端口、-i进入网卡、-o 出去网卡)
参数-p, --protocol(指定协议)
范例 iptables -A INPUT -p tcp(指定协议) -p all 所有协议, -p !tcp 去除tcp外的所有协议。
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,
意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数-s, --src, --source(指定源地址,指定源端口--sport)
例如: iptables -A INPUT -s 192.168.1.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,
例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,
例如:-s ! 192.168.0.0/24。
参数-d, --dst, --destination(指定目的地址,指定目的端口--dport)
例如: iptables -A INPUT -d 192.168.1.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数-i, --in-interface(指定入口网卡) -i eth+ 所有网卡
例如: iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,
例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,
例如:-i ! eth0。
参数-o, --out-interface(指定出口网卡)
例如: iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上。
参数--sport, --source-port(源端口)
例如: iptables -A INPUT -p tcp --sport 22
说明 用来比对封包的来源端口号,可以比对单一埠,或是一个范围,
例如:--sport 22:80,表示从 22 到 80 端口之间都算是符合件,
如果要比对不连续的多个埠,则必须使用--multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
参数--dport, --destination-port(目的端口)
例如: iptables -A INPUT -p tcp --dport 22
说明 用来比对封包的目的端口号,设定方式同上。
参数--tcp-flags(只过滤TCP中的一些包,比如SYN包,ACK包,FIN包,RST包等等)
例如: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,
第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、
FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和
NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对。
参数--syn
例如: iptables -p tcp --syn
说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,
FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。
参数-m multiport --source-port
例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 !
运算子进行反向比对。
参数-m multiport --destination-port
例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数-m multiport --port
例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。
注意:在本范例中,如果来源端口号为 80目的地埠号为 110,这种封包并不算符合条件。
参数--icmp-type
例如: iptables -A INPUT -p icmp --icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。
请打 iptables -p icmp --help 来查看有哪些代码可用。
参数-m limit --limit
例如: iptables -A INPUT -m limit --limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是
否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,
默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的
比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水
攻击法,导致服务被阻断。
参数--limit-burst
范例 iptables -A INPUT -m limit --limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超
过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。
参数-m mac --mac-source
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。
参数--mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。
参数-m owner --uid-owner
范例 iptables -A OUTPUT -m owner --uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用
root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出
来自其它主机的封包。
参数-m owner --gid-owner
范例 iptables -A OUTPUT -m owner --gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数-m owner --pid-owner
范例 iptables -A OUTPUT -m owner --pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数-m owner --sid-owner
范例 iptables -A OUTPUT -m owner --sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时
机同上。
参数-m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
(-j 指定对满足条件包的处理,常用动作有ACCEPT接受报、DROP丢弃报、REJECT丢弃报并通知对方、REDIRECT重定向包等)
-j 参数用来指定要进行的处理动作**,**常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
ACCEPT**将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。**
REJECT**拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。**
例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT--reject-with tcp-reset
DROP**丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。**
REDIRECT将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。
这个功能可以用来实作通透式porxy 或用来保护 web 服务器。
例如:iptables -tnat-A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8080
MASQUERADE改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。
例如:iptables -tnat-A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG**将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。**
例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT改写封包来源IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
例如:iptables -tnat-A POSTROUTING -p tcp-o eth0 -j SNAT--to-source194.236.50.155-194.236.50.160:1024-32000
DNAT改写封包目的地IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。
例如:iptables -tnat-A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT--to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,
例如:计算联机费......等。
RETURN**结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。**
MARK将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
1.按来源MAC地址匹配
iptables -t filter -A FORWARD-m --mac-source 00:02:b2:03:a5:f6-j DROP
拒绝转发来自该MAC地址的数据包
2.按多端口或连续端口匹配
20:表示20以后的所有端口
20:100表示20到100的端口
:20表示20之前的所有端口
-m multiport [--prots, --sports,--dports]
例子:
iptables -A INPUT -p tcp -m multiport --dports 21,20,25,53,80 -j ACCEPT 【多端口匹配】
iptables -A INPUT -p tcp --dport 20: -j ACCEPT
iptables -A INPUT -p tcp --sport 20:80 -j ACCEPT
iptables -A INPUT -p tcp --sport :80 -j ACCEPT
3.还可以按数据包速率和状态匹配
-m limit --limit匹配速率 如: -m limit --limit 50/s -j ACCEPT
-m state --state 状态 如: -m state --state INVALID,RELATED -j ACCEPT
4.还可以限制链接数
-m connlimit --connlimit-above n 限制为多少个
例如:
iptables -I FORWARD -p tcp -m connlimit --connlimit-above 9 -j DROP //表示限制链接数最大为9个
5、模拟随机丢包率
iptables -A FORWARD -p icmp -m statistic --mode random --probability 0.31 -j REJECT //表示31%的丢包率
或者
-m random --average 5 -j DROP 表示模拟丢掉5%比例的包
相关知识:
Linux 中延时模拟
设置延时 3s :
tc qdisc add dev eth0 root netem delay 3000ms
可以在 3000ms 后面在加上一个延时,比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延时范围 2800 – 3200 之间.
结果显示如下
Linux 中丢包模拟
设置丢包 50% ,iptables 也可以模拟这个,但一下不记的命令了,下次放上来:
tc qdisc change dev eth0 root netem loss50%
上面的设丢包,如果给后面的 50% 的丢包比率修改成 ’50% 80%’ 时,这时和上面的延时不一样,这是指丢包比率为 50-80% 之间。
xxxxxxxxxx1. 如果数据包的目的地址是本机,则系统将数据包送往Input链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。2. 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往Forward链。如果通过规则检查,则该包被发给相应的本地进程处理; 如果没有通过规则检查,系统就会将这个包丢掉。3. 如果数据包是由本地系统进程产生的,则系统将其送往Output链。如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。input– 用于处理“进入”路由器的数据包,即数据包目标IP地址是到达路由器一个接口的IP地址,“经过”路由器的数据包不会在input-chains处理(这里要注意理解的是“进入”和“经过”的不同意味)forward– 用于处理“通过”路由器的数据包output– 用于处理源于路由器并从其中一个接口出去的数据包。input只对要访问本机的包有效,forward只对不是访问本机,但是要通过这台机器转发的包有效。
xxxxxxxxxxfirewalld的简要说明:firewalld 、firewall-cmd 、firewall-offline-cmd它们Python脚本,通过定义的在/usr/lib/firewalld下面的xml配置信息,在启动时自动载入默认iptables配置,并应用到系统中,当使用firewalld-cmd添加防火墙规则时,它实际是转换成iptables规则后,在应用到系统中。firewalld定义了几个概念:zone: 它是安全域的范围,就类似于Window上的域网络,工作网络,家庭网络,Internet网络等,不同的安全作用域其安全级别不同,安全程度不同,家庭zone的安全规则就是最宽松的。service: 它是zone里面的定义一个规则集,它将iptables中单独根据 入接口,出接口,源目端口,协议等定义单独规则整合为一个规则集合,方便识别和管理。protocol: 定义协议规则port,source-port :基于端口定义规则,port我的理解:定义源和目标为指定端口的规则。source: 定义源地址规则interface: 定义基于出入接口的规则。direct: 直接定义原始iptables规则。白名单控制谁能操作firewalld 对规则做增删改:注: firewalld的白名单机制是控制,谁能操纵firewall-cmd来对现有规则进行增删改等操作。此选项支持四种控制方式:1. context : 根据SELinux的进程domain(域)的安全上下文类型来定义Whitelist(白名单)2. command: 根据命令的绝对路径做Whitelist.3. uid4. user: 可以使用用户名 或 UID来做Whitelist全局选项:--state #显示当前firewalld服务的运行状态。--runtime-to-permanent #将运行时配置保存为永久配置。全局刷新配置:--reload #重新加载防火墙permanent(永久的)的规则配置,覆盖当前运行时配置,在运行时添加的非permanent规则,都将丢失。--complete-reload #完全重新加载防火墙,甚至netfilter内核模块。这很可能会终止活动连接,因为状态信息会丢失。此选项仅在出现严重防火墙问题时使用。例如,如果存在状态信息问题,则无法使用正确的防火墙规则建立连接。全局开启日志记录功能:--get-log-denied #查看是否启用了在所有规则中启用拒绝日志记录。--set-log-denied=[all |unicast |broadcast |multicast |off]#设置启用或禁用在所有规则添加拒绝或删除日志记录功能。在进行一下操作前需要知道:增删查改:增: --add- 或 --new- #注: add:新增子选项 ; new:新建新项目删: --remove- 或 --delete-查: --query-改: --change-查看修改前: firewall-cmd --reload然后查看:--info-[zone |service |ipset |icmptype |helper]=[zone |service |ipset |icmptype |helper]--path-[zone |service | icmptype |helper |ipset]=[zone |service | icmptype |helper |ipset]--list-[all-zones |services |ports |protocols |source-ports |icmp-blocks |forward-ports |interfaces |sources]--get-[zones |services |icmptypes ]=[zones |services |icmptypes]--get-zone-of-interface=网卡接口 #查看此网卡接口当前被附加到那个zone--get-zone-of-source=<source>[/<mask>]|<MAC>|ipset:<ipset>--get-[default-zone |active-zones |target |ipsets |ipset-types |descripton |short |helpers]zone选项:注:zone可设置target,即iptables的动作,默认public的动作是仅允许icmp报文.--set-default-zone=<zone> #设置默认zone, 默认为:public创建zone有两种方法:--new-zone=<zone> #直接指定zone名称创建.--new-zone-from-file=<filename> [--name=<zone>]#根据/etc/firewalld/zones/ 或 /usr/lib/firewalld/zones/下已有的zone.xml来创建.例:firewall-cmd --new-zone=test --permanentfirewall-cmd --reload #任何操作完成后,都必须刷新后,才能查看到。注: 实际上firewalld也采用了多层结构来管理iptables规则,--permanent实际上是将当前在内存中的修改刷写到磁盘的配置文件中,这个配置文件就是默认zone的配置文件,默认在/etc/firewalld/zone/public.xml--reload则是将内存中的数据同步到运行时的firewalld管理的runtime数据结构中。在默认zone 或 指定zone下可做的操作:--add-port=<portid>[-<portid>]/<protocol>--add-source-port=<portid>[-<portid>]/<protocol>--add-protocol=<protocol>--add-service=<service>注:service就相当于port,source-port,protocol的集合,可将这些单独的元素,打包成一个服务来通过调用它,一并创建port,source-port,protocol规则。创建服务和创建zone一样,也是两种方式:--new-service=<service> #指定服务名称来创建--new-service-from-file=<filename> [--name=<service>] #根据已有xml文件来创建在服务下可做的操作:--service=<service> --add-port=<portid>[-<portid>]/<protocol>--service=<service> --add-source-port=<portid>[-<portid>]/<protocol>注:port 和 source-port都可以定义多个,但是测试发现,定义多个后,仅第一个会在iptables中的filter表中创建允许规则。若需要定义多个自定义端口,最好使用范围来创建允许一个端口范围的规则。--service=<service> --add-protocol=<protocol> #它可以被创建为单独的一条运行某协议的iptables规则.--service=<service> --add-module=<module> #不知道如何使用--service=<service> --set-description=<description> #定义一个具体功能描述说明--service=<service> --set-short=<description> #定义一个简短描述名--service=<service> --set-destination=<ipv>:<address>[/<mask>] #定义目标地址. 因为对于服务来说,它的源只能是自己。例:#创建服务的示例:firewall-cmd --new-service=test --permanentfirewall-cmd --service=test --add-port=9090/tcp --permanentfirewall-cmd --service=test --add-source-port=10001-10003/tcp --permanentfirewall-cmd --service=test --add-protocol=udp --permanentfirewall-cmd --service=test --set-description='This is a test service !' --permanentcat /etc/firewalld/services/test.xmlfirewall-cmd --add-service=test --premanent #这样就执行创建iptables规则了。firewall-cmd --reloadiptables -n -v -L在默认zone 或 指定zone下,添加网卡接口 和 源地址规则:--add-interface=<interface>注:将指定物理网卡的接口添加到zone中.默认是添加到public zone中.firewalld执行此操作后,会在INPUT链 和 FORWARD链中添加入站 和 转发规则。firewall-cmd --add-interface=eth1 --permanentfirewall-cmd --reloadiptables -v -n -L |grep -C3 'eth1‘--add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>注:将指定源地址添加到指定zone中,默认:public.firewalld 执行此操作后, 会在INPUT链 和 FORWARD链中添加入站 和 转发规则.firewall-cmd --add-source=10.0.0.0/24 --permanentfirewall-cmd --reloadiptables -v -n -L |grep -B3 ‘10.0.0.0/24’ICMP相关的规则:--add-icmp-block=<icmptype>--add-icmp-block-inversion在默认zone 或 指定zone下启用NAT功能:注:它支持DNAT(端口转发) 和 SNAT(源地址转换)--add-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]]例:firewall-cmd --add-forward-port=port=10003:proto=tcp:toport=22:toaddr=192.168.0.12注:添加一条临时规则,若--reload将被删除.此规则创建一个DNAT规则,将访问防火墙10003端口的报文转发给192.168.0.12的22号端口上。firewall-cmd执行此命令,实现DNAT的步骤如下:1.在mangle中添加一条规则去匹配目标端口是10003的报文,然后将其打上标记。2.在nat条中添加一条DNAT规则,通过匹配标记,将其源地址修改为192.168.0.12后,从转发filter表.3.在filter表中添加一条转发规则,只要匹配指定标记,就直接转发。4.开启系统的转发功能。#启用IPv4的动态IP伪装(即动态SNAT),它仅在POST_public_allow 链中添加了一条出接口非环回口的SNAT规则.--add-masqueradedirect选项:注:此选项支持直接编写iptables规则.--add-chain {ipv4|ipv6|eb} <table> <chain>--add-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>...注:priority: 就是规则插入的行号,越靠前越优先。arg: iptables相关规则选项。Whitelist选项:firewall-cmd --lockdown-on #先开启功能,在设置谁能操纵firewall-cmd.firewall-cmd --add-lockdown-whitelist-command=<command>--add-lockdown-whitelist-context=<context>--add-lockdown-whitelist-uid=<uid>--add-lockdown-whitelist-user=<user>rich富语言选项用法:firewall-cmd [--zone=zone] [--add|--list|--query|--remove]-rich-rule='rule' [--timeout=seconds]注:--timeout: 设置规则超时时间,若超时则自动删除,单位:秒rule: 简略版[source][destination]service|port|protocol|icmp-block|masquerade|forward-port[log][audit][accept|reject|drop]rule:详细版[family="ipv4|ipv6"][source |destination] address="address[/mask]" [invert="True|yes"][[service name="service name" ]| [port port="number_or_range" protocol="tcp|udp"] | [protocol value="协议名"] ][ icmp-block name="icmptype name" ][masquerade][forward-port port="number_or_range" protocol="tcp|udp" to-port="number_or_range" to-addr="address"][log [prefix=prefix text] [level=log level] limit value=rate/duration][audit][accept | reject [type="reject type"] | drop]masquerade:创建动态SNAT【即:自动判断用户要去的网络,查询路由后,将SNAT用户的源地址转换为可去往该网络的IP】创建SNAT:firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.0.0/24 masquerade accept"注:更简单的动态SNAT配置:firewall-cmd --permanent --add-masqueradefirewall-cmd --permanent --query-masquerade #可查看是否启动成功.若内部有多个网段时,它可自动识别不同网段,并完成SNAT.跟它类似的SNAT配置为:firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=1.1.1.0/24 invert=yes"注:invert=yes: 表示反转的意思,即只要不是1.1.1.0/24网络的都做SNAT.和直接写--add-masquerade类似.验证:#查看自动配置的转发规则,即SNAT回来的数据包,给予转发放行.iptables -vnL |grep -C5 192.168.0.0/24#查看自动配置的NAT表中的POSTROUTING链的的转化记录.iptables -vnL -t nat |grep -C5 192.168.0.0/24客户端:#客户端与SNAT服务器之间是192.168.0.0/24网络,SNAT端连接Internet.#注意添加默认路由时,一定要指明是global,或使用via关键字,指明下一跳.#否则创建的路由将是link类型的,系统将认为,我们其实是在一个网络中.于是#当我们ping 1.1.1.2时,系统将认为,客户端和1.1.1.0/24在一个局域网中,#于是发生ARP查询,这样肯定是查不到1.1.1.2的MAC的,就导致不通!ip route default via 192.168.0.1 dev eth0ping 1.1.1.2端口转发:#将源地址是172.24.8.0/24网络的,访问我的5432端口,则将其转发到我的22号端口.并记录日志,日志前缀为[ADMIN LOGIN]#而且限制每分钟只记录一条日志.firewall-cmd --add-rich-rule="rule family=ipv4 source address=172.24.8.0/24 forward-port port=5432 \protocol=tcp to-port=22 log prefix='[ADMIN LOGIN]' limit value=1/m accept"简单的允许对任意源做端口转发:firewall-cmd --add-forward-port=port=5432:proto=tcp:toport=22 --timeout=100注:格式:[--permanent] [--zone=zone] \--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \[--timeout=seconds]