Firewalld 与Iptables 的区别
FirewallD 即Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器,是 iptables 的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面,在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比,使用 FirewallD 有两个主要区别:
- FirewallD 使用区域和服务而不是链式规则。
- FirewallD可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
在RHEL7里有几种防火墙共存:FirewallD、iptables、ebtables,默认是使用FirewallD来管理netfilter子系统,不过底层调用的命令仍然是iptables等。
FirewallD跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
FirewallD自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说FirewallD和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过FirewallD和iptables的结构以及使用方法不一样罢了。
iptables 服务在 /etc/sysconfig/iptables 中储存配置,而 FirewallD 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,使用 iptables 的时候每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则,使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同。因此 FirewallD 可以在运行时改变设置而不丢失现行配置。
一个重要的概念:区域管理
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
- 阻塞区域(block):任何传入的网络数据包都将被阻止。
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 - 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
- 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
- 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
- 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
- 信任区域(trusted):所有的网络连接都可以接受。
- 丢弃区域(drop):任何传入的网络连接都被拒绝。
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 - 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
- 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。
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的配置方法主要有三种:
- firewall-config
- firewall-cmd
- 直接编辑xml文件
其中 firewall-config是图形化工具,firewall-cmd是命令行工具
一、常用操作
1)重新加载配置
firewall-cmd --reload
2)查看所有配置
firewall-cmd --list-all
3)查看当前开放的端口(允许任意IP访问)
firewall-cmd --zone=public --list-ports
4)开放指定端口(允许任意IP访问)
以开放80端口为例
firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
PS. --permanent为永久生效,没有此参数centos重启后该配置将失效
5)移除端口(允许任意IP访问的端口)
以撤销80端口的开放为例
firewall-cmd --zone=public --remove-port=80/tcp --permanent firewall-cmd --reload
PS. --permanent为永久生效,没有此参数centos重启后该配置将失效
6)查看允许指定IP访问端口的规则
firewall-cmd --zone=public --list-rich-rules
7)开放指定端口(只允许指定IP访问)
以“只允许192.168.1.1的主机连接3306端口”为例
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="3306" accept" --permanent firewall-cmd --reload
PS. --permanent为永久生效,没有此参数centos重启后该配置将失效
8)移除规则(只允许指定IP访问的端口)
以“移除只允许192.168.1.1的主机连接3306端口”为例
firewall-cmd --remove-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="3306" accept" --permanent firewall-cmd --reload
PS. --permanent为永久生效,没有此参数centos重启后该配置将失效
9)移除默认的ssh服务
移除默认的ssh服务前,先确认是否已经额外开放了22端口,否则会导致无法使用ssh远程连接。
firewall-cmd --remove-service=ssh --permanent firewall-cmd --reload
PS. --permanent为永久生效,没有此参数centos重启后该配置将失效
10)查看某个端口是否开放
以检查80端口为例(yes:开放;no:未开放)
firewall-cmd --zone=public --query-port=80/tcp
11)TCP端口转发
# 允许防火墙伪装IP
firewall-cmd --add-masquerade
# 将本地80端口的流量转发到192.168.1.1的80端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.1:toport=80 --permanent
PS. --permanent为永久生效,没有此参数centos重启后该配置将失效
二、其它操作
查看版本: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
FIREWALLD防火墙 禁止/限制 特定用户的IP访问,DROP和REJECT区别
1.drop禁止特定ip连接
ssh
/22
服务
firewall-cmd --permanent --zone=public --add-rich-rule=
"rule family=ipv4 source address='x.x.x.x/24' service name='ssh' drop"
firewall-cmd --reload
##重新加载防火墙配置,不然firewall-cmd --list-all-zones不会显示刚加上的规则
2.reject禁止特定ip连接
ssh
/22
服务
firewall-cmd --permanent --zone=public --add-rich-rule=
"rule family='ipv4' source address='x.x.x.x/24' service name='ssh' reject"
firewall-cmd --permanent --zone=public --add-rich-rule=
"rule family='ipv4' source address='x.x.x.x/24' port port=22 protocol=tcp reject"
firewall-cmd --reload
3.accept运行特定ip连接
ssh
/22
服务
firewall-cmd --permanent --zone=public --add-rich-rule=
"rule family=ipv4 source address='x.x.x.x/24' port port=22 procotol=tcp accept"
firewall-cmd --reload
防火墙内的策略动作有DROP和REJECT两种,区别如下:
1、DROP动作只是简单的直接丢弃数据,并不反馈任何回应。需要Client等待超时,Client容易发现自己被防火墙所阻挡。
2、REJECT动作则会更为礼貌的返回一个拒绝(终止)数据包(TCP FIN或UDP-ICMP-PORT-UNREACHABLE),明确的拒绝对方的连接动作。连接马上断开,Client会认为访问的主机不存在。REJECT在IPTABLES里面有一些返回参数,参数如下:ICMP port-unreachable、ICMP
echo
-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
至于使用DROP还是REJECT更合适一直未有定论,因为的确二者都有适用的场合。REJECT是一种更符合规范的处理方式,并且在可控的网络环境中,更易于诊断和调试网络/防火墙所产生的问题;而DROP则提供了更高的防火墙安全性和稍许的效率提高,但是由于DROP不很规范(不很符合TCP连接规范)的处理方式,可能会对你的网络造成一些不可预期或难以诊断的问题。因为DROP虽然单方面的中断了连接,但是并不返回任何拒绝信息,因此连接客户端将被动的等到tcp session超时才能判断连接是否成功,这样早企业内部网络中会有一些问题,例如某些客户端程序或应用需要IDENT协议支持(TCP Port 113, RFC 1413),如果防火墙未经通知的应用了DROP规则的话,所有的同类连接都会失败,并且由于超时时间,将导致难以判断是由于防火墙引起的问题还是网络设备/线路 故障。
一点个人经验,在部署防火墙时,如果是面向企业内部(或部分可信任网络),那么最好使用更绅士REJECT方法,对于需要经常变更或调试规则的网络也是如此;而对于面向危险的Internet
/Extranet
的防火墙,则有必要使用更为粗暴但是安全的DROP方法,可以在一定程度上延缓******的进度(和难度,至少,DROP可以使他们进行TCP-Connect方式端口扫描时间更长)。