设为首页 收藏本站
查看: 1457|回复: 0

[经验分享] 三小时玩转iptalbes

[复制链接]

尚未签到

发表于 2017-7-10 06:04:10 | 显示全部楼层 |阅读模式
  iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工作原理,你会发现其实它很简单。
首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。

DSC0000.png

图: 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,其对于的链如下图。

DSC0001.jpg

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)
  查看命令(-[vnx]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、如果不写链名,默认清空某表里所有链里的所有规则
  -[vxn]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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392174-1-1.html 上篇帖子: Kali-linux使用OpenVAS 下篇帖子: 关于自学IT技术的一点心得和建议
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表