firewalld防火墙

Centos7-----firewalld详解
1、概述:
Filewalld(动态防火墙)作为redhat7系统中变更对于netfilter内核模块的管理工具;
iptables service 管理防火墙规则的模式(静态):用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,
再执行命令 /etc/init.d/iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,
然后重新完整地加载所有新的防火墙规则,如果加载了防火墙的模块,需要在重新加载后进行手动加载防火墙的模块;
firewalld 管理防火墙规则的模式(动态):任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。
还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。
 
2、便于理解:
相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,
从而实现防火墙策略之间的快速切换。例如,我们有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。
按常理来讲,这三者的安全性按照由高到低的顺序来排列,应该是家庭、公司办公室、咖啡厅。
当前,我们希望为这台笔记本电脑指定如下防火墙策略规则:在家中允许访问所有服务;
在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。
在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,
然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。
 
 
3、区域:
firewalld中常见的区域名称(默认为public)。
firewalld将网卡对应到不同的区域(zone),zone 默认共有9个:
block(拒绝) dmz(非军事化) drop(丢弃) external(外部) home(家庭) internal(内部) public(公开) trusted(信任) work(工作区).
不同的区域之间的差异是其对待数据包的默认行为不同,firewalld的默认区域为public;
 
4、文件:
/usr/lib/firewalld/services/ :firewalld服务默认在此目录下定义了70+种服务供我们使用,格式:服务名.xml;
/etc/firewalld/zones/ : 默认区域配置文件,配置文件中指定了编写完成的规则(规则中的服务名必须与上述文件名一致);
分为多个文件的优点 :
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式;
 
5、命令语法
firewall-cmd [--zone=zone] 动作 [--permanent]
注:如果不指定--zone选项,则为当前所在的默认区域,--permanent选项为是否将改动写入到区域配置文件中
 
6、firewall的状态:
--state ##查看防火墙的状态
--reload ##重新加载防火墙,中断用户的连接,将临时配置清掉,加载配置文件中的永久配置
--complete-reload ##重新加载防火墙,不中断用户的连接(防火墙出严重故障时使用)
--panic-on ##紧急模式,强制关闭所有网络连接,--panic-off是关闭紧急模式
 
7、动作中查看操作:
--get-icmptypes ##查看支持的所有ICMP类型
--get-zones ##查看所有区域
--get-default-zone ##查看当前的默认区域
--get-active-zones ##查看当前正在使用的区域
--get-services ##查看当前区域支持的服务
--list-services ##查看当前区域开放的服务列表
--list-all ##查看此区域内的所有配置,类似与iptables -L -n
 
8、更改区域操作:
--set-default-zone=work ##更改默认的区域
 
9、新建--add或删除--remove规则:
--add-interface=eth0 ##将网络接口添加到默认的区域内
--add-port=12222/tcp --permanent ##添加端口到区域开放列表中
--add-port=5000-10000/tcp --permanent ##将端口范围添加到开放列表中;
--add-service=ftp --permanent ##添加服务到区域开放列表中(注意服务的名称需要与此区域支持的服务列表中的名称一致)
--add-source=192.168.1.1 ##添加源地址的流量到指定区域
--remove-source=192.168.1.1 ##删除源地址的流量到指定区域
--change-interface=eth1 ##改变指定的接口到其他区域
--remove-service=http ##在home区域内将http服务删除在开放列表中删除
--add-masquerade ##开启SNAT(源地址转换)
--query-masquerade ##查询SNAT的状态
--remove-interface=eth0 ##将网络接口在默认的区域内删除
--query-interface=eth0 ##确定该网卡接口是否存在于此区域
--add-forward-port=port=513:proto=tcp:toport=22:toaddr=192.168.100.101 ##端口转发
 
10、Rich规则:
当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
.rich-rules 富规则,功能强,表达性语言,查看帮助:man 5 firewalld.richlanguage
.rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率
rich规则实施顺序有以下四点
a.该区域的端口转发,伪造规则
b.该区域的日志规则
c.该区域的允许规则
d.该区域的拒绝规则
每个匹配的规则都生效,所有规则都不匹配,该区域默认规则生效;
Rich规则语法:
Rich规则选项:
--add-rich-rule=’rule’ ##新建rich规则
--remove-rich-rule=’rule’ ##删除rich规则
--query-rich-rule=’rule’ ##查看单条rich规则
--list-rich-rules ##查看rich规则列表
Rich规则示例:
#拒绝从192.168.0.11的所有流量
firewall-cmd --permanent --add-rich-rule=‘rule family=ipv4 source address=192.168.0.11/32 reject‘
#限制每分钟只有两个连接到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 --zone=vnc --add-rich-rule=‘rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept‘
##开启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'
 
转自:https://blog.51cto.com/11638832/2092203
 
HTTP访问控制:
====LAB1=====: 将source 172.25.0.0/24 引导到zone work
# firewall-cmd --get-default-zone
public
# firewall-cmd --permanent --zone=work --add-service=http
# firewall-cmd --reload
依然无法从客户端访问http,因为访问http流量默认进入默认zone public
# firewall-cmd --permanent --zone=work --add-source=172.25.0.0/24
# firewall-cmd --reload
可以访问
====LAB2=====:: 将source 172.25.0.0/24 引导到zone trusted
# firewall-cmd --permanent --zone=work --remove-source=172.25.0.0/24
# firewall-cmd --permanent --zone=work --remove-service=http
# firewall-cmd --permanent --zone=trusted --add-source=172.25.0.0/24
# firewall-cmd --reload
可以访问
====LAB3=====: 将source 172.25.0.0/24 引导到zone block
# firewall-cmd --permanent --zone=trusted --remove-source=172.25.0.0/24
# firewall-cmd --permanent --zone=block --add-source=172.25.0.0/24
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
不可访问
# firewall-cmd --permanent --zone=block --remove-source=172.25.0.0/24
# firewall-cmd --reload   可以访问
 
=====所有进入包都可以route 到 zone public=====
# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# firewall-cmd --permanent --add-service=ftp
# firewall-cmd --permanent --add-service=mysql
# firewall-cmd --permanent --add-service=ssh
# firewall-cmd --permanent --add-port=3306/tcp
# firewall-cmd --reload
 
== Rich Rules 富规则==
通过“ rich language”语法,可以用比直接接口方式更易理解的方法建立复杂防火墙规则。此外,还能永久保留设置。这种语言使用关键词值,是 iptables 工具的抽象表示。这种语言可以用来配置分区,也仍然支持现行的配置方式。
增加一项规则的命令格式如下:
firewall-cmd [--zone=zone] --add -rich-rule='rule'
移除一项规则:
firewall-cmd [--zone=zone] --remove-rich-rule='rule'
检查一项规则是否存在:
firewall-cmd [--zone=zone] --query-rich-rule='rule'
列出所有多语言规则:
firewall-cmd --list-rich-rules
====lab1: 允许172.25.0.10访问http服务
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="http" source address="172.25.0.10" accept'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="http" NOT source address="172.25.0.10" accept'
====lab2: 允许172.25.0.0/24 访问any service
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.25.0.0/24" accept'
====lab3: 允许172.25.0.0/24 使用ssh访问
# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="172.25.0.0/24" service name="ssh" accept
====lab4: 不允许172.25.1.0/24 访问
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.1.0/24 reject'
====lab5: 不允许172.25.0.0/24 访问http
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.0.0/24 service name=http reject'
====lab6: 限制每分钟只有100个连接访问ftp
# firewall-cmd --permanent --add-rich-rule='rule service name=ftp limit value=100/m accept'
====lab7: 同意新的 IPv4 和 IPv6 连接 FTP ,并使用审核每分钟登录一次。
# firewall-cmd --add-rich-rule='rule service name=ftp log limit value="1/m" audit accept'
====lab8:允许来自172.25.0.0/24地址的新连接连接ssh服务,并以ssh前缀记录notice级别的日志每分钟三次
# firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept'
====lab9:丢弃所有icmp包
# firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'
====lab10:当使用source和destination指定地址时,必须有family参数指定ipv4或ipv6。如果指定超时,规则将在指定的秒数内被激活,并在之后被自动移除。
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.0/24 reject' --timeout=10
====lab11:拒绝所有来自2001:db8::/64子网的主机访问dns服务,并且每小时只审核记录1次日志。
# firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300
====lab12:转发来自ipv6地址1:2:3:4:6::TCP端口4011,到1:2:3:4:7的TCP端口4012
# firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'
====lab13:允许192.168.1.0/24网段访问tcp7900-7905端口
# firewall-cmd --permanent --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
 
== NAT ==
方法一:masquerade (SNAT)
# firewall-cmd --permanent --add-masquerade
# firewall-cmd --reload
方法二:source 192.168.0.0/24
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
方法三:NOT source 192.168.0.0/24
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source NOT address=192.168.0.0/24 masquerade'
 
==Port forwarding 转到本机== 本机端口转发
# firewall-cmd --permanent --add-forward-port=port=6666:proto=tcp:toport=22
# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" forward-port port="6666" protocol="tcp" to-port="22"'
 
==Port forwarding 转到其它主机== (DNAT)
# firewall-cmd --permanent --add-masquerade
# firewall-cmd --permanent --add-forwardport=port=7777:proto=tcp:toport=22:toaddr=172.25.0.10
 
==Direct Rules==
通过 firewall-cmd 工具,可以使用 –direct 选项在运行时间里增加或者移除链。
添加规则:
# firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -p tcp --dport 80 -j ACCEPT
删除规则:
# firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 10 -p tcp --dport 80 -j ACCEPT
列出规则:
# firewall-cmd --direct --get-all-rules
 
==管理SELinux端口标签==
列出端口标签:
# semanage port -l
添加端口标签:
# semanage port -a -t http_port_t -p tcp 82
删除端口标签:
# semanage port -d -t http_port_t -p tcp 82