第1章 Iptables简介
防火墙分为硬件防火墙与软件防火墙,硬件防火墙价格很高,多数中小型公司使用软件防火墙,免费的iptables使用是很多的,现在复习一下iptables。
iptables其实不是真正的防火墙,用户通过iptables这个代理,将用户的安全设定执行到对应的netfilter,是linux内核的一个软件框架,用来管理网络数据包。使用的是内核组件,iptables不像其他服务那样有进程。
主要功能有 :网络地址转换(NAT)、包内容修改、数据包过滤、数据包处理、地址伪装、透明代理等功能。
Iptables根据定义的规则来处理这些数据包,例如:放通(ACCEPT)、拒绝(REJECT)、丢弃(DROP)、源地址转换(SNAT)、目标地址转换(DNAT)、端口映射(REDIRECT)、地址伪装(MASQUERADE)、日志记录(LOG)…
第2章 经典的报文流向
上面讲到iptables是根据定义额规则来处理数据包,就要从经典数据包流向来看
image.png涉及到本机的的流程有:
本机某进程发报文:OUTPUTàPOSTROUTING
目标为本机的报文:PREROUTINGàINPUT
由本机转发的报文:PREROUTINGàFORWARDàPOSTROUTING
上图对应就是对应的“五链”,那么所谓的“四表”又有哪些??
第3章 表链结构
接触iptables最初老是听说表链结构,有哪些表?有哪些链呢?
3.1 四表五链
“四表”:filter , nat , mangle , raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw ,raw表优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
“五链”:
INPUT链 :处理输入数据包。
OUTPUT链 :处理输出数据包。
FORWARD链 :处理转发数据包。
PREROUTING链 :用于目标地址转换(DNAT)。
POSTOUTING链 :用于源地址转换(SNAT)。
3.2 表链对应关系
需要使用iptables还需要对表链的对应关系了解才能流畅的使用
image.png表可以被哪些链使用?
表名 -----> 表规则可以被哪些链使用
raw -----> PREROUTING、OUTPUT
mangle -----> PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat -----> PREROUTING、OUTPUT、POSTROUTING
filter -----> INPUT、FORWARD、OUTPUT
链中可以存在多个表,那么在一个链中有多个表,应该如何执行呢??
例如从上图得知,OUTPUT 可以包含四个表,单这些表都存在时,他们的优先级(从高到低):raw --> mangle --> nat --> filter ,其他表也可以参照对比。
链中可以包含哪些表?优先级?
链 -----> 可以包含哪些表?优先级?
PREROUTING -----> Raw > nangle > nat
INPUT -----> Mangle > filter
FORWARD -----> Mangle > filter
OUTPUT -----> Raw > mangle > nat > filter
POSTROUTING -----> Mangle > nat
其中INPUT 中在centos7就包含了nat表,centos6中不包含,需要了解一下。
第4章 Iptables设置规则
上文就在说,iptables匹配自定义的规则 ,当匹配到了指定的规则之后就会按照定义的动作进行处理
例如:
我们设置一个规则,公交车上低于1.2m的儿童能够免票。
那么想要免票就需要满足两个规则:儿童、低于1.2m。不是儿童或者>=1.2m或者不是儿童且>=1.2m 就不满足条件,售票员就不能让
Iptables设置的规则也是这样,当匹配上了符合条件的报文,就执行自定义的动作进行处理这个报文。
4.1 匹配条件
匹配条件分为基本匹配条件与扩展匹配条件,需要注意的是iptables 是从上往下开始匹配,以先达条件规则执行。
4.1.1 基本匹配条件:
源地址Source IP,目标地址 Destination IP
上述内容都可以作为基本匹配条件。
4.1.2 扩展匹配条件:
除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。
源端口Source Port, 目标端口Destination Port
上述内容都可以作为扩展匹配条件
4.2 处理动作
处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。
此处列出一些常用的动作,之后的文章会对它们进行详细的示例与总结:
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
第5章 Iptables基本使用
5.1 Iptables基本语法参数
语法 :iptables(选项)(参数)
选项:
参数 作用
-t ,--table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。
#通用匹配:源地址目标地址的匹配
-p ,指定要匹配的数据包协议类型;
-s ,--source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d ,--destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i ,--in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o ,--out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
#查看管理命令
-L ,--list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
#规则管理命令
-A ,--append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I ,--insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D ,--delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num ,Replays替换/修改第几条规则
#链管理命令(立即生效)
-P ,--policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F ,--flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N ,--new-chain chain 用指定的名字创建一个新的链。
-X ,--delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E ,--rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
-Z ,--zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
-j ,--jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h ,显示帮助信息;
命令选项输入顺序 :
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
5.2 实例
5.2.1 查看已添加规则
iptables -nL
image.png
5.2.2 清空当所有规则和计数
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
5.2.3 允许本地回环地址可以正常使用
本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
5.2.4 设置默认的规则
iptables -P INPUT DROP # 配置默认的不让进,注意:当前远程连接也会断开,请视情况使用
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
默认规则 使用iptables -nL 不能查看到,所以需要谨慎使用
image.png当我们怀疑是iptables出现问题 ,清理规则之后还是失败,就需要考虑将INPUT、OUTPUT、FORWARD等修改为默认ACCEPT
iptables -P INPUT ACCEPT # 配置默认 放通
iptables -P FORWARD ACCEPT # 默认放通转发
iptables -P OUTPUT ACCEPT # 默认放通
5.2.5 配置tcp 22端口放通
iptables -A INPUT -i ens33 -p tcp --dport 22 -j ACCEPT
“-A INPUT” – 表示我们要在 INPUT 链的最后增加后面的规则。所以这条规则将会应用于入站的数据包。
“-i ens33″ – 表示检查通过 eth0 接口进入的数据包,看看是否匹配此规则。
“-p tcp –dport 22″ – 该规则针对的是 TCP 数据包,并且使用了 -p 参数的选项 “–dport 22″ 来指定该规则针对的是要发送到服务器 22 号端口(即 SSH 端口)的数据包。
“-j ACCEPT” – 跳转到 ACCEPT,即接受满足这些匹配规则的数据包的传输。
放通之后修改默认规则input 为 drop ,可以正常连接,测试ping 失败
image.pngimage.png
5.2.6 在input规则最后添加“丢弃所有包”
这个设置可以代替默认规则,
iptables -A INPUT -j DROP
image.png5.2.7 指定协议匹配。
匹配指定协议。
iptables -A INPUT -p tcp
匹配指定协议之外的所有协议。
iptables -A INPUT -p !tcp
5.2.8 指定地址匹配。
指定匹配的主机。
iptables -A INPUT -s 192.168.0.18
指定匹配的网络。
iptables -A INPUT -s 192.168.2.0/24
匹配指定主机之外的地址。
iptables -A FORWARD -s 192.168.0.19
匹配指定网络之外的网络。
iptables -A FORWARD -s ! 192.168.3.0/24
5.2.9 指定网络接口匹配。
指定单一的网络接口匹配。
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
指定同类型的网络接口匹配。
iptables -A FORWARD -o ppp+
5.2.10 指定端口匹配。
指定单一端口匹配。
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p udp –dport 53
匹配指定端口之外的端口。
iptables -A INPUT -p tcp –dport
匹配端口范围。
iptables -A INPUT -p tcp –sport 22:80
匹配ICMP端口和ICMP类型。
iptables -A INOUT -p icmp –icimp-type 8
指定ip碎片。
每个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包
(称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有
完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(象有TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT
并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题。
iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。
网友评论