zoukankan      html  css  js  c++  java
  • linux_iptables 详解

    iptables工具__过滤包—命令(-A、-I、-D、-R、-L等)、参数(-p、-s、-d、--sport、--dport、-i、-o等)、动作-j (ACCEPT、DROP、REJECT、REDIRECT等)  

    2012-02-27 13:20:51|  分类: Linux常用工具|举报|字号 订阅

     
     

    iptables 指令

    语法:

             iptables [-t table] command [match] [-j target/jump]

             -t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,

              当未指定规则表时,则一律视为是 filter。

    各个规则表的功能如下:

               nat 此规则表拥有 Prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。

               mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则链。除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。

               filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链这个规则表顾名思义是用来进行封包过滤的理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT,我们会将基本规则都建立在此规则表中。

    主要包含::   命令表     用来增加(-A、-I)删除(-D)修改(-R)查看(-L)规则等;

                          常用参数   用来指定协议(-p)、源地址(-s)、源端口(--sport)、目的地址(-d)、目的端口(--dport)、

                                          进入网卡(-i)、出去网卡(-o)等设定包信息(即什么样的包);

                                         用来描述要处理包的信息。

                          常用处理动作    用   -j   来指定对包的处理(ACCEPT、DROP、REJECT、REDIRECT等)。

    1、常用命令列表:  常用命令(-A追加规则、-D删除规则、-R修改规则、-I插入规则、-L查看规则)

    命令 -A, --append

    范例 iptables -A INPUT ...

    说明 新增规则(追加方式)到某个规则链(这里是INPUT规则链)中,该规则将会成为规则链中的最后一条规则。

    命令 -D, --delete

    范例 iptables -D INPUT --dport 80 -j DROP

          iptables -D INPUT 1

    说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

    命令 -R, --replace

    范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP

    说明 取代现行规则,规则被取代后并不会改变顺序。(1是位置)

    命令 -I, --insert

    范例 iptables -I INPUT 1 --dport 80 -j ACCEPT

    说明 插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。

    命令 -L, --list

    范例 iptables -L INPUT

    说明 列出某规则链中的所有规则。

    命令 -F, --flush

    范例 iptables -F INPUT

    说明 删除某规则链(这里是INPUT规则链)中的所有规则。

    命令 -Z, --zero

    范例 iptables -Z INPUT

    说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

    命令 -N, --new-chain

    范例 iptables -N allowed

    说明 定义新的规则链。

    命令 -X, --delete-chain

    范例 iptables -X allowed

    说明 删除某个规则链。

    命令 -P, --policy

    范例 iptables -P INPUT DROP

    说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。

    命令 -E, --rename-chain

    范例 iptables -E allowed disallowed

    说明 修改某自订规则链的名称。

    2、常用封包比对参数:(-p协议、-s源地址、-d目的地址、--sport源端口、--dport目的端口、-i 进入网卡、-o 出去网卡)

    参数           -p, --protocol                    (指定协议)

    范例 iptables -A INPUT -p tcp           (指定协议)      -p all   所有协议,  -p !tcp 去除tcp外的所有协议。

    说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,

    意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。

    参数          -s, --src, --source                  (指定源地址,指定源端口--sport)

    例如: iptables -A INPUT -s 192.168.1.1

    说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,

    例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,

    例如:-s ! 192.168.0.0/24。

    参数         -d, --dst, --destination           (指定目的地址,指定目的端口--dport)

    例如: iptables -A INPUT -d 192.168.1.1

    说明 用来比对封包的目的地 IP,设定方式同上。

    参数         -i, --in-interface                      (指定入口网卡)      -i  eth+   所有网卡

    例如: iptables -A INPUT -i eth0

    说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,

    例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对

    例如:-i ! eth0。

    参数        -o, --out-interface                   (指定出口网卡)

    例如: iptables -A FORWARD -o eth0

    说明 用来比对封包要从哪片网卡送出,设定方式同上。

    参数        --sport, --source-port              (源端口)

    例如: iptables -A INPUT -p tcp --sport 22

    说明 用来比对封包的来源端口号,可以比对单一埠,或是一个范围,

    例如:--sport 22:80,表示从 22 到 80 端口之间都算是符合件,

    如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。

    参数        --dport, --destination-port     (目的端口)

    例如: iptables -A INPUT -p tcp --dport 22

    说明 用来比对封包的目的端口号,设定方式同上。

    参数       --tcp-flags                                  (只过滤TCP中的一些包,比如SYN包,ACK包,FIN包,RST包等等)

    例如: iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

    说明  比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,

               第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、

    FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 

    NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对。

    参数 --syn

    例如: iptables -p tcp --syn

    说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,

    FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。

    参数 -m multiport --source-port

    例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110

    说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 

    运算子进行反向比对。

    参数 -m multiport --destination-port

    例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110

    说明 用来比对不连续的多个目的地埠号,设定方式同上。

    参数 -m multiport --port

    例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110

    说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。

    注意:在本范例中,如果来源端口号为 80目的地埠号为 110,这种封包并不算符合条件。

    参数 --icmp-type

    例如: iptables -A INPUT -p icmp --icmp-type 8

    说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。

    请打 iptables -p icmp --help 来查看有哪些代码可用。

    参数 -m limit --limit

    例如: iptables -A INPUT -m limit --limit 3/hour

    说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是

    否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,

    默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的

    比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水

    攻击法,导致服务被阻断。

    参数 --limit-burst

    范例 iptables -A INPUT -m limit --limit-burst 5

    说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超

    过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。

    参数 -m mac --mac-source

    范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

    说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。

    参数 --mark

    范例 iptables -t mangle -A INPUT -m mark --mark 1

    说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。

    参数 -m owner --uid-owner

    范例 iptables -A OUTPUT -m owner --uid-owner 500

    说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 

    root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出

    来自其它主机的封包。

    参数 -m owner --gid-owner

    范例 iptables -A OUTPUT -m owner --gid-owner 0

    说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

    参数 -m owner --pid-owner

    范例 iptables -A OUTPUT -m owner --pid-owner 78

    说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。

    参数 -m owner --sid-owner

    范例 iptables -A OUTPUT -m owner --sid-owner 100

    说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时

    机同上。

    参数 -m state --state

    范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED

    说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

    INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。

    ESTABLISHED 表示该封包属于某个已经建立的联机。

    NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。

    RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

    3、常用的处理动作: (-j  指定对满足条件包的处理,常用动作有ACCEPT接受报、DROP丢弃报、REJECT丢弃报并通知对方、REDIRECT重定向包等)

    -j   参数用来指定要进行的处理动作常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:

    ACCEPT        将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。

    REJECT          拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 

    例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

       iptables -A FORWARD -s 174.140.3.190 -d 216.99.1.216 -p tcp -m tcp --dport 80 -j ACCEPT 

       -- 指定来源ip,转发给指定目的ip的指定端口
       iptables -A FORWARD -d 216.99.1.216 -p tcp -m tcp --dport 80 -j DROP

        -- 指定目的ip的指定端口

    DROP            丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

    REDIRECT       将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 

                           这个功能可以用来实作通透式porxy 或用来保护 web 服务器。

                    例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

    MASQUERADE              改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。

                    例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

    LOG              将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。

                    例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

    SNAT             改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。

                    例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

    DNAT            改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。

                   例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

    MIRROR        镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

    QUEUE          中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,

                          例如:计算联机费......等。

    RETURN        结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。

    MARK          将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。

                   例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2


    四.拓展模块 
    1.按来源MAC地址匹配
    # iptables -t filter -A FORWARD -m --mac-source 00:02:b2:03:a5:f6 -j DROP
    拒绝转发来自该MAC地址的数据包
    2.按多端口或连续端口匹配
      20:  表示20以后的所有端口
      20:100  表示20到100的端口
    :20  表示20之前的所有端口 
       -m multiport [--prots, --sports,--dports]

    例子:

    # iptables -A INPUT -p tcp -m multiport --dports 21,20,25,53,80 -j ACCEPT 【多端口匹配】
    # iptables -A INPUT -p tcp --dport 20: -j ACCEPT
    # iptables -A INPUT -p tcp --sport 20:80 -j ACCEPT
    # iptables -A INPUT -p tcp --sport :80 -j ACCEPT


    3.还可以按数据包速率和状态匹配
    -m limit --limit 匹配速率 如: -m limit --limit 50/s -j ACCEPT
    -m state --state 状态 如: -m state --state INVALID,RELATED -j ACCEPT

     

    4.还可以限制链接数

    -m connlimit --connlimit-above n 限制为多少个              
            例如:
            iptables -I FORWARD -p tcp -m connlimit --connlimit-above 9 -j DROP        //表示限制链接数最大为9个
     
    5、模拟随机丢包率
           iptables -A FORWARD -p icmp -m statistic --mode random --probability 0.31  -j REJECT   //表示31%的丢包率
           或者
           -m random --average 5 -j DROP 表示模拟丢掉5%比例的包
     
    相关知识:

    Linux 中延时模拟

    设置延时 3s :

    tc qdisc add dev eth0 root netem delay 3000ms

    可以在 3000ms 后面在加上一个延时,比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延时范围 2800 – 3200 之间.
    结果显示如下

    Linux 中丢包模拟

    设置丢包 50% ,iptables 也可以模拟这个,但一下不记的命令了,下次放上来:

    tc qdisc change dev eth0 root netem loss 50%
    上面的设丢包,如果给后面的 50% 的丢包比率修改成 ’50% 80%’ 时,这时和上面的延时不一样,这是指丢包比率为 50-80% 之间。
     

     

    Linux 中禁止ip访问

    linux下实用iptables封ip段的一些常见命令: 

    封单个IP的命令是: 
    iptables -I INPUT -s 211.1.0.0 -j DROP 

    封IP段的命令是: 
    iptables -I INPUT -s 211.1.0.0/16 -j DROP 
    iptables -I INPUT -s 211.2.0.0/16 -j DROP 
    iptables -I INPUT -s 211.3.0.0/16 -j DROP 

    封整个段的命令是: 
    iptables -I INPUT -s 211.0.0.0/8 -j DROP 

    封几个段的命令是: 
    iptables -I INPUT -s 61.37.80.0/24 -j DROP 
    iptables -I INPUT -s 61.37.81.0/24 -j DROP 

    Linux 中限制ip访问机器

    内网是192.168.1.0/24,限制只有192.168.100和192.168.1.200

    能访问WEB服务器。
    将WEB服务器的INPUT链设置成默认拒绝
    iptables -P INPUT DROP
    然后再添加下面两条规则
    iptables -A INPUT -s 192.168.1.100 -j ACCEPT
    iptables -A INPUT -s 192.168.1.200 -j ACCEPT

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/Sir-Li/p/4025775.html
Copyright © 2011-2022 走看看