Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处:
1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
2、firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
firewalld和iptables的关系
FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。 以前的 system-config-firewall/lokkit 防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。而模块的卸载将会破坏状态防火墙和确立的连接。
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。
firewalld的结构
我们这里所说的结构并不是firewalld软件的结构,而是配置文件的结构。
在具体介绍firewalld配置文件结构之前学生先来给大家介绍一下firewalld的配置模式,firewalld的配置模式设计的非常巧妙,而且这种设计思路也非常值得我们借鉴和学习。
firewalld的配置模式
firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置
用户配置目录 /etc/firewalld/
系统配置目录 /usr/lib/firewalld/services
使用时的规则是这样的:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。
文件和目录的作用
firewalld的配置文件结构非常简单,主要有两个文件和三个目录:
文件:firewalld.conf、lockdown-whitelist.xml
目录:zones、services、icmptypes
另外,如果使用到direct,还会有一个direct.xml文件。我们要注意,在保存默认配置的目录“/usr/lib/firewalld/”中只有我们这里所说的目录,而没有firewalld.conf、lockdown-whitelist.xml和direct.xml这三个文件,也就是说这三个文件只存在于“/etc/firewalld/”目录中。
- firewalld.conf:firewalld的主配置文件,是键值对的格式,不过非常简单,只有五个配置项;
- DefaultZone:默认使用的zone,默认值为public;
- CleanupOnExit:这个配置项非常容易理解,他表示当退出firewalld后是否清除防火墙规则,默认值为yes;
- Lockdown: 这个选项跟D-BUS接口操作firewalld有关,firewalld可以让别的程序通过D-BUS接口直接操作,当Lockdown设置为yes的 时候就可以通过lockdown-whitelist.xml文件来限制都有哪些程序可以对其进行操作,而当设置为no的时候就没有限制了,默认值为 no;
- IPv6_rpfilter:其功能类似于rp_filter,只不过是针对ipv6版的,其作用是判断所接受到的包是否是伪造的,检查方式主要是通过路由表中的路由条目实现的,更多详细的信息大家可以搜索uRPF相关的资料,这里的默认值为yes。
- lockdown-whitelist.xml:当Lockdown为yes的时候用来限制可以通过D-BUS接口操作firewalld的程序
- direct.xml:通过这个文件可以直接使用防火墙的过滤规则,这对于熟悉iptables的用户来说会非常顺手,另外也对从原来的iptables到firewalld的迁移提供了一条绿色通道
- zones:保存zone配置文件
- services:保存service配置文件
- icmptypes:保存和icmp类型相关的配置文件
- zone
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。
常用命令
运行、停止、禁用firewalld
- service firewalld restart 重启
- service firewalld start 开启
- service firewalld stop 关闭
- systemctl stop firewalld 禁用
查看firewall服务状态
systemctl status firewall
firewall-cmd --state
查看防火墙规则
- firewall-cmd --list-all
配置firewalld
查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
查看设置
显示状态:** firewall-cmd --state**
查看区域信息: 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
两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务firewall-cmd --zone=public --add-interface=eth0
将接口添加到区域,默认接口都在public
永久生效再加上 --permanent 然后reload防火墙firewall-cmd --set-default-zone=public
设置默认接口区域
立即生效无需重启
设置端口
查看所有打开的端口:
firewall-cmd --zone=dmz --list-ports加入一个端口到区域:
firewall-cmd --zone=dmz --add-port=80/tcp
若要永久生效再加上 --permanent
例子
开启80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 出现success表明添加成功
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
重启防火墙
systemctl restart firewalld.service
打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹
firewall-cmd --zone=work --add-service=smtp移除服务
firewall-cmd --zone=work --remove-service=smtp
firewall-cmd --zone= public --remove-port=80/tcp --permanent
CentOS切换为iptables防火墙
切换到iptables首先应该关掉默认的firewalld,然后安装iptables服务。
-** 关闭firewall**:
service firewalld stop
systemctl disable firewalld.service #禁止firewall开机启动
- 安装iptables防火墙
yum install iptables-services #安装
- 编辑iptables防火墙配置
vi /etc/sysconfig/iptables #编辑防火墙配置文件
- 下边是一个完整的配置文件:
Firewall configuration written by system-config-firewall
Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
:wq! #保存退出
service iptables start #开启
systemctl enable iptables.service #设置防火墙开机启动