Girls don't frown,...
iptables 笔记(二)匹配条件、扩展模块、动作..
  • xiele-淡墨
  • 2019-05-07
  • Linux
  • 匹配条件总结:

    匹配条件:源地址
    iptables -t filter -I INPUT -s 192.168.0.1,192.168.0.2 -j DROP
    指定源地址,一次指定多个

    iptables -t filter -I INPUT -s 192.168.0.0/25 -j ACCEPT
    指定源地址,指定一个网段

    iptables -t filter -I INPUT -s !192.168.0.1 -j ACCEPT
    条件取反,只要源ip不是192.168.0.1那么就接受此报文,但是源地址是192.168.0.1时并不代表会被拒绝


    匹配条件:目标地址
    iptables -t filter -I INPUT -s 192.168.0.1 -d 192.168.5.138 -j DROP
    -d 192.168.5.138为目标地址
    拒绝源地址为192.168.0.1向192.168.5.138的报文

    iptables -t filter -I INPUT -d 192.168.5.138 -j DROP
    拒绝所有发送到192.168.5.138的报文


    匹配条件:协议类型
    iptables -I INPUT -s 192.168.5.1 -d 192.168.5.138 -p tcp -j REJECT
    拒绝源地址192.168.5.1向目标地址192.168.5.138的tcp协议报文


    匹配类型:扩展匹配条件
    iptales -t filter -I INPUT -s 192.168.1.1 -p tcp -m tcp --dport 22 -j REJECT
    -p 代表协议
    -m tcp 代表对应的扩展模块为tcp
    --dport 扩展匹配条件,如果要使用这个扩展匹配条件必须要依靠某个模块来完成,这个就是tcp的扩展模块
    拒绝源地址192.168.1.1 访问目标端口 22

    iptables -t filter -I INPUT -s 192.168.0.1 -p tcp --sport 22 -j ACCEPT
    --sport 22 表示源端口 22
    扩展条件是可以取反的: !--sport 22 表示目标端口不是22的报文将会被匹配到

    iptables -t filter -I INPUT -s 192.168.1.1 -p tcp -m --dport 22:25 -j REJECT
    22:25 指定端口范围(22、23、24、25)
    :22 表示0到22端口
    80: 表示80开始到65505

    multiport模块 --sports 扩展条件可以同时指定多个离散的源端口。
    multiport模块 --dports 扩展条件可以同时指定多个离散的目标端口。
    ipables -t filter -I INPUT -s 192.168.1.1 -p tcp -m multiport --dports 22,36,38 -j DROP
    禁止源地址192.168.1.1访问22,36,38端口
    iptables -t filter -I INPUT -s 192.168.0.1 -p tcp *m multiport --dports 22,80:88 -j DROP
    22,80:88 表示22端口,80到88端口
    multiport扩展只能用于tcp和udp协议,即配合-p tcp 或者 -p udp 使用

    匹配条件:匹配报文从哪个网卡流出
    iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
    -o 匹配icmp协议的报文禁止从 eth4 流出
    匹配条件只用于匹配报文流出的网卡,所以在INPUT链和PREROUTING链中不能使用此选项。


    iprange 扩展模块:
    指定一段范围连续的IP地址,用于匹配源地址和目标地址
    --src-range 源地址
    --dst-range 目标地址
    iptables -t filter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP
    表示源地址在192.168.1.1到192.168.1.10之间,则丢弃报文。ip段的始末用 - 隔开。
    也可以使用 ! 取反。

    string 扩展模块:
    指定要匹配的字符串,如果报文有包含对应的字符串,则符合匹配条件。
    iptables -t filter -I INPUT -m string --algo bm --string "123" -j REJECT
    如果报文有 123 字符串则匹配成功。
    --algo 指定匹配算法,可选的有 bm 和 kmp,必须指定。
    --string 用于指定需要匹配的字符串。

    time 扩展模块:
    根据时间匹配报文,如果报文到达的时间在指定的时间范围内到达,则符合匹配条件。
    比如:每天早上的6点到晚上的20点不能看网页。。。。。
    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 06:00:00 --timestop 20:00:00 -j REJECT

    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekday 6,7 -j REJECT
    只有周六日不能上网
    time --weekday 6,7 表示周六日

    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 20:00:00 --weekdays 6,7 -j REJECT
    --timestart 09:00:00 --timestop 20:00:00 --weekdays 6,7
    结合使用,表示每周日的9点到20点不能上网。

    iptables -t filter -I OUTPOT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
    --monthdays 22,23
    表示每个月的22号23号

    iptables -t filter -I OUTPOT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
    多个条件之间默认存在 与 关系,上述设置表示
    匹配的时间必须为星期5,并且这个星期5同时还需要时每个月的22号到28号之间的一天。

    iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestar 2018-02-02 --datestop 2018-02-23 -j REJECT
    --datestart 2018-02-02 --datestop 2018-02-23 指定日期范围。
    指定日期范围,--monthdays 与 --weekdays 可以 ! 取反,其他选项不能取反。


    connlimit 扩展模块:
    可以限制每个IP地址同时链接到server端的链接数量,可以不用指定ip,默认针对“每个客户端IP” ,即对单IP的并发连接数限制。

    iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    --connlimit-above 2
    限制每个IP地址最多只能占用两个ssh链接远程到server端。


    limit 扩展模块:
    limit 模块是对“报文到达速率”进行限制的。
    比如:我想限制单位时间内流入的包的数量。
    iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
    iptables -t filter -A INPUT -p icmp -j REJECT
    第一行表示每分钟最多放行10个icmp包,也即是6秒放行一个,第六秒的icmp包才会被上述的第一条规则匹配到。第六秒之前的包则不会被匹配到。
    于是被后面的拒绝规则匹配到了。

    --limit-burst : 指定“空闲时可放行的包的数量”。
    令牌桶算法:--limit 指定多长时间生成一个新令牌, --limit-burst 用于指定“木桶中最多存放几个令牌”
    iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
    --limit-burst 3 : 表示最多存放3个令牌。
    --limit 10/minute : 表示每分钟生成10个令牌。

    icmp 扩展:
    iptables -t filter -I INPUT -p icmp -j REJECT
    禁止所有ping,包括外部ping和内部ping

    iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT
    --icmp-type 8 : icmp扩展类型 8
    禁止外部ping,但是内部可以ping通


    黑名单白名单:
    白名单机制:我们就要把所有人都当做坏人,只放行好人。
    当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被匹配到的报文都会被默认拒绝,这就是白名单机制。

    黑名单机制:我们就要把所有人都当做好人,只拒绝坏人。
    当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是白名单。

    白名单似乎更加安全,黑名单机制似乎更加灵活一些。

    默认策略设置为DROP的缺点:
    在对应的链中没有设置任何规则时,这样使用默认策略为DROP是非常不明智的,因为管理员也会把自己拒之门外,即使对应的链中存在放行规则,当我们不小心使用"iptables -F"清空规则时,放行规则被删除,则所有数据包都无法进入,这个时候就相当于给管理员挖了个坑,所以,我们如果想要使用"白名单"的机制,最好将链的默认策略保持为"ACCEPT",然后将"拒绝所有请求"这条规则放在链的尾部,将"放行规则"放在前面,这样做,既能实现"白名单"机制,又能保证在规则被清空时,管理员还有机会连接到主机,示例如下。

    我们只允许22端口和80端口放行:
    iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
    iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -j REJECT #在表的最后面追加规则,没有匹配到的一律拒绝

    上述设置既将 INPUT 的默认策略设置为了 ACCEPT 同时又使用了白名单机制,因为如果报文符合放行条件,则会被前面的放行规则匹配到,如果报文不符合放行条件,则会被最后一条规则匹配到,此刻,即使我么误操作,执行了 “ iptables -F “ 操作,也能保证管理员能够远程到主机上维护,因为默认策略仍然是 ACCEPT 。


    iptables 自定义链:
    当默认链的规则太多的时候不方便管理,自定义链方便管理。
    自定义链不能直接使用,需要用过默认链的引用才能够使用。

    iptables -t filter -N IN_WEB
    -N 新建自定义链 IN_WEB

    iptables -t filter -I IN_WEB -s 192.168.5.136 -j REJECT
    在自定义链中添加规则

    默认链引用自定义链:
    iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

    修改自定义的链名称:
    iptables -E IN_WEB WEB

    删除自定义链:
    需要满足两个条件:
    1.自定义链表中没有被任何默认链引用,即自定义链的计数为0。
    2.自定义链中没有任何规则,则自定义链为空。
    iptabels -X IN_WEB

    清空自定义链表:
    iptables -filter -F IN_WEB

    开启核心转发功能:
    临时生效:
    1.修改文件:vi /proc/sys/net/ipv4/ip_forward #将里面的 0 修改为 1
    2.命令开启:sysctl -w net.ipv4.ip_forward=0
    永久生效:
    修改文件:centos7 中 配置文件 /usr/lib/sysctl.d/00-system.conf
    添加或者修改配置项: net.ipv4.ip_forward = 1 即可


    state 扩展模块:
    报文的 “连接状态”
    NEW:连接中的第一个包,状态都是 NEW ,我们可以理解新连接的第一个包状态为 NEW
    ESTABLISHED:我们可以把 NEW 状态包后面的状态理解为 ESTABLISHED ,表示连接已建立。
    RELATED:从字面理解 RELATED 译为关系。
    INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是 INVALID ,我们可以主动屏蔽状态为 INVALID 的包。
    UNTRACKED :报文的状态为UNTRACKED 时,表示报文未被追踪,当报文的状态为 UNTRACKED 时通常表示无法找到相关的连接。

    动作 REJECT :
    --reject-with
    使用--reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么会被拒绝
    可用值如下:
    icmp-net-unreacgable
    icmp-host-unreacgable
    icmp-port-unreachable
    icmp-proto-unreachable
    icmp-net-prohibited
    icmp-host-pro-hibited
    icmp-admin-prohibited
    当不设置任何值时,默认值为 icmp-port-unreachable

    iptables -I INPUT 1 -j REJECT --reject-with icmp-hots-unreachable

    动作LOG:
    log动作负责记录匹配到的报文的相关信息,不对报文进行其他处理
    iptables -I INPUT -p tcp --dport 22 -j LOG
    上述记录 发往22端口的报文相关信息记录在日志中
    默认日志文件:/var/log/messages
    修改保存日志记录文件位置:/etc/rsyslog.conf,添加 kern.warning /var/log/iptables.log

    LOG动作:
    --log-level 选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,warning,notice,info,debug
    -log-prefix 选项可以给记录的相关信息添加 “标签” 之类额的信息,以便区分各种记录的报文信息,方便在分析时进行过滤。对应的值不能超过29个字符。

    iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
    将主动连接22端口的报文的相关信息都记录在日志中。并且把这类记录命名为 want-in-from-port-22

    SNAT 动作:
    网络内部的主机可以借助 SNAT 隐藏自己的ip地址,同时还能共享合法的公网ip,让局域网的多台主机共享公网的ip地址访问互联网。
    相当于NAT功能的设备,iptables的SNAT动作就是达到目的。.

    iptables -t nat -A POSTROUTING - s 10.1.0.0/24 -j SNAT --to-source 192.168.5.138

    此规则表示将来自于10.1.0.0/24 网段的报文的源地址改为 192.168.5.138 。
    -t nat 表示操作 nat 表,filter 表的功能是过滤,nat 表的功能是地址转换。
    -A POSTROUTING 表示将 SNAT 规则添加到 POSTROUTING 链的末尾,在centos中,SNAT规则只能存在于POSTROUTING 链和 INPUT 链中,在centos 6中 ,SANT 规则只能存在于 POSTROUTINGl 链中。
    -s 10.1.0.1/24 表示报文源自于此网段。
    -j SNAT 表示使用 SNAT 动作 ,对匹配到的报文进行处理,对匹配到的报文进行源地址转换。
    --to-source 192.168.5.138 表示将匹配到的报文的源地址修改为192.168.5.138 。

    动作 DNAT:
    iptables -t nat -I PERTOUTING -d 192.168.5.136 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.5:3389

    -t nat -I PREROUTING : 表示在nat表中的PREROUTING 链中配置 DNAT 规则, DNAT 规则只配置在 PERROUTING 链与 OUTPUT 链中。
    -d 192.168.5.138 -p tcp --dport 3389 : 表示报文的目标地址为公司的公网ip地址。目标端口为3389端口。
    -j DNAT --to-destination 10.1.0.5:3389 表示将符合条件的报文进行 DNAT ,也就是目标地址转换,将符合条件的报文的目标地址与目标端口修改为 10.1.0.5:3389 ,--to-destination 就是动作 DNAT 的常用选项。
    如上所述,上图中定义的规则的含义为,当外网主机访问公司公网ip的3389端口时,将报文的目标地址与端口将会被映射到 10.1.0.5:3389 上。

    动作 MASQUERADE :
    也是源地址转换,MASQUERADE 不用指定明确的ip,会动态的将报文的源地址修改为指定网卡可用得IP地址。(例如拨号上网分配的动态IP)
    iptables -t nat -I POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
    指定 10.1.0.0/24 网段的报文源地址转换为 eth0 网卡的可用ip

    动作 REDIRECT :
    可以在本机进行端口映射
    比如将本机的80端口映射到本机的 8080 端口上
    iptables -t nat -A PREROUTING -p --dort 80 -j REDIRECT --to-ports 8080




    评论
    • 消灭零回复