netfilter/iptables是集成在linux2.4.x版本内核中的包过滤防火墙系统。该框架可以实现数据包过滤,网络地址转换以及数据包管理功能。linux中的防火墙系统包括两个部分:netfilte和iptables。netfilte可以对本机所有流入、流出、转发的数据包进行查看、修改、丢弃、拒绝等操作。由于netfilter在内核空间中,用户通常无法接触内核和修改内核,此时需要命令行工具,一般使用iptables、firewalld等工具。使用iptables可以添加、删除具体的过滤规则,iptables默认维护四个表和五个链,所有的防火墙策略规则都将被分别写入表和链中。
centos7系统防火墙模块存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目录下,当需要某个模块功能时,可以通过modprobe加载。centos7在原有的netfilter/iptables架构上又增加了firewalld。iptables工具是一个比较低级别的工具,仅可以调整ipv4的防火墙规则,所以在centos7上使用了firewalld作为默认的用户防火墙工具,但当用户使用firewalld编写ipv4防火墙规则时,firewalld依然是调用了底层的iptables实现具体的功能,只是这个调用过程对用户是透明的。
iptables service在 /etc/sysconfig/iptables中储存配置,而 firewalld将配置储存在 /usr/lib/firewalld/(系统配置,尽量不要修改) 和/etc/firewalld/(用户配置地址)中的各种 XML 文件里。
firewalld将所有的网络流量都分类汇聚到zones中,它通过zones管理防火墙规则,每一个进入系统的数据包,都会首先检查源IP地址和接口,如果与某个zone匹配,则该zone的规则将生效。而每个zone都会有开启或关闭服务和端口的列表,以实现允许或拒绝链接服务和端口。如果数据包的源IP地址和网卡接口都不能和任何zone匹配,则该数据包将匹配默认zone,一般情况下是一个public的默认zone。
firewalld会提供block,dmz,drop,external,home,internal,public,trusted,work这九个zone。比如有一个数据包从eno1网卡进入本机,根据规则进入work这个zone,而在work这个zone中有允许访问http服务的规则,则最后该数据包将可以进入本机并访问http服务
大部分zone都定义的有自己的允许规则,规则通过端口/协议(631/udp)或者预定义的服务(ssh)这种形式设置,如果数据包没有匹配这些允许的规则,则该数据包一般会被防火墙拒绝。但是如果有名为trusted的zone,默认会运行所有的数据流量,如果有一个数据包进入了该zone,则被允许访问所有的资源。
由firewalld 提供的区域按照从不信任到信任的顺序排序:
丢弃区域(Drop Zone)
任何接受的网络数据包都被丢弃,没有任何回复,仅能有发送出去的网络连接(数据包不能进来,但是可以出去)。这个类似与我们之前使用iptables -j drop。
阻塞/限制区域(Block Zone)
阻塞区域会拒绝进入的网络连接,返回 icmp-host-prohibited(ICMP-主机-禁止)
,只有服务器已经建立的连接会被通过,即只允许由该系统初始化的网络连接。
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-admprohibited 信息所拒绝。
公共区域(Public Zone)
只接受那些被选中的连接,默认只允许 ssh 和 dhcpv6-client。这个 zone 是缺省(即默认)zone。
在公共区域内使用,不能相信网络内其他计算机不会对你造成危害,只能接受经过选取的连接。。
外部区域(External Zone)
这个区域相当于路由器的启用伪装(masquerading)选项。只有指定的连接会被接受,即ssh,而其它的连接将被丢弃或者不被接受。
特别是为路由器启用了伪装功能的外部网,你不能信任来自网络的其他计算,不能相信他们不会对你造成伤害,只能接受经过选择的连接。
隔离区域(DMZ Zone)
如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义。它也拥有只通过被选中连接的特性,即ssh。
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过 选择的连接。
工作区域(Work Zone)
在这个区域,我们只能定义内部网络。比如私有网络通信才被允许,只允许ssh,ipp-client和 dhcpv6-client。用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
家庭区域(Home Zone)
这个区域专门用于家庭环境。它同样只允许被选中的连接,即ssh,ipp-client,mdns,samba-client和 dhcpv6-client。
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
内部区域(Internal Zone)
这个区域和工作区域(Work Zone)类似,只有通过被选中的连接,和home区域一样。
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
信任区域(Trusted Zone)
信任区域允许所有网络通信通过。记住:因为trusted是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为trusted是允许所有连接的
1)如果一个客户端数据包的源 IP 地址匹配 zone 的 sources,那么该 zone 的规则就适用这个客户端。一个源只能属于一个zone,不能同时属于多个zone。但是一个zone里可以有多个source。
2)如果一个客户端数据包进入服务器的某一个接口(如eth0)匹配zone的interfaces(接口),则么该 zone 的规则就适用这个客户端;一个接口只能属于一个zone,不能同时属于多个zone。但是一个zone里可以有多个接口。
3)如果上述两个原则都不满足,那么缺省的 zone 将被应用。
我们可以使用任何一种 firewalld 配置工具来配置或者增加区域,以及修改配置。工具有 firewall-cmd 这样的命令行工具,或者你也可以在配置文件目录中创建或者拷贝区域文件,/usr/lib/firewalld/zones 被用于默认和备用配置,/etc/firewalld/zones被用于用户创建和自定义配置文件。命令行工具firewall-cmd支持全部防火墙特性。
1、安装Firewall 命令:
yum install firewalld firewalld-configFirewall
2、区域管理类命令
firewall-cmd --set-default-zone=trusted #设置默认区域为trusted,允许所有的通过,会改变防火墙配置文件:/etc/firewalld/firewalld.conf中的默认值
firewall-cmd --get-default-zone #查看默认区域
firewall-cmd --get-active-zones #查看(活动区域)默认接口和区域
firewall-cmd --get-zones #列出所有可用的区域
firewall-cmd --list-all --zone=public #查看public区域已配置的规则(只显示/etc/firewalld/zones/public.xml中防火墙策略)
firewall-cmd --list-all-zones #查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)
firewall-cmd --permanent --list-port --zone=public #查看端口,不加zone就是查询默认zone
firewall-cmd --zone=public --add-port=3306/tcp --permanent #允许tcp的3306端口到public区域。
#–zone:作用域;–add-port=80/tcp:添加端口,格式为:端口/通讯协议;–permanent:永久生效,没有此参数重启后失效
firewall-cmd --reload #重新加载防火墙配置,并不中断用户连接,即不丢失状态信息
firewall-cmd --zone=public --remove-port=3306/tcp--permanent #从public区将tcp的3306端口移除
firewall-cmd --add-port=2048-2050/udp --zone=public #允许某一范围的端口,如允许udp的2048-2050端口到public区域
firewall-cmd --get-services #查看预定义服务 :
firewall-cmd --add-service=http --zone=public --permanent #添加http服务到public区域
systemctl restart firewalld #重启防火墙服务才生效(permanent状态):
firewall-cmd --remove-service=http --permanent --zone=public #移除public区域的http服务,不使用--zone指定区域时使用默认区域:
firewall-cmd --add-service=http --add-service=https #将多个服务添加到某一个区域,不添加--permanent选项表示是即时生效的临时设置
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --permanent --add-masquerade # 允许防火墙伪装IP
firewall-cmd --permanent --remove-masquerade # 禁止防火墙伪装IP
当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端
口,之后配置防火墙的端口转发,将流量转发过去。
例:
1. firewall-cmd --permanent --add-masquerade #开启地址伪装。
2. firewall-cmd --add-forward-port=port=8080:proto=tcp:toport80 #添加转发8080--》80
3. firewall-cmd --add-port=8080/tcp
4. firewall-cmd --remove-service=http #删除80端口的协议。
1)可以根据不同的接口配置不同的区域
2)可以对同一个接口,对不同网段的ip/流量,配置不同的访问
例:
1. 一个接口只能对应一个区域,将接口与指定区域关联:
firewall-cmd --change-interface=ens75 --zone=drop
2. 根据不同的访问来源网段,设定至不同的区域规则:
firewall-cmd --add-source=192.168.75.0/24 --zone=public
firewall-cmd --add-source=192.168.85.0/24 --zone=drop
firewall-cmd --get-active-zones :查看(活动区域)默认接口和区域。