您的位置:首页 > 大数据 > 人工智能

浅谈iptables

2016-07-25 21:57 302 查看
我最早接触iptables,当然是因为每次做实验都时的:iptables -F,因为防火墙这个东西对于我等新手做实验来说,往往会成为一个不大不小的坑,本来一个命令就能解决,却在注意不到它的存在时,干掉我们的大部分时间,所以iptables -F之前被我奉为神技,实验没成功,不管不问地先iptables -F,再重试一下,已经成为固有套路了。
但学习了iptables之后,才知道称呼防火墙为iptables并不准确;所谓防火墙,就是把网络中危险的“火”通过某些规则排除在我们的主机或网络之外,它可以通过硬件和软件两种方式实现,而iptables的对象就是软件防火墙;然而,真正实现软件防火功能的防火墙,或者叫过滤器,并不能直接面向用户,它工作于内核之中,名叫netfilter,而面向我们的iptables则是将我们所写的规则传递给内核中netfilter的规则编写工具,我们通过操作它去定义防火墙如何工作,久而久之,也就把iptables称作防火墙了。
想了解iptables,首先要面对的东西叫做chain,规则链;它分为内建链和自定义链,自定义链中的规则只有被引用才能生效。
内建链:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
那么,这些链有什么用呢?
我们知道,防火墙之所以“防火”,是因为有我们所定义的规则在起作用,而规则自然不是我们自己凭空想象的,在防火墙内部,有自己的hook function,它们是规则函数,也被称为钩子函数或钩子,我们通过运用这些钩子放在特定的位置上来过滤网络中的报文,从而实现了“防火”功能;那这些钩子放在所谓的特定位置是哪呢?没错这些特定位置,就是chain的位置。
报文有它的流向,流向不同,负责排查它的链也就有所差别,而链空着手去排查也查不出来什么,所以,就得带上钩子了。
报文流向:
到本机某进程的报文:PREROUTING --> INPUT
由本转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机某进程发出的报文:OUTPUT --> POSTROUTING
然而,很多时候,排查一段报文不仅仅只有单一的目的,因此,根据想要实现的功能不同,我们把这些链编成了4个不同的tables,它们都或多或少地调用了这些链中的某几个链,来各司其职,共同组成了防火墙;
tables:
filter:过滤,防火墙;
nat:network address translation;用于修改报文的源地址或目标地址,甚至是端口;
mangle:拆解报文,做出修改,并重新封装起来;
raw:关闭nat表上启用的连接追踪机制;
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTRUTING
filter:INPUT,FORWARD,OUTPUT
优先级次序(由高而低):
raw --> mangle --> nat --> filter

接下来我们先看看iptables规则的编写格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]
简单来说,就是先指定想要定义的table,再指定向哪个链编写规则,链前面的命令可以定义这次操作是设定默认还是增删查改之类的动作;再然后就是设定规则了,当然,这些规则还得说明它的作用范围,匹配条件等;所以,才构成了这么复杂的命令。
这其中,如果不指定table,默认为filter,当然,我们用的最多的也是filter。
COMMAND:
链:
-P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j chain_name];
-X:drop,删除自定义的引用计数为0的空链;
-F:flush,清空指定的链;
-E:重命名自定义的引用计数和为0的链;
规则:
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
-D:delelte,删除,删除指定的规则;
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
-L:list,列出表中的链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv, -vvv
-x:exactly,计数器的精确结果;
--line-numbers:显示链中的规则编号;

匹配条件:
多重条件:逻辑关系为“与”;

基本匹配条件:
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p, --protocol protocol:
protocol:{tcp|udp|icmp}
[!] -i, --in-interface name:数据报文的流入接口;INPUT, FORWARD and PREROUTING
[!] -o, --out-interface name:数据报文的流出接口; FORWARD, OUTPUT and POSTROUTING
扩展匹配条件
隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
-p tcp:隐含了-m tcp;
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;

mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;

--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:
相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-m icmp:
[!] --icmp-type {type[/code]|typename}
8:echo-request
0:echo-reply
显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;

获取帮助:
CentOS 7:man iptables-extensions
CentOS 6:man iptables

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扩展
对报文中的应用层数据做字符串匹配检测;

[!] --string pattern:要检测字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制编码;
--algo {bm|kmp}

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...]

~]# iptables -I INPUT -d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT

5、connlimit扩展
根据每客户端IP做并发连接数匹配;

--connlimit-upto n:连接数数量小于等于n,此时应该允许;
--connlimit-above n:连接数数量大于n,此时应该拒绝;

~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

6、limit扩展
基于收发报文的速率进行匹配;

--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峰值速率

7、state扩展
状态检测;连接追踪机制(conntrack);

INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;
NEW:新连接;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;

nf_conntrack内核模块;
追踪到的连接:/proc/net/nf_conntrack文件中;

能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
此值可自行定义,建议必要时调整到足够大;

不同的协议的连接追踪的时长:
/proc/sys/net/netfilter/
[!] --state STATE

如何开放被模式的ftp服务:
(1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp

(2) 放行命令连接
~] # iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT
~] # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -j ACCEPT

(3) 放行数据连接
~] iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT

处理动作(目标)
-j targetname [per-target-options]

targetname:
ACCEPT:接受;
DROP:丢弃;
REJECT:拒绝;

下面就是简单的应用:




最后,带来规则优化:
(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4) 设置默认策略;
(a) 最后一条规则设定;
(b) 默认策略设定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  防火墙 过滤器 chain