IPTABLES
防火墙,隔离工具。工作于主机(主机防火墙)或网络(网络防火墙)的边缘,对于进出的报文根据事先定义好的检查规则作匹配监测,对于能够被规则所匹配的到的报文做出相应的处理的组件。
防火墙在Linux内核中是在报文必经之处有五个勾子函数,统一叫做netfilter。仅需要向这个框架上填充相关的规则就能对来往的报文检查其是否符合。
我们是不可能直接操作内核的,所以只能通过用户空间用应用程序,向其传递相关的选项及参数,它就能向内核的框架上填充规则;这个就是iptables命令
功能
四表(优先级依次递增):
filter: 过滤
nat: 网络地址转换,是IPv4紧缺的最好的解决方案;
manle: 拆封报文;修改报文;
raw:关闭nat的连接追踪功能;
五链(内核中的五个勾子函数):
PREROUTING:路由前
INPUT:进入用户空间
FORWARD:转发
OUTPUT:从用户空间出来
POSTROUTING:路由后
报文流向:
各功能的分别实现:
命令格式:
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
命令参数详解:
链管理
-F:flush,清空规则链
-N:new,创建新的自定义规则链
-X:drop,删除用户自定义的空的规则链
-Z:zero,将规则计数器清零
-P:policy,为指定链设置默认策略。对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT
-E:rename,重命名自定义链。引用计数不为0的自定义链,无法改名,无法删除
规则管理
-A:append,将新规则追加至指定链的尾部
-I:insert,将新规则插入至指定链的指定位置
-D:delete,删除指定链上的指定规则
(1) 指定匹配条件
(2) 指定规则编号
-R:replace,替换指定链上的指定规则
-C:check,检查所选链中是否存在与规格匹配的规则。并使用其退出代码来指示成功或失败。
查看
-L:list,列出指定链上的所有规则
-n:numberic,以数字格式显示地址和端口号
-v:verbose,显示详细信息
-x:exactly,显示计数器计数结果的精确值
--line-numbers:显示规则编号
匹配条件
基本匹配
[!] -s,--src,--source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围
[!] -d,--dst,--destination IP|Netaddr:检查报文中目标IP地址是否符合此处指定的地址范围
[!] -p,--protocol {tcp|udp|icmp}:检查报文中的协议,即IP首部中的protocol所标识的协议
[!] -i,--in-interface IFACE:数据报文的流入接口。仅能用于PREROUTING,INPUT,FORWARD链上
[!] -o,--out-interface IFACE:数据报文的流出接口。仅能用于FORWARD,OUTPUT,POSTROUTING链上
扩展匹配
-m macth_name --spec_options
1)隐形扩展:对-p protocol指明的协议进行的扩展,可省略-m选项
-p tcp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续的多个端口
--sport PORT[-PORT]:源端口,可以是单个端口或连续的多个端口
--tcp-flags LIST1 LIST2:检查LIST1所指明的标志位,且这其中,LIST2所表示的标志位必须为1,其余的必须为0 。
SYN ACK FIN RST PSH URG
-p udp
--dport
--sport
-p icmp
--icmp-type:待补充
2)显示扩展:必须使用-m选项指定使用的扩展
1、multiport
允许以离散或连续的方式定义多端口匹配。
[!] --source-ports,--sports port[,port|,port:port]...:指明多个离散或连续源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散或连续目标端口
[!] --ports port[,port|,port:port]...:指明多个离散或连续端口,包括源端口及目标端口
2、iprange
指明连续的ip地址范围
[!] --src-range from[-to]:指明连续的源IP范围
[!] --dst-range from[-to]:指明连续的目标IP范围
3、string
检查报文中出现的字符串
--algo {bm|kmp}:指明算法,必写选项
[!] --string pattern:查找
4、time
指明时间范围
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]:(Mon, Tue, Wed, Thu, Fri, Sat, Sun,1-7)
5、connlimit
根据每客户端IP(也可以是地址块)做并发连接数数量匹配
--connlimit-upto n:连接数量小于等于n,-j ACCEPT
--connlimit-above n:连接数量大于n,-j REJECT|DROP
6、limit
基于收发报文的速率做检查
--limit rate[/second|/minute|/hour|/day]:限制速率
--limit-burst number:设置峰值
7、state
根据连接追踪机制检查连接的状态
调整连接追踪功能所能都容纳的最大连接数量:/proc/sys/net/nf_conntrack_max
查看追踪到并记录下的连接:/proc/net/nf_conntrack
可追踪的连接状态:
NEW:新发出的请求,连接追踪模板中不存在此连接相关的信息条目,因此,将其标识为第一次发出的请求。
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态。
RELATED:相关的连接。待补充
INVALIED:无法识别的连接。
[!] --state state
保存及重载
保存规则至指定文件
iptables-save > /PATH/TO/FILE
从指定文件重载规则
iptables-restore < /PATH/TO/FILE