文章目录
firewalld 官方操作文档
firewalld的区域zone介绍(默认共9个,其中public是默认区域)、及配置文件介绍
# 每个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)
- Tips:ipset是ip地址的集合, firewalld使用ipset可以在一条规则中处理多个ip地址, 执行效果更高对ip地址集合的管理也更方便
- Tips:与iptables所用的ipset命令的不同,不要混合使用firewall-cmd的ipset参数与linux平台上的ipset命令,避免引起冲突,
- 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'
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论