简介
-
概述: 防火墙是Linux系统的 主要的安全工具 ,可以提供基本的安全防护,在Linux历史上已经使用过的防火墙工具包括:ipfwadm、ipchains、iptables (即Centos6就是使用的iptables) ,而在firewalld中新引入了 区域(Zone) 这个概念
-
特点: 以前的iptables防火墙是静态的,每次修改都要求防火墙完全重启,这个过程包括内核netfilter防火墙模块的卸载和新配置所需模块的装载等,而模块的卸载将会破坏状态防火墙和确立建立的连接,现在firewalld可以动态管理防火墙,firewalld把netfilter的过滤功能集于一身 总结成几个小点:
firewalld提供了支持 网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。 支持 IPv4,IPv6 的防火墙设置以及以太网桥接 支持服务或者应用程序直接添加防火墙规则的接口 拥有运行时配置和永久配置两种选项。
运行时配置——服务或系统重启后失效
永久配置——服务或系统关机、重启后生效
网络区域
firewalld预定义的九种网络区域:
trusted、public、work、home、internal、external、dmz、block、drop
————默认情况就有一些有效的区域,由firewalld提供的区域按照从不信任到信任的顺序排序
(1)丢弃区域(Drop Zone): 如果使用丢弃区域,任何进入的数据包将被丢弃,这个类似于Centos6上的 iptables -j drop ,使用丢弃规则意味着将不存在响应。
(2)阻塞区域(Block Zone): 阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过,即只允许由该系统初始化的网络连接。
(3)公共区域(Public Zone): 只接受那些被选中的连接,默认只允许ssh和dhcpv6-client,这个zone是缺省zone (缺省就是默认的意思,所以公共区域也是默认区域,在没有任何配置的情况下走的是公共区域)
(4)外部区域(External Zone): 这个区域相当于路由器的启动伪装(masquerading)选项,只有指定的连接会被接受,即ssh,而其他的连接将被丢弃或者不被接受
(5)隔离区域(DMZ Zone): 如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义,它也拥有只通过被选中连接的特性,即ssh, 这个区域又叫做非军事化区域
(6)工作区域(Work Zone): 在这个区域中,我们只能定义内部网络,比如私有网络通信才被允许, 只允许ssh、ipp-client和dhcpv6-client
(7)家庭区域(Home Zone): 这个区域专门用于家庭环境,它同样只允许被选中的连接, 即ssh、ipp-client、mdns、samba-client和dhcpv6-client
(8)内部区域(Internal Zone): 这个区域和 工作区域(Work Zone) 类似,只允许通过被选中的连接,与 家庭区域(Home Zone) 相同
(9)信任区域(Trusted Zone): 信任区域允许所有网络通信通过,因为 信任区域(Trusted Zone)是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为 信任区域(Trusted Zone)是允许所有连接的
————以上是系统定义的所有的区域(Zone),但是,不是所有的区域(Zone)都在使用,只有活跃的区域(Zone)才有实际操作意义
注意:因为默认区域只允许ssh和dhcp,所以在没有任何配置的情况下默认是拒绝ping包的
检查原则
如果一个客户端访问服务器,服务器根据以下原则决定使用哪个区域(zone)的策略去匹配:
(1)如果一个客户端数据包的源IP地址匹配Zone的 来源(sources) 也就是匹配区域的规则,那么该 Zone的规则就适用这个客户端,一个源只能属于一个 Zone,不能同时属于多个区域(Zone)
(2)如果一个客户端数据包进入服务器的某一个接口(如ens33网卡接口)匹配了 Zone的 接口(interfaces),则该Zone的规则就适用这个客户端,一个接口只能属于一个 Zone ,不能同时属于多个Zone
(3)如果上述两个原则都不满足,那么默认的 Zone将被应用 firewalld数据处理流程 ,检查数据来源的源地址,
firewalld数据处理流程
检查数据来源的源地址:
(1)若源地址关联到特定的区域,则执行该区域所制定的规则
(2)若源地址未关联到特定的区域,则使用关联网络接口的区域并执行该区域所制定的规则
(3)若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则
数据包处理原则
检查源地址的处理规则:
- 匹配源地址所在区域
- 匹配入站接口所在区域
- 匹配默认区域
firewalld防火墙的配置方法
有三种配置方法,分别是:
- firewall-config图行化工具
- firewall-cmd命令行工具
- /etc/firewalld/中的配置文件
区域管理选项说明
(前面都是firewall-cmd)
(1)--get-default-zone 显示网络连接或接口的默认区域
(2)--set-default-zone=区域名称 设置网络连接或接口的默认区域
(3)--get-active-zones 显示已激活的所有区域
(4)--get-zone-of-interface=网卡名称 显示指定接口绑定的区域
(5)--zone=区域名称 --add-interface=网卡名称 为指定接口绑定区域
(6)--zone=区域名称 --change-interface=网卡名称 为指定的区域更改绑定的网络接口
(7)--zone=区域名称 --remove-interface=网卡名称 为指定的区域删除绑定的网络接口
(8)--list-all-zones 显示所有区域及其规则
(9)--zone=区域名称 --list-all 显示指定区域的所有规则
(10)--list-all 显示默认区域的所有规则
- 示例:
******显示当前系统的默认区域
[root@Firewalld ~]# firewall-cmd --get-default-zone
public
******显示默认区域的所有规则
[root@Firewalld ~]# firewall-cmd --list-all
public (active) (表示public这个区域是活动区域即可用区域,如果是默认区域会多一个defaults)
target: default
icmp-block-inversion: no
interfaces: ens33 (表示public这个区域的网卡接口是ens33)
sources: (列出了public这个区域的源,现在这里没有,但是如果有的话,格式是xxx.xxx.xxx.xxx/xx)
services: dhcpv6-client ssh (表示public区域允许通过的服务类型)
ports: (表示public区域允许通过的端口)
protocols: (允许的通过的协议)
masquerade: no (表示这个区域不允许ip伪装,如果允许的话也同时会允许IP转发,即开启路由功能)
forward-ports: (列出转发的端口)
source-ports:
icmp-blocks: (列出阻塞icmp流量的黑名单)
rich rules: (在public区域中优先处理的高级配置)
-------------------------华丽丽的分割线-------------------------
target的作用:
当一个区域处理它的源或接口上的一个包时,但是没有处理该包的显式规则时,这个时候区域的目标target决定了该行为
(1)ACCEPT : 通过这个包
(2)%%REJECT%% : 拒绝这个包,并且返回一个拒绝的回复
(3)DROP : 丢弃这个包,不回复任何信息
(4)default : 不做任何事情,该区域不再管他,把它提到“楼上”
--------------------------------------------------------------
******显示网络接口ens33的对应区域
[root@Firewalld ~]# firewall-cmd --get-zone-of-interface=ens33
public (说明ens33的区域是public)
******更改ens33的区域为internal
[root@Firewalld ~]# firewall-cmd --zone=internal --change-interface=ens33
success (更改成功)
[root@Firewalld ~]# firewall-cmd --get-zone-of-interface=ens33
internal (再次查看发现已经更改为internal区域)
******查看全部活动区域
[root@Firewalld ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
服务管理选项说明
***服务存放在/usr/lib/firewalld/services目录中,通过单个的xml配置文件来指定
***xml文件:service-name。xml
(1)--zone=区域名称 --list-services 显示指定区域内允许访问的所有服务
(2)--zone=区域名称 --add-service=服务名称 为指定区域设置允许访问的某项服务
(3)--zone=区域名称 --remove-service=服务名称 删除指定区域已设置的允许访问的某项服务
(4)--zone=区域名称 --list-ports 显示指定区域内允许访问的所有端口号
(5)--zone=区域名称 --add-port=端口号-端口号/协议名 为指定区域设置允许访问的某个或某段端口号并指定协议名(中间的-表示从多少到多少端口号, / 和后面跟端口的协议)
(6)--zone=区域名称 --remove-port=端口号-端口号/协议名 删除指定区域已设置的允许访问的某个端口号或某段端口号并且指定协议名(中间的-表示从多少到多少端口号, / 和后面跟端口的协议)
(7)--zone=区域名称 --list-icmp-blocks 显示指定区域内拒绝访问的所有ICMP类型
(8)--zone=区域名称 --add-icmp-block=icmp类型 为指定区域设置拒绝访问的某项ICMP类型
(9)--zone=区域名称 --remove-icmp-block=icmp类型 删除指定区域已设置的拒绝访问的某项ICMP类型,省略 --zone=区域名称 时表示对默认区域操作
- 示例:
******显示默认区域允许访问的所有服务
[root@Firewalld ~]# firewall-cmd --list-services
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
dhcpv6-client ssh (说明允许dhcp和ssh)
******设置默认区域允许访问http和https服务 (不加--zone指定的话就是配置默认区域)
[root@Firewalld ~]# firewall-cmd --add-service=http
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
success
[root@Firewalld ~]# firewall-cmd --add-service=https
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
success
[root@Firewalld ~]# firewall-cmd --list-services (再次查看)
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
dhcpv6-client http https ssh (多了http和https)
预定义的服务可以使用服务名配置,同时其对应端口会自动打开,非预定义的服务只能手动指定端口
******给指定区域添加tcp443端口
[root@Firewalld ~]# firewall-cmd --zone=internal --add-port=443/tcp
success
[root@Firewalld ~]# firewall-cmd --zone=internal --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client mdns samba-client ssh
ports: 443/tcp (发现添加成功)
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
******删除指定区域的443/tcp端口
[root@Firewalld ~]# firewall-cmd --zone=internal --remove-port=443/tcp
success
[root@Firewalld ~]# firewall-cmd --zone=internal --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
防火墙配置放行策略
firewalld放行服务
[root@m01 ~]# yum install -y httpd
[root@m01 ~]# systemctl start httpd
#浏览器访问失败
[root@m01 ~]# firewall-cmd --add-service=http --permanent
[root@m01 ~]# firewall-cmd --reload
success
#浏览器访问成功
[root@m01 ~]# firewall-cmd --remove-service=http --permanent
[root@m01 ~]# firewall-cmd --reload
#浏览器访问失败
firewalld放行端口
[root@m01 ~]# firewall-cmd --add-port=80/tcp --permanent
[root@m01 ~]# firewall-cmd --reload
浏览器访问成功
[root@m01 ~]# firewall-cmd --remove-port=80/tcp --permanent
[root@m01 ~]# firewall-cmd --reload
浏览器访问失败
firewalld放行自定义服务
#1.名称代表后面添加的服务名称
[root@m01 ~]# cp /usr/lib/firewalld/services/{http.xml,zabbix-agent.xml}
修改内容
#2.重载firewalld
[root@m01 ~]# firewall-cmd --reload
success
#3.添加自定义后的服务名
[root@m01 ~]# firewall-cmd --add-service=zabbix-agent --permanent
[root@m01 ~]# firewall-cmd --reload
success
防火墙端口转发策略
端口转发是指传统的目标地址映射,实现外网访问内网资源,流量转发命令格式为:
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
如果需要将本地的10.0.0.61:5555端口转发至后端172.16.1.9:22端口
1.firewalld实现端口转发(端口映射)只能转发tcp相关的服务
#1.添加端口转发
[root@m01 ~]# firewall-cmd --add-forward-port=port=2222:proto=tcp:toport=22:toaddr=172.16.1.7 --permanent
[root@m01 ~] firewall-cmd --reload
#2.开启伪装ip
[root@m01 ~]# firewall-cmd --add-masquerade --permanent
[root@m01 ~] firewall-cmd --reload
#3.查看区域配置
[root@m01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth1 eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports: port=2222:proto=tcp:toport=22:toaddr=172.16.1.7
source-ports:
icmp-blocks:
rich rules:
防火墙富语言规则策略
firewalld中的富语言规则表示更细致,更详细的防火墙策略配置,他可以针对系统服务、端口号、原地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有的防火墙策略中也是最高的,下面为firewalld富语言规则帮助手册
[root@m01 ~]# man firewall-cmd
[root@m01 ~]# man firewalld.richlanguage
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
accept | reject [type="reject type"] | drop
#富语言规则相关命令
--add-rich-rule='<RULE>' #在指定的区域添加一条富语言规则
--remove-rich-rule='<RULE>' #在指定的区删除一条富语言规则
--query-rich-rule='<RULE>' #找到规则返回0,找不到返回1
--list-rich-rules #列出指定区里的所有富语言规则
1.比如允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问10050端口
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.0.0.1" service name=http accept' --permanent
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="172.16.1.0/24" port port="10050" protocol="tcp" accept' --permanent
2.默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop' --permanent
3.使用firewalld,允许所有人能访问http,https服务,但只有10.0.0.1主机可以访问ssh服务
[root@m01 ~]# firewall-cmd --remove-service=ssh --permanent
[root@m01 ~]# firewall-cmd --add-service={http,https} --permanent
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=ssh accept' --permanent
4 当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.7的22端口
[root@m01 ~]# firewall-cmd --add-masquerade --permanent
[root@m01 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.7"' --permanent
5.查看设定的规则,如果没有添加--permanent参数则重启firewalld会失效。富规则按先后顺序匹配,按先匹配到的规则生效
[root@m01 ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.0.0.1" service name="http" accept
rule family="ipv4" source address="172.16.1.0/24" service name="ssh" drop
rule family="ipv4" source address="10.0.0.1" service name="ssh" accept
rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.9"
防火墙开启内部上网
在指定的带有公网IP的实例上启动Firewalld防火墙的NAT地址装换,以此达到内部主机上网。
1、防火墙开启IP伪装
[root@Firewalld ~]# firewall-cmd --add-masquerade --permanent
[root@Firewalld ~]# firewall-cmd --reload
2、防火墙开启内核转发
注意这一步只有CentOS6系统需要做,CentOS7中默认已经开启。
#配置内核转发
[root@m01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#在CentOS6中开启之后生效命令
[root@m01 ~]# sysctl -p
#查看内核转发是否开启
[root@m01 ~]# sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
3、客户端内网地址配置网关
客户端将网关指向firewalld服务器,将所有网络请求交给firewalld
[root@web03 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61
4、客户端配置DNS服务器
[root@web03 ~]# cat /etc/resolv.conf
nameserver 223.5.5.5
5、重启网络,使其配置生效
[root@m01 ~]# ifdown eth1
Device 'eth1' successfully disconnected.
[root@m01 ~]# ifup eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@web03 ~]# nmcli connection reload
[root@web03 ~]# nmcli connection down eth1 && nmcli connection up eth1
ip 白名单
firewall-cmd --permanent --zone=trusted --add-source=192.168.124.117 --permanent
firewall-cmd --reload
firewalld 日志配置
CentOS操作系统中Firewalld防火墙默认是不记录日志的,如果服务器性能允许,可以通过修改配置文件,使Firewalld防火墙记录日志,这样我们可以通过防火墙记录的日志,查询过滤拒绝的非法ip,把这些ip放入到黑名单中。
1、修改配置文件
/etc/firewalld/firewalld.conf
off:默认值,不记录被拒的包
all:记录所有被拒的包
重启Firewalld服务使其生效,命令:
systemctl restart firewalld
2、把日志记录到文件
创建文件/etc/rsyslog.d/firewalld.conf
vi /etc/rsyslog.d/firewalld.conf
内容:
kern.* /var/log/firewalld.log
3、修改配置文件/etc/logrotate.d/syslog
/var/log/firewalld.log
4、重启rsyslog服务
systemctl restart rsyslog.service
测试如下: