三小时玩转iptalbes
iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工作原理,你会发现其实它很简单。首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。
图: IPTables Table, Chain, and Rule Structure
iptables他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成。
netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。
iptables的结构
简单地讲,tables由chains组成,而chains又由rules组成。iptables默认有四个表Filter, NAT, Mangle, Raw,其对于的链如下图。
1. Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
INPUT链 – 处理来自外部的数据。
OUTPUT链 – 处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。
数据流向场景
访问本机:在INPUT链上做过滤
本机访问外部:在OUTPUT链上做过滤
通过本机访问其他主机:在FORWARD链上做过滤
2. NAT表
NAT表有三种内建链:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ipaddress),通常用于DNAT(destination NAT)。
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ipaddress),通常用于SNAT(source NAT)。
OUTPUT链 – 处理本机产生的数据包。
3. Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING
4. Raw表
Raw表用于处理异常,它具有2个内建链:
PREROUTING chain
OUTPUT chain
iptables的工作机制
从上面的发展我们知道选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢?由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
防火墙的策略
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的
2.nat 定义地址转换的
3.mangle功能:修改报文原数据
我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
Iptables基本操作
Centos7
安装iptable iptable-service
安装iptables
yum install -y iptables
升级iptables
yum update iptables
安装iptables-services
yum install iptables-services
禁用/停止自带的firewalld服务
#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld
保存规则设定
service iptables save
开启iptables服务
#相当于以前的chkconfigiptables on
systemctl enable iptables.service
#开启服务
systemctl start iptables.service
#查看状态
systemctl status iptables.service
打开iptables转发
echo "1"> /proc/sys/net/ipv4/ip_forward
iptables语法规则
iptables[-t 要操作的表]
<操作命令>
[要操作的链]
[规则号码]
[匹配条件]
[-j 匹配到以后的动作]
命令概述
操作命令(-A、-I、-D、-R、-P、-F)
查看命令(-L)
-----------------------------------------------------------------------------------------
-A
-A<链名>
APPEND,追加一条规则(放到最后)
例如:
iptables-t filter -A INPUT -j DROP
在filter 表的INPUT 链里追加一条规则(作为最后一条规则)
匹配所有访问本机IP 的数据包,匹配到的丢弃
-I
-I<链名> [规则号码]
INSERT,插入一条规则
例如:
iptables-I INPUT -j DROP
在filter 表的INPUT 链里插入一条规则(插入成第1条)
iptables-I INPUT 3 -j DROP
在filter 表的INPUT 链里插入一条规则(插入成第3条)
注意: 1、-t filter 可不写,不写则自动默认是filter表
2、-I 链名[规则号码],如果不写规则号码,则默认是1
3、确保规则号码≤(已有规则数+ 1),否则报错
-D
-D<链名> <规则号码| 具体规则内容>
DELETE,删除一条规则
例如:
iptables-D INPUT 3(按号码匹配)
删除filter 表INPUT 链中的第三条规则(不管它的内容是什么)
iptables-D INPUT -s 192.168.0.1 -j DROP(按内容匹配)
删除filter 表INPUT 链中内容为“-s192.168.0.1 -j DROP”的规则
(不管其位置在哪里)
注意:
1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
2、按号码匹配删除时,确保规则号码≤已有规则数,否则报错
3、按内容匹配删除时,确保规则存在,否则报错
-R
-R<链名> <规则号码> <具体规则内容>
REPLACE,替换一条规则
例如:
iptables-R INPUT 3 -j ACCEPT
将原来编号为3 的规则内容替换为“-j ACCEPT”
注意:
确保规则号码≤ 已有规则数,否则报错
-P
-P<链名> <动作>
POLICY,设置某个链的默认规则
例如:
iptables-P INPUT DROP
设置filter 表INPUT 链的默认规则是DROP
注意:
当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。
动作前面不能加–j,这也是唯一一种匹配动作前面不加–j 的情况。
-F
-F [链名]
FLUSH,清空规则
例如:
iptables-F INPUT
清空filter 表INPUT 链中的所有规则
iptables-t nat -F PREROUTING
清空nat 表PREROUTING 链中的所有规则
注意:
1、-F 仅仅是清空链中规则,并不影响-P 设置的默认规则
2、-P 设置了DROP 后,使用-F 一定要小心!!!
3、如果不写链名,默认清空某表里所有链里的所有规则
-L
-L [链名]
LIST,列出规则
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在v 的基础上,禁止自动单位换算(K、M)
n:只显示IP 地址和端口号码,不显示域名和服务名称
例如:
iptables-L
粗略列出filter 表所有链及所有规则
iptables-t nat -vnL
用详细方式列出nat 表所有链的所有规则,只显示IP 地址和端口号
iptables-t nat -vxnL PREROUTING
用详细方式列出nat 表PREROUTING 链的所有规则以及详细数字,不反解
匹配条件
流入、流出接口(-i、-o)
来源、目的地址(-s、-d)
协议类型(-p)
来源、目的端口(--sport、--dport)
-----------------------------------------------------------------------------------------------------
按网络接口匹配
-i <匹配数据进入的网络接口>
例如:
-i eth0
匹配是否从网络接口eth0 进来
-i ppp0
匹配是否从网络接口ppp0 进来
-o 匹配数据流出的网络接口
例如:
-o eth0
-o ppp0
按来源目的地址匹配
-s <匹配来源地址>
可以是IP、NET、DOMAIN,也可空(任何地址)
例如:
-s 192.168.0.1 匹配来自192.168.0.1 的数据包
-s 192.168.1.0/24 匹配来自192.168.1.0/24 网络的数据包
-s 192.168.0.0/16 匹配来自192.168.0.0/16 网络的数据包
-d <匹配目的地址>
可以是IP、NET、DOMAIN,也可以空
例如:
-d 202.106.0.20 匹配去往202.106.0.20 的数据包
-d 202.106.0.0/16 匹配去往202.106.0.0/16 网络的数据包
-d www.abc.com 匹配去往域名www.abc.com 的数据包
按协议类型匹配
-p <匹配协议类型>
可以是TCP、UDP、ICMP 等,也可为空
例如:
-p tcp
-p udp
-p icmp --icmp-type 类型
ping: type 8 pong: type 0
按来源目的端口匹配
--sport <匹配源端口>
可以是个别端口,可以是端口范围
例如:
--sport 1000 匹配源端口是1000 的数据包
--sport 1000:3000 匹配源端口是1000-3000 的数据包(含1000、3000)
--sport :3000 匹配源端口是3000 以下的数据包(含3000)
--sport 1000: 匹配源端口是1000 以上的数据包(含1000)
--dport <匹配目的端口>
可以是个别端口,可以是端口范围
例如:
--dport 80 匹配目的端口是80 的数据包
--dport 6000:8000 匹配目的端口是6000-8000 的数据包(含6000、8000)
--dport :3000 匹配目的端口是3000 以下的数据包(含3000)
--dport 1000: 匹配目的端口是1000 以上的数据包(含1000)
注意:--sport 和--dport 必须配合-p 参数使用
匹配应用举例
1、端口匹配
-p udp --dport 53
匹配网络中目的端口是53 的UDP 协议数据包
2、地址匹配
-s 10.1.0.0/24 -d172.17.0.0/16
匹配来自10.1.0.0/24 去往172.17.0.0/16 的所有数据包
3、端口和地址联合匹配
-s 192.168.0.1 -dwww.abc.com -p tcp --dport 80
匹配来自192.168.0.1,去往www.abc.com 的80 端口的TCP 协议数据包
注意:
1、--sport、--dport 必须联合-p 使用,必须指明协议类型是什么
2、条件写的越多,匹配越细致,匹配范围越小
---------------------------------------------------------------------------------------
动作(处理方式)
ACCEPT
DROP
SNAT
DNAT
MASQUERADE
-j ACCEPT
-j ACCEPT
通过,允许数据包通过本链而不拦截它
类似Cisco 中ACL 里面的permit
例如:
iptables -A INPUT -jACCEPT
允许所有访问本机IP 的数据包通过
-j DROP
-j DROP
丢弃,阻止数据包通过本链而丢弃它
类似Cisco 中ACL 里的deny
例如:
iptables -A FORWARD-s 192.168.80.39 -j DROP
阻止来源地址为192.168.80.39 的数据包通过本机
-j DNAT
-j DNAT --toIP[-IP][:端口-端口](nat 表的PREROUTING 链)
目的地址转换,DNAT 支持转换为单IP,也支持转换到IP 地址池
(一组连续的IP 地址)
例如:
iptables -t nat -APREROUTING -i ppp0 -p tcp --dport 80 \
-j DNAT --to192.168.0.1
把从ppp0 进来的要访问TCP/80 的数据包目的地址改为192.168.0.1
iptables -t nat -APREROUTING -i ppp0 -p tcp --dport 81 \
-j DNAT --to192.168.0.2:80
iptables -t nat -APREROUTING -i ppp0 -p tcp --dport 80 \
-j DNAT --to192.168.0.1-192.168.0.10
-j SNAT
-j SNAT --toIP[-IP][:端口-端口](nat 表的POSTROUTING 链)
源地址转换,SNAT 支持转换为单IP,也支持转换到IP 地址池
(一组连续的IP 地址)
例如:
iptables -t nat -APOSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1
将内网192.168.0.0/24 的原地址修改为1.1.1.1,用于NAT
iptables -t nat -APOSTROUTING -s 192.168.0.0/24 \
-j SNAT --to1.1.1.1-1.1.1.10
同上,只不过修改成一个地址池里的IP
-j MASQUERADE
-j MASQUERADE
动态源地址转换(动态IP 的情况下使用)
例如:
iptables -t nat -APOSTROUTING -s 192.168.0.0/24 -j MASQUERADE
将源地址是192.168.0.0/24 的数据包进行地址伪装
附加模块
按包状态匹配(state)
按来源MAC 匹配(mac)
按包速率匹配(limit)
多端口匹配(multiport)
state
-m state --state 状态
状态:NEW、RELATED、ESTABLISHED、INVALID
NEW:有别于tcp 的syn
ESTABLISHED:连接态
RELATED:衍生态,与conntrack 关联(FTP)
INVALID:不能被识别属于哪个连接或没有任何状态
例如:
iptables -A INPUT -m state--state RELATED,ESTABLISHED \
-j ACCEPT
mac
-m mac --mac-sourceMAC
匹配某个MAC 地址
例如:
iptables -A FORWARD-m mac --mac-source xx:xx:xx:xx:xx:xx \
-j DROP
阻断来自某MAC 地址的数据包,通过本机
注意:
报文经过路由后,数据包中原有的mac 信息会被替换,所以在路由
后的iptables 中使用mac 模块是没有意义的
limit
-m limit --limit 匹配速率[--burst 缓冲数量]
用一定速率去匹配数据包
例如:
iptables -A FORWARD-d 192.168.0.1 -m limit --limit 50/s \
-j ACCEPT
iptables -A FORWARD-d 192.168.0.1 -j DROP
注意:
limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而
已,要想限制的话后面要再跟一条DROP
multiport
-m multiport<--sports|--dports|--ports> 端口1[,端口2,..,端口n]
一次性匹配多个端口,可以区分源端口,目的端口或不指定端口
例如:
iptables -A INPUT -ptcp -m multiport --dports \
21,22,25,80,110 -jACCEPT
注意:
必须与-p 参数一起使用
----------------------------------------------------------------------------------------------------------------
实例分析:
实例:一个普通的web 服务器
iptables -A INPUT -ilo -j ACCEPT
iptables -A INPUT -ptcp -m multiport --dports 22,80 -j ACCEPT
iptables -A INPUT -m state--state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUTDROP
允许远程主机进行SSH连接
iptables -A INPUT -ieth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -oeth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允许本地主机进行SSH连接
iptables -A OUTPUT -oeth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INTPUT -ieth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允许HTTP请求
iptables -A INPUT -ieth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -oeth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个
iptables -A INPUT -ieth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second--limit-burst 3 -j ACCEPT
如何正确配置iptables
删除现有规则
iptables -F
iptables -X
iptalbes –Z
配置默认链策略
iptables -P INPUTDROP
iptables -P FORWARDDROP
iptables -P OUTPUTDROP
使用iptables抵抗常见攻击
防止syn攻击
限制syn的请求速度(这个方式需要调节一个合理的速度值,不然会影响正常用户的请求
ptables -N syn-flood
iptables -A INPUT -ptcp --syn -j syn-flood
iptables -A syn-flood-m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood-j DROP
限制单个ip的最大syn连接数
iptables –A INPUT –ieth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP
防止DOS攻击
利用recent模块抵御DOS攻击
iptables -I INPUT -ptcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
单个IP最多连接3个会话
iptables -I INPUT -ptcp --dport 22 -m state --state NEW -m recent --set --name SSH
只要是新的连接请求,就把它加入到SSH列表中
Iptables -I INPUT -ptcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3--name SSH -j DROP
5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。
------------------------------------------------------------------------------------------------------------
防止单个ip访问量过大
iptables -I INPUT -ptcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
木马反弹
iptables –A OUTPUT –mstate --state NEW –j DROP
---------------------------------------------------------------------------------------------------------------
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢
iptables -A OUTPUT -picmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -picmp --icmp-type 0 -j ACCEPT
对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s127.0.0.1 -d 127.0.0.1 -j ACCEPT
只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD
iptables -t filter -AINPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
iptables -t filter -AOUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
页:
[1]