简介
iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是netfilter 项目的一部分。 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多前端和图形界面配置。
工作机制
说道工作机制我们需要先理解表,链,规则。
规则
数据包的过滤基于规则,规则由2部分组成,匹配和动作。根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
链
链是一些按顺序排列的规则的列表,也可以说链是规则的容器,用来存放规则的。默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。iptables内置有5条链,同时还允许用户自定义链
- INPUT链 :处理输入数据包。
- OUTPUT链 :处理输出数据包。
- PORWARD链 :处理转发数据包。
- PREROUTING链 :用于目标地址转换(DNAT)。
- POSTOUTING链 :用于源地址转换(SNAT)
表
表是由链组成,来完成不同的功能,iptables中默认有5个表,以及默认包含的链
- raw 用于配置数据包,raw 中的数据包不会被系统跟踪。
- PREROUTING
- OUTPUT
- filter 是用于存放所有与防火墙相关操作的默认表。
- INPUT
- FORWARD
- OUTPUT
- nat 用于 网络地址转换
- PREROUTING
- INPUT
- OUTPUT
- POSTROUTING
- mangle 用于对特定数据包的修改。
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
- security 用于 强制访问控制 网络规则
- INPUT
- OUTPUT
- FORWARD
工作机制
理解 iptables 如何工作的关键是这张图。图中在上面的小写字母代表 表,在下面的大写字母代表链。从任何网络端口 进来的每一个 IP 数据包都要从上到下的穿过这张图。一种常见的困扰是认为 iptables 对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式,相反,iptabales 对从任何端口进入的数据包都会采取相同的处理方式。可以定义规则使 iptables 采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的,因此在图中表现为从顶端进入,到 停止,而另一些数据包是由本地进程生成的,因此在图中表现为从 发出,一直向下穿过该流程图。
iptables命令
规则格式
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
iptables命令有很多选项,我们可以先分类
链管理
- -N:new, 自定义一条新的规则链;
- -X: delete,删除自定义的规则链;删除需要同时满足下面三个条件
- 1.引用计数为0
- 2.没有规则的空链
- 3.自定义的链
- -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
- ACCEPT:接受
- DROP:丢弃
- REJECT:拒绝
- -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
查看
- -L:list, 列出指定鏈上的所有规则;下面是修饰L的几个选项,
- -n:numberic,以数字格式显示地址和端口号;
- -v:verbose,详细信息;
- -x:exactly,显示计数器结果的精确值;
- –line-numbers:显示规则的序号;
规则管理
- -A:append,追加;
- -I:insert, 插入,要指明位置,省略时表示第一条;
- -D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身; - -R:replace,替换指定链上的指定规则;
- -F:flush,清空指定的规则链;
- -Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
匹配条件
基本匹配条件: 无需加载任何模块,由iptables/netfilter自行提供
选项
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p, --protocol protocol,指定协议,常用的有tcp,udp,icmp
[!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
[!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
- tcp
常用的选项
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
[!] --tcp-flags mask comp,其中mask是一个列表,可以是 SYN,ACK,FIN,RST,comp是mask列表中必须被设置为1的标志。例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,中SYN必须为1,余下的必须为0;
[!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
- udp
常用的选项
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
- icmp
常用的选项
[!] --icmp-type {type[/code]|typename}
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
常用的一些扩展模块
- multiport:以离散或连续的 方式定义多端口匹配条件,最多15个;这里最多15个指的是,比如20:25这样指定的话只算2个端口。而不是算6个端口。
- iprange:以连续地址块的方式来指明多IP地址匹配条件;
常用的选项
[!] --src-range from[-to]
[!] --dst-range from[-to]
- time:根据将报文到达的时间与指定的时间范围进行匹配
常用的选项
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day...]
[!] --monthdays day[,day...]
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--kerneltz:使用内核配置的时区而非默认的UTC;
- string:对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法;
[!] --string pattern:要检测的字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制格式;
- connlimit :根据每客户端IP做并发连接数数量匹配;
常用的选项
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:连接的数量大于n时匹配;
- limit: 基于收发报文的速率做匹配
常用的选项
--limit rate[/second|/minute|/hour|/day] ##最大速率
--limit-burst number ##表示最大能接受多少个请求
- state:根据”连接追踪机制“去检查连接的状态;
格式为
[!] --state STATE
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
- NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
- ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
- RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
- INVALID:无效的连接;
- UNTRACKED:未进行追踪的连接;
处理动作:
- ACCEPT:接受
- DROP:丢弃
- REJECT:拒绝
- RETURN:返回调用链;
- REDIRECT:端口重定向;
- LOG:记录日志;
- MARK:做防火墙标记;
- DNAT:目标地址转换;
- SNAT:源地址转换;
- MASQUERADE:地址伪装;
…