lin linux中的防火墙,RHEL中有几种防火墙共存>
iptables,firewalld,ip6tables,ebtables,这些软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核的netfilter完成的。
扩展:整个linux内部结构可以分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间。
CentOS7默认采用的是firewalld管理netfilter子系统,底层调用的仍然是iptables命令。不同的防火墙软件相互间存在冲突,使用某个时应禁用其他的。
systemctl start/stop/enable/disable/status/is-active xxxx //systemctl服务管理命令
Netfilter
netfilter是Linux 2.4内核引入的全新的包过滤引擎。由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。iptables等等都是在用户空间修改过滤表规则的便捷工具。
netfilter在数据包必须经过且可以读取规则的位置,共设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中(有的叫钩子函数(hook functions)。也就是说5条链对应着数据包传输路径中的5个控制关卡,链中的规则会在对应的关卡检查和处理。任何一个数据包,只要经过本机,必然经过5个链中的某个或某几个。
PREROUTING 数据包刚进入网络接口之后,路由之前,
INPUT 数据包从内核流入用户空间。
FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤。
OUTPUT 数据包从用户空间流出到内核空间。
POSTROUTING 路由后,数据包离开网络接口前。
链其实就是包含众多规则的检查清单,每一条链中包含很多规则。当一个数据包到达一个链时,系统就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则就继续检查下一条规则,如果该数据包不符合链中任一条规则,系统就会根据该链预先定义的默认策略来处理数据包。
数据包的传输过程
当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
可以看出,刚从网络接口进入的数据包尚未进行路由决策,还不知道数据要走向哪里,所以进出口处没办法实现数据过滤,需要在内核空间设置转发关卡、进入用户空间关卡和离开用户空间关卡。
iptables
参考文档:http://drops.wooyun.org/tips/1424,起源于freeBSD的ipfirewall(内核1.x时代),所有规则都在内核中;2.0x后更名为ipchains,可以定义多条规则并串用;现在叫iptables,使用表组织规则链。
iptablses按照用途和使用场合,将5条链各自切分到五张不同的表中。也就是说每张表中可以按需要单独为某些链配置规则。例如,mangle表和filter表中都能为INPUT链配置规则,当数据包流经INPUT位置(进入用户空间),这两个表中INPUT链的规则都会用来做过滤检查。
五张表,每张表侧重于不同的功能
filter 数据包过滤功能。只涉及INPUT, FORWARD, OUTPUT三条链。是iptables命令默认操纵的表。
nat 地址转换功能。NAT转换只涉及PREROUTING, OUTPUT, POSTOUTING三条链。可通过转发让局域网机器连接互联网,mangle 数据包修改功能。每条链上都可以做修改操作。修改报文元数据,做防火墙标记等。
raw 快速通道功能。为了提高效率,优先级最高,符合raw表规则的数据包会跳过一些检查。
security 需要和selinux结合使用,内置规则比较复杂,通常都会被关闭,iptables还支持自定义规则链。自定义的链必须和某个特定的链关联起来。可在某个链中设定规则,满足一定条件的数据包跳转到某个目标链处理,目标链处理完成后返回当前链中继续处理后续规则。
因为链中规则是从头到尾依次检查的,所以规则的次序是非常重要的。越严格的规则应该越靠前。
iptablse服务管理
service --status-all,iptables命令参考
iptables [-t TABLE] COMMAND [CHAIN] [CRETIRIA]... [-j ACTION]
省缺表名为filter。命令中用到的序号(RULENUM)都基于1。
COMMAND 命令选项
CRETIRIA 条件匹配
分为基本匹配和扩展匹配,扩展匹配又分为隐式匹配和显示匹配,基本匹配
扩展匹配
-m|--match MATCHTYPE EXTENSIONMATCH... //扩展匹配,可能加载extension,如: -p tcp -m tcp --dport 80,隐式扩展匹配(对-p PROTO的扩展,或者说是-p PROTO的附加匹配条件)
-m PROTO 可以省略,所以叫隐式,显示扩展匹配
ACTION 目标策略(TARGET)
ACCEPT 规则验证通过,不再检查当前链的后续规则,直接跳到下一个规则链。
DROP 直接丢弃数据包,不给任何回应。中断过滤。
REJECT 拒绝数据包通过,会返回响应信息。中断过滤。
--reject-with tcp-reset|port-unreachable|echo-reply,LOG 在/var/log/messages文件中记录日志,然后将数据包传递给下一条规则。详细位置可查看/etc/syslog.conf配置文件,--log-prefix "INPUT packets",ULOG 更广范围的日志记录信息,QUEUE 防火墙将数据包移交到用户空间,通过一个内核模块把包交给本地用户程序。中断过滤。
RETURN 防火墙停止执行当前链中的后续规则,并返回到调用链。主要用在自定义链中。
custom_chain 转向自定义规则链,DNAT 目标地址转换,改变数据包的目标地址。外网访问内网资源,主要用在PREROUTING。完成后跳到下一个规则链,--to-destination ADDRESS[-ADDRESS][:PORT[-PORT]],SNAT 源地址转换,改变数据包的源地址。内网访问外网资源。主机的IP地址必须是静态的,主要用在POSTROUTING。完成后跳到下一个规则链。
--to-source ADDRESS[-ADDRESS][:PORT[-PORT]],MASQUERADE 源地址伪装,用于主机IP是ISP动态分配的情况,会从网卡读取主机IP。直接跳到下一个规则链。
--to-ports 1024-31000,REDIRECT 数据包重定向,主要是端口重定向,把包分流。处理完成后继续匹配其他规则。能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
--to-ports 8080,MARK 打防火墙标记。继续匹配规则。
--set-mark 2,MIRROR 发送包之前交换IP源和目的地址,将数据包返回。中断过滤。
辅助选项
state TCP链接状态
NEW 第一次握手,要起始一个连接(重设连接或将连接重导向)
ESTABLISHED 数据包属于某个已经建立的连接。第二次和第三次握手 (ack=1),INVALID 数据包的连接编号(Session ID)无法辨识或编号不正确。如SYN=1 ACK=1 RST=1
RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。如有些服务使用两个相关的端口,如FTP,21和20端口一去一回,FTP数据传输(上传/下载)还会使用特殊的端口,只允许NEW和ESTABLISHED进,只允许ESTABLISHED出可以阻止反弹式木马。
使用示例
firewalld,dynamic firewall daemon。支持ipv4和ipv6。Centos7中默认将防火墙从iptables升级为了firewalld。firewalld相对于iptables主要的优点有>
firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;,firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
1.firewalld的主要概念
1.1.过滤规则集合:zone
一个zone就是一套过滤规则,数据包必须要经过某个zone才能入站或出站。不同zone中规则粒度粗细、安全强度都不尽相同。可以把zone看作是一个个出站或入站必须经过的安检门,有的严格、有的宽松、有的检查的细致、有的检查的粗略。
每个zone单独对应一个xml配置文件,文件名为
每个zone都有一个默认的处理行为,包括:default(省缺), ACCEPT, %%REJECT%%, DROP
firewalld提供了9个zone>
drop 任何流入的包都被丢弃,不做任何响应。只允许流出的数据包。
block 任何流入的包都被拒绝,返回icmp-host-prohibited报文(ipv4)或icmp6-adm-prohibited报文(ipv6)。只允许由该系统初始化的网络连接,public 默认的zone。部分公开,不信任网络中其他计算机,只放行特定服务。
external 只允许选中的服务通过,用在路由器等启用伪装的外部网络。认为网路中其他计算器不可信。
dmz 允许隔离区(dmz)中的电脑有限的被外界网络访问,只允许选中的服务通过。
work 用在工作网络。你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过。
home 用在家庭网络。信任网络中的大多数计算机,只允许选中的服务通过。
internal 用在内部网络。信任网络中的大多数计算机,只允许选中的服务通过。
trusted 允许所有网络连接,即使没有开放任何服务,那么使用此zone的流量照样通过(一路绿灯)。
zone配置文件示例:public.xml,1.2.service
一个service中可以配置特定的端口(将端口和service的名字关联)。zone中加入service规则就等效于直接加入了port规则,但是使用service更容易管理和理解。
定义service的方式:添加
service示例:ssh.xml,1.3.过滤规则
source 根据数据包源地址过滤,相同的source只能在一个zone中配置。
interface 根据接收数据包的网卡过滤,service 根据服务名过滤(实际是查找服务关联的端口,根据端口过滤),一个service可以配置到多个zone中。
port 根据端口过滤,icmp-block icmp报文过滤,可按照icmp类型设置,masquerade ip地址伪装,即将接收到的请求的源地址设置为转发请求网卡的地址(路由器的工作原理)。
forward-port 端口转发,rule 自定义规则,与itables配置接近。rule结合--timeout可以实现一些有用的功能,比如可以写个自动化脚本,发现异常连接时添加一条rule将相应地址drop掉,并使用--timeout设置时间段,过了之后再自动开放。
1.4.过滤规则优先级
source 源地址,interface 接收请求的网卡,firewalld.conf中配置的默认zone,2.firewalld配置文件
2.1.firewalld配置方式
firewall-config GUI工具,firewall-cmd 命令行工具,直接编辑xml文件 编辑后还需要reload才生效,2.2.firewall-cmd命令
部分命令共同的参数说明:
--zone=ZONE 指定命令作用的zone,省缺的话命令作用于默认zone,--permanent 有此参数表示命令只是修改配置文件,需要reload才能生效;无此参数则立即在当前运行的实例中生效,不过不会改动配置文件,重启firewalld服务就没效果了。
--timeout=seconds 表示命令效果持续时间,到期后自动移除,不能和--permanent同时使用。例如因调试的需要加了某项配置,到时间自动移除了,不需要再回来手动删除。也可在出现异常情况时加入特定规则,过一段时间自动解除。
2.3.配置文件存储位置
firewalld的配置文件以xml为主(主配置文件firewalld.conf除外),有两个存储位置>
/etc/firewalld/ 存放修改过的配置(优先查找,找不到再找默认的配置),/usr/lib/firewalld/ 默认的配置,修改配置的话只需要将/usr/lib/firewalld中的配置文件复制到/etc/firewalld中修改。恢复配置的话直接删除/etc/firewalld中的配置文件即可。
2.4.配置文件结构
firewalld.conf 主配置文件,键值对格式,DefaultZone 默认使用的zone,默认值为public,MinimalMark 标记的最小值,默认为100,CleanupOnExit 退出firewalld后是否清除防火墙规则,默认为yes,Lockdown 是否其他程序允许通过D-BUS接口操作,使用lockdown-whitelist.xml限制程序,默认为no,IPv6_rpfilter 类似rp_filter,判断接收的包是否是伪造的(通过路由表中的路由条目,查找uRPF),默认为yes
lockdown-whitelist.xml,direct.xml direct功能,直接使用防火墙的过滤规则,便于iptables的迁移,zones/ zone配置文件,services/ service配置文件,icmptypes/ icmp类型相关的配置文件,2.5.zone文件中配置规则
2.6.使用firewall-cmd配置规则