15.1 iptables简介
iptables是与最新的3.5版本Linux内核集成的IP信息包过滤系统。如果Linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,则该系统有利于在Linux系统上更好地控制IP信息包过滤和防火墙配置。
防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
虽然netfilter/iptables IP信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter和iptables组成。
netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用Red Hat Linux 7.1或更高版本,否则需要下载该工具并安装使用它。
15.2 防火墙介绍
Firewall,防火墙,也称防护墙,,是一种隔离工具。其工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检测规则作匹配检测,对于能够被规则匹配到的报文做出相应处理。
防火墙有主机防火墙和网络防火墙,主机防火墙主要用来监测和处理流经本主机的数据包;网络防火墙则是用来监测和处理流经本防火墙的数据包。
与Linux内核各版本集成的防火墙历史版本:
2.0.x内核:ipfwadm
2.2.x内核:ipchains
2.4.x内核:iptables
15.3 iptables的优点
netfilter/iptables的最大优点是它可以配置有状态的防火墙,这是ipfwadm和ipchains等以前的工具都无法提供的一种重要功能。
有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为ESTABLISHED、INVALID、NEW和RELATED。
ESTABLISHED:指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。
INVALID:指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。
NEW:意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。
RELATED:表示该信息包正在启动新连接,以及它与已建立的连接相关联。
netfilter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。用户可以定制自己的规则来满足特定需求,从而只允许想要的网络流量进入系统。
另外,netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
15.4 iptables四表五链
15.4.1 iptables四表及其对应的功能
iptables四表分别是filter、nat、mangle和raw。四表各自的功能如下:
filter:过滤,防火墙
nat:network address translation,网络地址转换
mangle:拆解报文,做出修改,封装报文
raw:关闭nat表上启用的连接追踪机制
15.4.2 iptables五链
iptables五链分别是PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
数据包的处理方式不同,流经的链也不同:
数据流入时要经过的链:PREROUTING --> INPUT
数据流出时要经过的链:OUTPUT --> POSTROUTING
数据转发时要经过的链:PREROUTING --> FORWARD --> POSTROUTING
各功能的分别实现位置:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING(DNAT),OUTPUT,POSTROUTING(SNAT)
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw:PREROUTING,OUTPUT
15.5 iptables数据包过滤匹配流程
15.5.1 iptables添加规则的考量点
添加规则的考量点:
a) 要实现哪种功能:判断添加在哪张表上
b) 报文流经的路径:判断添加在哪个链上
15.5.2 iptables处理的优先级次序
链:链上规则的次序,即为检查的次序,因此隐含一定的法则
a) 同类规则(访问同一应用),匹配范围小的放上面
b)不同类规则(访问不同应用),匹配到报文频率较大的放上面
c) 将那些可由一条规则描述的多个规则合并为一个
d) 设置默认策略
功能的优先级次序:raw --> mangle --> nat --> filter
15.6 iptables规则
15.6.1 iptables规则的组成
iptables规则的组成部分:报文的匹配条件,匹配到之后的处理动作
匹配条件:根据协议报文特征指定
基本匹配条件:源IP,目标IP,源端口,目标端口
扩展匹配条件:连接追踪,状态追踪
处理动作:
内建处理机制
自定义处理机制
注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效
15.6.2 iptables规则管理工具
iptables是一种规则管理工具,可实现iptables规则的添加、修改、删除和显示等功能。
规则和链有计数器:
pkts:表示由规则或链所匹配到的报文的个数
bytes:表示由规则或链所匹配到的所有报文大小之和
iptables命令:
说明:
iptables是用来设置、维护和检查Linux内核的IP包过滤规则的。
可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配;每条规则指定应当如何处理与之相匹配的包。这被称作“target”,也可以跳向同一个表内的用户定义的链。
targets:
防火墙的规则指定所检查包的特征和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,则下一条规则由目标值确定。该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT,DROP,QUEUE或者RETURN。
语法:
1
2
3
4
5
6
7
8
9
10
|
iptables [-t table] {-A|-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
|
常用options:
1
2
|
-t table:
filter,nat,mangle,raw
|
链管理选项:
1
2
3
4
5
6
|
-F:flush,清空规则链,若省略链则表示清空指定表上的所有的链
-N:new,创建新的自定义规则链
-X:drop,删除用户自定义的空的规则链
-Z:zero,清零,置零规则计数器,让计数器重新开始计数
-P:Policy,为指定链设置默认策略,对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT
-E:rEname,重命名自定义链,引用计数不为0的自定义链无法改名也无法删除
|
规则管理选项:
1
2
3
4
5
6
7
|
-A:append,将新规则追加于指定链的尾部
-I:insert,将新规则插入至指定链的指定位置,不指定位置则默认插入为第一条
-D:delete,删除指定链上的指定规则
# 有两种指定方式:
# a) 指定匹配条件
# b) 指定规则编号
-R:replace,替换指定链上的指定规则
|
查看选项:
1
2
3
4
5
|
-L:list,列出指定链上的所有规则
-n:numberic,以数字格式显示地址和端口号
-
v
:verbose,显示详细信息,支持-vv,-vvv
--line-numbers:显示规则编号
-x:exactly,显示计数器计数结果的精确值
|
匹配条件选项:
基本匹配:
1
2
3
4
5
|
[!] -s,--src,--
source
IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围
[!] -d,-dst,--destination IP|Netaddr:检查报文中目标IP地址是否符合此处指定的地址范围
-p,--protocol {tcp|udp|icmp}:检查报文中的协议,即IP首部中的protocols所标识的协议
-i,--
in
-interface IFACE:数据报文的流入接口,仅能用于PREROUTING,INPUT及FORWARD链上
-o,--out-interface IFACE:数据报文的流出接口,仅能用于FORWARD,OUTPUT及POSTROUTING链上
|
扩展匹配:-m match_name --spec_options
例如:-m tcp --dport 22
隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
-p tcp
--dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口
--sport PORT[-PORT]:源端口,可以是单个端口或连续多个端口
--tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没在LIST1中指明的不作检查
SYN,ACK,FIN,RST,PSH,URG
如:
--tcp-flags SYN,ACK,FIN,RST SYN表示匹配三次握手中的第一次握手,SYN必须为1,其余的必须为0
--syn:表示匹配三次握手中的第一次握手
-p udp
--dport
--sport
-p icmp
--icmp-
type
:可用数字表示其类型
0:
echo
-reply,响应
8:
echo
-request,请求
如:
iptables -A OUTPUT -s 192.168.1.1 -p icmp --icmp-
type
8 -j ACCEPT
iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-
type
0 -j ACCEPT
|
显式扩展:必须使用-m选项指定使用的扩展
multiport扩展:以离散方式定义多端口匹配,最多指定15个端口
1
2
3
4
5
|
[!] --
source
-ports,--sports port[,port |,port:port]...:指定多个源端口
[!] --destination-ports,--dports port[,port |,port:port]...:指定多个目标端口
[!] --ports port[,port |,port:port]...:指定特定端口
如:
iptables -I INPUT -s 192.168.1.0
/24
-d 192.168.1.250 -p tcp -m multiport --dports 22,80 -j ACCEPT
|
iprange扩展:指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
1
2
3
4
|
[!] --src-range from[-to]:指明连续的源IP地址范围
[!] --dst-range from[-to]:指明连续的目标IP地址范围
如:
iptables -I INPUT -d 192.168.1.250 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.1.1-192.168.1.249 -j ACCEPT
|
string扩展:检查报文中出现的字符串
1
2
3
4
5
|
--algo {bm|kmp}:指定字符串比对算法
[!] --string pattern
[!] --hex-string pattern
如:
iptables -I OUTPUT -m string --algo bm --string
'movie'
-j REJECT表示无论是谁访问的,只要响应报文中包含movie字符串的全部拒绝掉
|
time扩展:基于时间做检查,根据报文到达的时间与指定的时间范围进行匹配
1
2
3
4
5
6
7
8
9
10
11
12
|
--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...]:指定一周内具体周几
如:
-m
time
--weekdays Sa,Su
-m
time
--datestart 2007-12-24 --datestop 2007-12-27
-m
time
--datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59
-m
time
--timestart 12:30 --timestop 13:30
-m
time
--weekdays Fr --monthdays 22,23,24,25,26,27,28
|
connlimit扩展:连接限制,根据每客户端IP(也可以是地址块(仅centos7支持))做并发连接数数量匹配
1
2
3
4
5
6
7
|
[!] --connlimit-above n:连接的数量大于n
[!] --connlimit-upto n:连接的数量小于等于n,centos7上新版的iptables才有此选项
--connlimit-mask prefix_length
如:
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
|
limit扩展:基于收发报文的速率做检查
1
2
|
--limit rate[
/second
|
/minute
|
/hour
|
/day
]:指定速率
--limit-burst number:指定峰值
|
state扩展:状态扩展,根据连接追踪机制检查连接的状态
调整连接追踪功能所能够容纳的最大连接数量:并发量很大的情况下建议把值调大点
1
|
/proc/sys/net/nf_conntrack_max
|
iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max文件设定的值,链接碰到各种状态的超时后就会从表中删除
所以解决方法一般有两个:
a) 加大ip_conntrack_max值
1
2
3
|
vim
/etc/sysctl
.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
|
b) 降低ip_conntrack timeout时间
1
2
3
4
5
6
|
vim
/etc/sysctl
.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
|
已经追踪到并记录下的连接:
1
|
/proc/net/nf_conntrack
|
不同协议或连接类型追踪的时长:
1
|
/proc/sys/net/netfilter/
*
|
可追踪的连接状态:
NEW:新发出的请求,连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发来的请求
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
RELATED:相关的连接,如ftp协议的命令连接与数据连接之间的关系
追踪RELATED状态的专用模块:/lib/modules/KERNEL-VERSION/kernel/net/netfilter/nf_conntrack*.ko
INVALIED:无法识别的连接
--state STATE1,STATE2,...:指明要检查的状态
例:开放被动模式的ftp服务需要以下几步:
a) 装载FTP追踪时的专用模块(nfconntrack_ftp.ko)
1
|
modprobe nfcontrack_ftp
|
b) 放行请求报文
命令连接:NEW,ESTABLISHED
1
|
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
|
数据连接:RELATED,ESTABLISHED
1
|
iptables -I INPUT -d LocalIP -m state --state RELATED,ESTABLISHED -j ACCEPT
|
c) 放行响应报文
1
|
iptables -I OUTPUT -s LocalIP -m state --state ESTABLISHED -j ACCEPT
|
目标选项:
-j TARGET:跳转至指定的TARGET
常用的TARGET:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志
MARK:做防火墙标记
DNAT:目标地址转换
1
|
iptables -t nat -A PREROUTING -d ExternalIP -p tcp|udp --dport PORT -j DNAT --to-destination InterServerIP[:PORT]
|
SNAT:源地址转换
1
|
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-
source
ExternalIP
|
MASQUERADE:地址伪装
1
|
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j MASQUERADE
|
自定义链:由自定义链上的规则进行匹配检查
保存及重载规则:
保存规则至指定文件:
1
|
iptables-save >
/PATH/TO/SOMEFILE
|
从指定文件重载规则:
1
|
iptables-restore <
/PATH/FROM/SOMEFILE
|
CentOS6:
1
2
|
service iptables save
#相当于iptables-save > /etc/sysconfig/iptables
service iptables restore
#相当于iptables-restore < /etc/sysconfig/iptables
|
CentOS7:引入了新的iptables前端管理服务工具:firewalld
1
2
|
firewall-cmd
firewalld-config
|
关于firewalld:
https://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html