iptables详解和应用

iptables详解

iptables简述

  iptables是Linux防火墙的管理工具,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是 Linux内核中实现包过滤的内部结构。

 

  iptables包含4个表,5个链,其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

 

4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

    filter:一般的过滤功能,包含3个链,INPUT、FORWARD、OUTPUT,内核模块:iptables_filter

    nat:用于nat功能(端口映射,地址映射等),包含3个链,PREROUTING、POSTROUTING、OUTPUT,内核模块:iptable_nat

    mangle:修改数据包的服务类型、TTL、并且可以配置路由实现QOS,包含5个链,PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD,内核模块:iptable_mangle

    raw:设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能,包含2个链,OUTPUT、PREROUTING,内核模块:iptable_raw

 

5条链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

 

    PREROUTING:数据包进入路由表之前

    INPUT:通过路由表后目的地为本机

    FORWARD:通过路由表后,目的地不为本机

    OUTPUT:由本机产生,向外转发

    POSTROUTIONG:发送到网卡接口之前 

 

5条链在内核空间的分布情况如下图:

 

 

 

规则链之间的执行顺序(分3种情况):

 

  第1种情况:入站数据流向

    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

  第2种情况:转发数据流向

    来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,然后进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(转发或拦截),然后再交给POSTROUTING规则链进行处理。

  第3种情况:出站数据流向

    防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

 

 

iptables语法格式

iptables [-t 表名] 命令选项[链名][条件匹配][-j 目标动作或跳转]

 

  说明:

    表名、链名用于指定iptables命令所操作的表和链;

    命令选项用于指定管理iptables规则的方式,比如:插入、增加、删除、查看等;

    条件匹配用于指定对符合什么样条件的数据包进行处理;

    目标动作或跳转用于指定数据包的处理方式,比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

 

  命令选项 

 

    -t:指定表,不指定的话,默认为filter;

    -N:new, 自定义一条新的规则链;

    -X:delete,删除自定义的规则链,但仅能删除用户自定义的且引用计数为0的空的链;

    -P:Policy,设置默认策略,其默认策略有:ACCEPT、DROP、REJECT;

    -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;

    -A:append,追加新的规则到指定位置,没指明位置的话默认为最后一条;

    -I:insert, 插入,要指明位置,省略时表示第一条;

    -D:delete,删除规则,需指明规则序号或指明规则本身;

    -R:replace,替换指定链上的指定规则;

    -F:flush,清空指定的规则链;

    -Z:zero,置零,可指定规则置零;iptables的每条规则都有两个计数器:(1) 匹配到的报文的个数;(2) 匹配到的所有报文的大小之和

    -L:list, 列出指定链上的所有规则;

    -n:numberic,以数字格式显示地址和端口号;

    -v:verbose,详细信息,能看到每个规则匹配的数据大小和包数量,-vv, -vvv

    -x:exactly,显示计数器结果的精确值;

    --line-numbers:显示规则的序号

 

  目标动作或跳转

 

    ACCEPT:接受

    DROP:丢弃

    REJECT:拒绝

      ---reject-with type:可指定拒绝报文的类型,如 icmp-net-unreachable,icmp-host-unreachable,icmp-port-unreachable等。

    RETURN:返回调用链;

    REDIRECT:端口重定向;

      --to-ports port[-port]:将匹配的端口重定向为此处指定的端口;

    LOG:记录日志

      --log-level:可指定记录的日志等级;

      --log-prefix:指定记录的日志路径,默认路径为:/var/log/messages;

    MARK:做防火墙标记;

    DNAT:目的地址转换

      --to-destination [ipaddr[-ipaddr]][:port[-port]]:将目的地址转换成内网网段的指定ip和端口;

    SNAT:源地址转换

      --to-source [ipaddr[-ipaddr]]:将源地址转换成指定的IP;

    MASQUERADE:当要转换的出口地址为动态IP时,MASQUERADE可自行判断要转换为的地址;

    自定义链名:调用自定义链作为处理动作

 

  条件匹配

 

基本匹配条件,基本匹配条件为内建条件,由iptables(netfilter)自行提供,无需加载任何模块。常见的基本匹配条件有:

 

  [!]-s, --source address[/mask][...]:检查报文中的源IP地址是否符合此处指定的地址或范围;

  [!]-d, --destination address[/mask][...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;

  [!]-p, --protocol protocol:指定匹配的协议,常见协议包括:TCP、UDP、ICMP等;

  [!]-i,--in-interface name:数据报文流入的接口,只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;

  [!]-o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链

 

扩展匹配条件,需加载扩展模块方可生效,而扩展匹配条件又分为隐式扩展和显示扩展。

 

  隐式扩展不需要手动加载扩展模块,因为其是对协议的扩展,当使用-p选项指明了协议时,就表示已经指明了要扩展的模块。其常见条件包括:

 

    [!]--source-port, --sport port[:port]:匹配报文的源端口;可指定端口范围;

    [!]--destination-port,--dport port[:port]:匹配报文的目标端口;可指定端口范围;

    [!]--tcp-flags:指定tcp的标记,如:SYN,ACK,FIN,RST等;

    [!]--syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;

    [!]--icmp-type {type[/code]|typename}:用于指定icmp协议的类型,如--icmp-type 8

 

  显示扩展则必须手动加载扩展模块,需使用 -m 选项指明要调用的扩展模块,其格式为 -m 扩展模块。常见的扩展模块如下:

 

  1、multiport:以离散或连续的方式定义多端口匹配条件,最多不超过15个端口;

    [!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;

    [!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

    [!]--ports port[,port|,port:port]...:指明多个端口

  2、iprange:指明连续的IP地址范围

    [!] --src-range from[-to]:源IP地址;

    [!] --dst-range from[-to]:目标IP地址

  3、time:根据将报文送到的时间与指定的时间范围进行匹配;

    --kerneltz:用系统本地时区代替默认的UTC时区;

    --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...]:指定规则在星期几生效

  4、string:用于对报文中的应用层数据做字符串模式匹配检查;

    --algo {bm|kmp}:字符串匹配检测算法;

    [!]--string pattern:要检测的字符串模式;

    [!]--hex-string pattern:要检测的字符串模式,16进制格式

  5、connlimit:根据每个客户端的Ip做并发连接数数量匹配检查;

    --connlimit-upto n:连接的数量小于等于n时匹配;

    --connlimit-above n:连接的数量大于n时匹配

  6、limit:对收发报文的速率做条件匹配;

    --limit rate[/second|/minute|/hour|/day]:将匹配的报文限制速率为每second|/minute|/hour|/day发送rate次;

    --limit-burst number:限制当达到多个报文后,执行限制

  7、state:根据”连接追踪机制“去检查连接的状态;

    [!] --state state:state的类型包括如下:

      NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;

      ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;

      RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;

      INVALID:无效的连接;

      UNTRACKED:未进行追踪的连接

 

更多相关帮助可使用命令 man iptables 和 man iptables-extensions 进行查看。

 

 防火墙iptables应用实例

192.168.137.150 为本机的ip地址;每条链的规则是由上至下进行匹配,因此我们需要把范围小的规则放在上面以防被覆盖。

 

一.清空iptables默认规则,并自定义规则

[root@iptables ~]# systemctl   start   firewalld.service   #启用防火墙
[root@iptables ~]# iptables   -F      #清空默认规则
[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  tcp  --dport  22  -j  ACCEPT  #接受任何主机对本机的ssh连接请求
[root@iptables ~]#iptables  -I OUTPUT  -s  192.168.137.150  -p  tcp  --sport  22  -j  ACCEPT  #允许本机对任何主机建立ssh连接
[root@iptables ~]# iptables   -A   INPUT   -j   REJECT  #最后一条规则设置为拒绝所有入站请求
[root@iptables ~]# iptables   -A   OUTPUT  -j   REJECT  #最后一条规则设置为拒绝所有出站流量
[root@iptables ~]# iptables   -vnL

 

二.多端口匹配,开放21,22,23,80,3306端口

 

 

[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  tcp  -m  multiport  --dports 21:23,80,3306   -j   ACCEPT
[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  udp  -m  multiport  --dports 21:23,80,3306   -j   ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  tcp  -m  multiport  --sports   21:23,80,3306   -j   ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  udp  -m  multiport  --sports  21:23,80,3306   -j   ACCEPT

  

三.连续地址的匹配,允许192.168.137.1 ~ 192.168.137.100访问80端口

[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  tcp  --dport  80  -m  iprange --src-range  192.168.137.1-192.168.137.100   -j   ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  tcp  --sport  80  -m  iprange --dst-range  192.168.137.1-192.168.137.100   -j   ACCEPT

 

四.限定时间访问,只允许周一到周五 9:00~18:00 之间访问80端口

[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  tcp  --dport  80  -m  time --kerneltz  --weekdays  1,2,3,4,5  --timestart  9:00 --timestop  18:00  -j  ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  tcp  --sport  80  -m  time --kerneltz  --weekdays  1,2,3,4,5  --timestart  9:00  --timestop  18:00  -j  ACCEPT

 

五.对报文作字符串匹配,拒绝响应带“vpn”明文字符的报文通过80端口

[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  tcp  --sport  80  -m  string  --algo  kmp  --string  "vpn"  -j  REJECT

 

六.并发连接限制,限制192.168.2.0/24网段中每个ip对3306端口最多只能有2个并发

[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -s  192.168.2.0/24  -p  tcp --dport  3306  -m  connlimit   --connlimit-upto   2   -j   ACCEPT

 

七.对报文作速率限制,限制同时最多有5个icmp包,每秒1个icmp包

[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  icmp  --icmp-type  8  -m limit  --limit-burst  5  --limit  60/minute  -j  ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  icmp  --icmp-type  0  -j ACCEPT

 

八.对报文状态作匹配,开放会话状态为ESTABLISHED的连接

[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -m  state  --state  ESTABLISHED  -j  ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -m  state  --state  ESTABLISHED -j  ACCEPT

 

九.对ftp服务作会话追踪

# 加载ftp追踪模块

[root@iptables data]# modprobe   nf_conntrack_ftp
[root@iptables data]# lsmod  |  grep  ftp

 

# 卸载模块:rmmod nf_conntrack_ftp
# 添加iptables rules
[root@iptables data]# iptables  -I  INPUT  -d  192.168.137.150  -p  tcp  --dport  21  -m  state  --state  NEW  -j  ACCEPT
[root@iptables data]# iptables  -I  INPUT  -d  192.168.137.150  -m  state  --state  ESTABLISHED,RELATED  -j  ACCEPT
[root@iptables data]# iptables  -I  OUTPUT  -s  192.168.137.150  -m  state  --state  ESTABLISHED  -j ACCEPT
[root@iptables data]# cat   /proc/net/nf_conntrack

 

十.将对80端口的访问重定向到8080端口

[root@iptables ~]# iptables  -t  nat  -I  PREROUTING  -d  192.168.137.150  -p  tcp  --dport 80  -j  REDIRECT  --to-port  8080
[root@iptables ~]# iptables  -I  INPUT  -d  192.168.137.150  -p  tcp  --dport  8080  -j ACCEPT
[root@iptables ~]# iptables  -I  OUTPUT  -s  192.168.137.150  -p  tcp  -m  multiport  --sports  80,8080  -j  ACCEPT

  

 

posted @ 2021-03-02 15:11  破碎的屋檐  阅读(493)  评论(0编辑  收藏  举报