iptables简介和原理
我们先来了解以下社么是防火墙
防火墙:隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略
[ 防火墙的本质是对报文(包)进行过滤,通过过滤器对报文(包)按照特征来进行匹配,将匹配到的报文(包)进行处理,以此来进行过滤 ]
在linux中真正实现防火墙功能的是netfilter,它是一个抽象的框架,提供了一套hook函数的管理机制,并以此来对数据包进行管理。iptables是用来在用户空间编写防火墙规则的工具,用户通过iptables以系统调用的方式来管理netfilter。
在内核中的五个hook function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),这五个hook function被放在数据包流过协议栈的五个关键点,以此来对数据包进行检测和处理,而这五个hook function向用户开放,用户不能直接对内核中的hook function进行操作,但用户可以通过一个命令工具iptables向其写入规则,以系统调用的方式来将规则发送给hook function。
以下是刚刚提到的五个hook function:
NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验 和等检测),源地址转换在此点进行;IP_Input.c中IP_Rcv调用;
NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行,IP_local_deliver中调用;
NF_IP_FORWARD:要转发的包通过此检测点,FORWORD包过滤在此点进行;
NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的目的地址转换功能(包括地址伪装)在此点进行;
NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。
了解完五个hook function,我们再来看看iptables的组成
iptables由五个表和五个链以及一些规则组成
hook function在执行规则时会一次性执行多条规则,hook执行的多条规则又按照所处的hook分为五个链,可以理解为hook所执行的为链,按照链中的规则从上至下以此执行。再把这些链按对数据包的操作或者功能分类,这样每个功能下会含有多个链,这样的一个功能类称为一个表,每个hook function中以链为单位存放。五个表中不是所有表都拥有五个链。
简单的来说hook function是框架,链是这个框架的内容,而表是链功能的划分。表和hook function是两个不同维度的东西。
接下来我们具体讨论以下表和链
五个表table
filter:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
security:(用户的自定义表)用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
五个内置链chain
INPUT——进来的数据包应用此规则链中的策略
OUTPUT——外出的数据包应用此规则链中的策略
FORWARD——转发数据包时应用此规则链中的策略
PREROUTING——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
每个表所含有的链
filter:过滤器,防火墙 (INPUTE,FORWARD,OUTPUT)
nat:network address translation(PREPOUTING,INPUTE,OUTPUT,POSTROUTING)
mangle:修改报文(PREROUTING,INPUTE,FORWARD,OUTPUT,POSTROUTING)
raw:连接追踪功能(PREOUTING,OUTPUT)
了解完这些组成,我们来看一下iptables具体是如何运作的
当数据包(报文)进入主机后会有三种情况:
流入本机:PREROUTING --> INPUT-->用户空间进程Ø
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
流出本机:用户空间进程 -->OUTPUT--> POSTROUTINGØ
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
转发:PREROUTING --> FORWARD --> POSTROUTI
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
知道了原理那我们该如何配置iptables呢,这就是iptables的规则
iptables规则
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理,规则分为匹配条件和处理动作两部分
注意:规则要添加在链上,才生效
匹配条件:默认为与条件,同时满足
基本匹配:IP
扩展匹配:通过复杂高级功能匹配(端口,TCP的Flags(SYN,ACK等)),扩展匹配又分为隐式扩展(tcp,udp,icmp)和显式扩展(必须指定扩展模块进行
处理动作:称为target,跳转目标
内建处理动作:ACCEPT(通过),DROP(拒绝并丢弃数据包,不回应),REJECT(拒绝但 回应对方拒绝的信息),SNAT,DNATMASQUERADE,MARK,LOG...
自定义处理动作:自定义chain,利用分类管理复杂情形
iptables规则语法
iptables [选项]
-t :指定表(不写默认filter表)
规则管理
-A:add,向规则链中添加规则(放在规则链的最后)
-I:insert,向规则链中插入规则(如果不指定第几条则默认插入到第一条)
-D :delete,删除规则链中的某规则
-R :replace,替换规则链中的某规则
-F:flush,清空指定规则(不指定规则将清空正条连)
-Z:zero,归零计数器(iptables的每条规则都有两个计数器,匹配到的报文的个数和匹配到的所有报文的大小)
规则查看
-L:list,列出一个链的规则,不指定链则会显示表中的全部规则(默认为filter)
-n:numberic,以数字格式显示地址和端口号(不进行反解析,会大幅提高列出速,port为端口号,source和destination为ip,如果不写n选项则会尝试将port解析为服务名,source和destination解析为域名,降低效率)
-v:verbose,详细信息(pkts匹配到的报文数总和,bytes匹配到的报文包的大小总和,target匹配成功后采取的措施,port匹配的协议,opt匹配的选项,in匹配的报文流入网卡,out匹配的报文流出网卡,source匹配报文来源,destination匹配报文的目标地址)
-vv:更详细的信息
--line-number:显示规则编号
-S :命令格式显示链上规则
链管理
-N:new,新建一个自定义链
-X:删除一个空且为被引用的链
-P:policy,指定一个链的默认规则(在没条链后的括号内)
-E:重命名一个链
规则保存
iptables-save:将当前iptables配置打印到当前终端,我们一般会将其导入到文件中,以便以后直接导入,建议导入到/etc/sysconfig/iptables
完整命令:
存iptables-save>/etc/sysconfig/iptables
取iptables-save</etc/sysconfig/iptables
具体格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
**关于rule-specification
rule-specification是对规则的定义,其写法为rule-specification = [matches...] [target]
其中matches是匹配模式,target为处理方式
matches:
matches分为基本匹配和扩展匹配,使用扩展匹配时需指定要加载的扩展模块,扩展匹配又分为隐式扩展和显式扩展,隐式扩展在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块,可以自动匹配扩展机制,不需要手动加载扩展模块
-m matchname 指定扩展模块(基本匹配和隐式扩展时省略)
基本匹配:
-s:指定源IP地址或网段
-d:指定目标IP地址或网段
-i:报文流入的接口(网卡),只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
-o:报文流出的接口(网卡),只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
扩展匹配:
-m 指定扩展的模块
隐式扩展:(主要是协议,在指定协议时自动匹配模块,因此不需要指定模块)
-p:指定协议,可使用数字如0(all)
-p tcp
--sport,匹配报文来源端口
--dport,匹配报文目标端口
--tcp--flags mask comp,匹配标志位(mask可以为SYN,ACK,FIN,RST等用“,”分隔,comp为标志位必须为1的标志位
-p udp
--sport,匹配报文来源端口
--dport,匹配报文目标端口
-p icmp
--icmp-type,匹配响应报文的类型(请求报文为8,回应报文为0)
显示扩展:
-m multiport(用于匹配离散的ip只能用于tcp/udp协议,因此要配合-p udp或-p tcp一起使用)
--deports,同时匹配多个离散的目标端口(“,”隔开“21:24”表示21号端口到24号端口,在multiport中算一个整体,当作一个端口)
--sports,同时匹配多个离散的来源端口
-m iprange(用来范围匹配ip)
--src-range,匹配一个来源ip地址范围(例如172.1.1.1-172.1.1.100)
--dst-range,匹配一个目标ip地址范围
-m string(用来匹配字符串)
--algo,选用一个匹配的算法bm或kmp
--string,指定匹配的字符串,字符串需用引号引起
-m time(用来匹配时间,使用时注意检查时区)
--timestart 指定起始时间(02:00:00)
--timestop 指定结束时间
--weekdays 指定一星期的某几天(1,7为周一和周日)
--monthdays 指定一个月中的某几天(10,20为10号和20号)
--datestart 指定起始日期(2018-01-01)
--datestop 指定结束日期
-m connlimit(限制每个ip链接到sever的数量)
--connlimit-above 链接数大于时匹配
--connlimit-upto 链接数下雨等于时匹配
--connlimit-mask 限制对应掩码的ip链接数量(24)
-m limit(限制数据包进入的速度)
--limit 匹配一定时间内的包(10/minute每分钟10个包,这样设置后iptables会每6s匹配一个包)
-m mac(匹配mac地址)
--mac-source
-m state(匹配报文当前状态,此扩展比较占用资源)
--state 匹配报文状态
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接如raw表中关闭
target:
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不进行任何回应
REJECT:拒绝数据包通过,但给予回应
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装