iptables基本概念梳理
前言
netfilter/Iptables (其中包括netfilter和Iptables两个组件)组 成了Linux平台下的包过滤防火墙,它与大多数的Linux自带软 件一样,这个防火墙是免费提供的,它可以代替昂贵的企业级 防火墙来解决实际问题与实际方案,完成封包过滤,封包重定 向和网络地址转换等功能。
一、工作原理
数据包从外网传送到防火墙后,防火墙在IP层向TCP层传 送之前,将数据包转发给检查模块进行处理。其过程如下。
⑴ 首先与第一个过滤规则比较。
⑵ 如果与第一个模块相同,则对它进行审核,判断是否要 转发该数据包,这时审核的结果是转发数据包,则将数据包发 送到TCP层进行处理,否则就将它丢弃。
⑶ 如果与第一个过滤规则不同,则接着与第二个规则相 比较,如果相同则对它进行审核,过程与上一步相同。
⑷ 如果与第二个过滤规则不同,则继续与下一个过滤规 则比较,直到与所有的过滤规则比较完成。要是不满足所有过 滤规则,就将数据丢弃。
二、iptables规则集
规则就是决定如何处理一个包的语句。如果一个包符合 所有的条件(match),我们就运行target指令。
书写规则的语法格式是:
Iptables [-t table] command [match] [target]
一条Iptables规则包含上面四个元素:表,命令,匹配,目标。
1、表
有四种 可用的表选项:filter、nat、mangle和raw。该选项不是必须的,如果 未指定,则filter用作默认表。
filter
filter表用来过滤数据包的,实现原理比较简单,根据规则对数据包做DROP或者ACCEPT处理。下图是信息包在filter表中的穿越过程。
NAT
NAT,Network Address Translation的缩写,NAT表的主要用处是网络地址的转换,采用网络地址转换技术可提高内网安全性。当IP地址不足时,很多用户使用私有IP地址来组建网络,而这些私有地址又不能直接访问Internet上的资源,针对这种情况也可以采用地址转换技术来解决。NAT可以实现一个IP地址转换为另一个或一组IP地址。下图是包在NAT表中的处理过程。
PREROUTING链的作用是在包进防火墙时改变它的目的地址,OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。
mangle
这个表的用途主要是用来Mangle数据包,可以改变不同的包及包头的内容,比如TTL,TOS或MARK,这里要强调的是TOS并没有真正的改变数据包内容,只是在内核空间为包做了一个标记,防火墙内其它程序可以用这种标记对包进行过滤或者高档路由。这个表由五个内建的链组成:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw
优先级最高,设置raw一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。raw:PREROUTING, OUTPUT。
链的概念
链是数据包传播的路径,一条链就是规则的一个检查清单,每条链可以有一条或者多条规则。如果包头不符合链中的规则,iptables就会根据该链的默认策略来处理数据包。
INPUT链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤)
OUTPUT链:过滤所有本机产生的数据包(对源地址的数据包过滤)
FORWARD链:过滤所有经过本机的数据包(源地址和目标地址都不是本机的数据包)
POSTROUTING链:在数据包离开防火墙时改变数据包的源地址
PEROUTING链:数据包到达防火墙时改变数据包的目的地址
2、命令
-A 增加一个规则到链中;
-D 在链中的指定位置删除一个规则;
-R 在链中的指定位置替换一个规则;
-I 在链中的指定位置插入一个新的规则;
-N 产生一个新的链;
-X 删除一个空的链;
-P 设置一个链的默认策略;
-L 列出一个链的规则;
-F 清空一个链的所有规则;
-Z 清零一个链里所有规则的包和字节计数器;
3、匹配
根据规则匹配所应有的特征,如源地址、目的地址和协议,将匹配分为五类:
第一类是generic matches:通用匹配,适用于所有的规则
第二类是TCP matches,只能适用于TCP包的匹配
第三类是UDP matches,主要用于UDP包的匹配
第四类是ICMP matches,用于ICMP包的
第五类针对的是特殊状态的,如访问的频率限制等。
匹配条件:
基本匹配条件:无需加载任何模块,由 iptables/netfilter 自行提供; [!] -s, --source address[/mask][,...]:检查报文中的源 IP 地址是否符合此处指定的地址或范围; [!] -d, --destination address[/mask][,...]:检查报文中的目标 IP 地址是否符合此处指定的地址或范围; [!] -p, --protocol protocol protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mhor "all" {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 is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST comp is a comma-separated list of flags whichmust be set,例如 SYN 例如:“--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} echo-request:8 echo-reply:0 显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]]; 使用帮助: CentOS 6: man iptables CentOS 7: man iptables-extensions 1、multiport 扩展 以离散方式定义多端口匹配;最多指定 15 个端口; [!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口; [!] --ports port[,port|,port:port]...:指明多个端口; ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT 2、iprange 扩展 指明连续的(但一般不脑整个网络)ip 地址范围; [!] --src-range from[-to]:源 IP 地址; [!] --dst-range from[-to]:目标 IP 地址; ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP 3、string 扩展 对报文中的应用层数据做字符串模式匹配检测; --algo {bm|kmp}:字符串匹配检测算法; bm:Boyer-Moore kmp:Knuth-Pratt-Morris [!] --string pattern:要检测的字符串模式; [!] --hex-string pattern:要检测的字符串模式,16 进制格式; ~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT 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...] --kerneltz:使用内核上的时区,而非默认的 UTC; ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP 5、connlimit 扩展 根据每客户端 IP 做并发连接数数量匹配; --connlimit-upto n:连接的数量小于等于 n 时匹配; --connlimit-above n:连接的数量大于 n 时匹配; ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT 6、limit 扩展 基于收发报文的速率做匹配; 令牌桶过滤器; --limit rate[/second|/minute|/hour|/day] --limit-burst number ~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT ~]# iptables -I INPUT 2 -p icmp -j REJECT 7、state 扩展 根据”连接追踪机制“去检查连接的状态; conntrack 机制:追踪本机上的请求和响应之间的关系;状态有如下几种: NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第 一次发出的请求; ESTABLISHED:NEW 状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的 通信状态; RELATED:相关联的连接;如 ftp 协议中的数据连接与命令连接之间的关系; INVALID:无效的连接; UNTRACKED:未进行追踪的连接; [!] --state state ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT 调整连接追踪功能所能够容纳的最大连接数量: /proc/sys/net/nf_contrack_max 已经追踪到到的并记录下来的连接: /proc/net/nf_conntrack 不同的协议的连接追踪时长: /proc/sys/net/netfilter/ iptables 的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时解決方法一般有两个: (1) 加大 nf_conntrack_max 值 vi /etc/sysctl.conf net.ipv4.nf_conntrack_max = 393216 net.ipv4.netfilter.nf_conntrack_max = 393216 (2) 降低 nf_conntrack timeout 时间 vi /etc/sysctl.conf net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 iptables -t nat -L -n
4、目标
目标是由规则指定的操作,对与那些规则匹配的信息包执 行这些操作:
ACCEPT:当信息包与具有ACCPET目标的规则完全匹配 时,会被接受(允许它前往目的地)。
DROP:当信息包与具有DROP目标的规则完全匹配时,会 阻塞该信息包,并且不对它作进一步处理。
REJECT:该目标的工作方式与 DROP目标相同,但它比 DROP好。REJECT不会在服务器和客户机上留下死套接字。 另外,REJECT会将错误信息发回给信息包的发送方。
处理动作: -j targetname [per-target-options] ACCEPT DROP REJECT RETURN:返回调用链; REDIRECT:端口重定向; LOG:记录日志; MARK:做防火墙标记; DNAT:目标地址转换; SNAT:源地址转换; MASQUERADE:地址伪装; ... 自定义链:
三、iptables状态机制
状态机制是一种连接跟踪机制,连接跟踪可以让Netfilter知道某个特定连接的状态,通常运行连接跟踪机制的防火墙称作带有状态机制的防火墙,这种防火墙要比非状态防火墙跟安全,因为它允许编写更严密的规则。几种状态机制组合使用,用来匹配数据包,可以使防火墙效果更加显著。
(1)NEW
表明这个包是第一个遇到的包,即某个连接第一个包,它即将被匹配了,NEW状态。
(2)ESTABLISHED
ESTABLISHED其关注两个方向上的数据传输,而且会继续匹配这个连接报,处于ESTABLISHED状态是比较容易理解的,只要发送并接到应答即为ESTABLISHED的了;一个连接要从NEW变为ESTABLISHED,只要接到响应即可。
(3)RELATED
RELATED是一个繁琐的状态,如果一个连接和某个已知处于ESTABLISHED状态的连接有关系时,就认为是RELATED的了。首先要有一个ESTABLISHED的连接,这个连接再产生一个主连接之外的连接,这个连接就是RELATED的了。
(4)INVALID
INVALID说明数据包是无效的,即不能被识别,导致出现这种情况的因素有几个,比如内存溢出等,收到不知属于哪个连接的错误信息。一般情况下,会采用DROP来处理这个状态的任何东西。
四、规则的检查次序
(1)同类规则(访问同一应用),匹配范围小的放前面;用于特殊处理;
(2)不同类的规则(访问不同应用),匹配范围大的放前面;
(3)应该将那些可由一条规则描述的多个规则合并为一;
(4)设置默认策略;
五、规则优化:
服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;
(1) 可安全放行所有入站的状态为 ESTABLISHED 状态的连接;
(2) 可安全放行所有出站的状态为 ESTABLISHED 状态的连接;
(3) 谨慎放行入站的新请求
(4) 有特殊目的限制访问功能,要于放行规则之前加以拒绝;
六、如何开放被动模式的 ftp 服务?
(1) 装载 ftp 连接追踪的专用模块: ~]# modproble nf_conntrack_ftp (2) 放行命令连接(假设 Server 地址为 172.16.100.67): ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT (3) 放行数据连接(假设 Server 地址为 172.16.100.67): ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT ~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
七、规则的用效期限:
使用 iptables 命令定义的规则,手动删除之前,其生效期限为 kernel 存活期限;
保存规则:
CentOS 6:
~]# service iptables save
将规则保存至/etc/sysconfig/iptables 文件中;
~]# iptables-save /PATH/TO/SOMERULESFILE
CentOS 7:
~]# iptables-save /PATH/TO/SOMERULESFILE
重新载入预存规则文件中规则:
~]# iptables-restore < /PATH/FROM/SOMERULESFILE
CentOS 6:
~]# service iptables restart (重载)
自动生效规则文件中的规则:
(1) 用脚本保存各 iptables 命令;让此脚本开机后自动运行;
/etc/rc.d/rc.local 文件中添加脚本路径:/PATH/TO/SOMESCRIPTFILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;
/etc/rc.d/rc.local 文件添加:iptables-restore < /PATH/FROM/IPTABLESRULESFILE
原创文章,作者:N24_yezi,如若转载,请注明出处:http://www.178linux.com/64223