zoukankan      html  css  js  c++  java
  • iptables

    一、简介

    netfilter/iptables(简称 iptables)组成 Linux 平台下的包过滤防火墙

    iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易

    netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集

    安装 iptables

    yum -y install iptables iptables-services
    

    重启:systemctl restart iptables
    保存:service iptables save

    二、常用参数

    iptables + -t 表名 + 规则/链管理参数 + 匹配参数 + 动作类型参数

    #  选择表
    -t	#  对指定表进行操作(必须是 raw、nat、filter、mangle 中的一个。如没有指定则默认为 filter表)
    
    #  规则管理
    -A	#  在指定规则链的末尾加入新规则
    -I	#  在指定规则链的头部加入新规则(默认在第一行添加)
    -D	#  删除指定链中的一条规则(可按规则序号和内容删除)
    -R	#  修改、替换指定链中的某一条规则(可按照规则序号和内容替换)
    
    #  链管理
    -P	#  设置指定链默认策略 
    -N	#  新建一条用户自己定义的规则链
    -X	#  删除指定表中用户自定义的规则链
    -E	#  重命名用户定义的链(不改变链本身)
    -Z	#  将所有表的所有链的字节和数据包计数器清零
    
    #  规则链
    INPUT		#  处理入站的数据包
    OUTPUT		#  处理出站的数据包
    FORWARD         #  处理转发的数据包
    PREROUTING	#  处理入站的路由规则
    POSTROUTING	#  处理出站的路由规则
    
    #  匹配(加感叹号 “!“表示这个目标除外(加感叹号后需加空格后在加匹配项))
    -s	#  匹配来源地址 IP/MASK
    -d	#  匹配目标地址
    -i	#  网卡名称(匹配从这块网卡流入的数据)
    -o	#  网卡名称(匹配从这块网卡流出的数据)
    -m	#  使用扩展模块
    -p	#  匹配协议(如:tcp、udp、icmp)
    	tcp     #  扩展选项:--source-port (扩展选项可用 iptables -p tcp -h 查看)
    	udp     #  扩展选项:--source-port (扩展选项可用 iptables -p icmp -h 查看)
    	icmp    #  可用扩展:  --icmp-type  (可用扩展可用 iptables -p icmp -h 查看)
    	--dport 80	#  匹配目标端口 80
    	--sport 81	#  匹配来源端口 81
    
    #  指定动作类型
    -j  #  指定动作类型
        动作类型:
        ACCEPT	#  允许数据包通过
        REJECT	#  拒绝数据包通过(必要时会发送响应信息)
        DROP	#  直接丢弃(不给出任何回应)
        QUEUE	#  中断过滤程序,将封包放入队列,交由其它程序处理
        RETURN	#  停止当前链中的后续规则,并返回到调用链(the calling chain)中
        REDIRECT	#  在本机上做端口映射
        DNAT	#  改变数据包的目的地址
        SNAT	#  改变数据包的源地址
        MASQUERADE	#  SNAT 的一种特殊形式,适用于动态、临时会变的 IP 上(只能用户 nat 表的 POSTROUTING 链)
        LOG		#  在 /var/log/messages 文件中记录日志信息,然后在将数据包传递给下一条规则
    
    #  查看/清空 规则
    -L	#  列出指定链中所有的规则
    -n	#  IP地址和端口会一数字的形式打印
    -v	#  详细输出
    -F	#  清空规则链
    

    三、扩展模块

    使用方法:iptables + -m + 扩展模块名
    可用扩展选项可用:iptables + -m + 扩展名 + -h 查看

    limit(速率限制)
    #  每分钟允许通过 5 个 icmp 包(默认为 3/小时,秒:/sec  分钟:/minute   小时:/hour  天:/day)
    iptables -A INPUT -p icmp -m limit --limit 5/minute -j ACCEPT
    #  每分钟允许通过 5 个 icmp 包,最多不超过 10 个
    iptables -A INPUT -p icmp -m limit --limit 5/minute --limit-burst 10 -j ACCEPT
    
    multiport( 多端口匹配)
    #  匹配 22,端口(最多可指定15个端口)
    iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
    
    iprange(匹配指定范围内的地址)
    #  匹配指定范围内的地址
    iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.0-192.168.1.111 --dport 22 -j ACCEPT
    
    string(字符串匹配)
    #  当服务端返回数据报文检查到有关键字 “test" 时,则丢弃该报文(能够检测到报文应用层中的字符串  注:该条规则需添加到 OUTPUT 链)
    iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "test" -j DROP
    
    connlimit(连接数限制)
    #  限制同一 IP 最多同时 10 个 http 连接
    iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
    #  限制每组 C 类 IP 最多同时 10 个 http 连接
    iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
    #  限制指定网段的 IP 最多同时 10 个 http 连接
    iptables -A INPUT -s 192.168.1.0/24 -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
    
    recent(时间限制)
    --name	        #  设置列表名称
    --resource	#  源地址
    --redest	#  目的地址
    --seconds	#  指定时间内(单位:秒)
    --hitcount	#  匹配次数
    --set		#  将地址添加进列表,并更新信息(包含地址加入的时间戳)
    --rcheck	#  匹配列表中的源地址(以第一个匹配计算时间)
    --update	#  类似 rcheck(以最后一个匹配计算时间)
    --remove	#  在列表里删除相应地址(后面接列表名称及地址)
    
    #  将访问的主机记录到 test 列表,并放行
    iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --set -j ACCEPT
    #  如访问的主机在 test 列表有记录则限制 80 端口 60 秒 内每个 IP 只能发起 20 个新的连接,超过则记录日志(日志前缀为 DDOS:)
    iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j LOG --log-prefix 'DDOS:' --log-ip-options
    #  如访问的主机在 test 列表有记录则限制 80 端口 60 秒 内每个 IP 只能发起 20 个新的连接,超过则丢包
    iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j DROP
    
    state(状态检查)
    NEW:新建立一个会话
    ESTABLISHED:已建立的连接
    RELATED:有关联关系的连接
    INVALID:无法识别的连接
    
    #  放行 ssh 的首次连接状态
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
    #  放行有关联的连接跟已建立的连接
    iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT
    

    四、规则表和规则链

    规则表(tables)

    规则表提供特定的功能(内置了4个表),类似用户组,每个组都有不同的功能,并且都有对应的用户(规则链)

    filter	#  负责过滤功能(内核模块:iptables_filter)
    nat     #  负责网络地址转换功能(内核模块:iptable_nat)
    mangle	#  拆解、修改、封装报文(内核模块;iptable_mangle)
    raw     #  决定数据包是否被状态跟踪机制处理内核(内核模块:iptable_raw)
    

    规则表优先顺序(从左往右):raw <--- mangle <--- nat <--- filter

    规则表对应的规则链:

    raw 表:PREOUTING、OUTPUT
    mangle 表:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
    nat 表:PREROUTING、INPUT、OUTPUT、POSTROUTING
    filter 表:INTPUT、FORWARD、OUTPUT
    

    规则链(chains)

    规则链是规则的集合。对特定的数据包设置相应的规则(读取规则链时是按照从上往下的顺序)

    INPUT		#  处理入站的数据包
    OUTPUT		#  处理出站的数据包
    FORWARD         #  处理转发的数据包
    PREROUTING	#  数据包进入路由表前
    POSTROUTING	#  数据包进入路由表后
    

    入站顺序(从左往右):PREROUTING <--- INPUT
    出站顺序(从左往右):OUTPUT <--- POSTROUTING
    转发顺序(从左往右):PREROUTING <--- FORWARD <--- POSTROUTING

    五、实例

    查看/删除规则
    iptables -L             #  列出所有规则
    iptables -L -nv		#  查看详细信息(IP 跟 端口会以数字形式显示)
    iptables -t nat -L      #  列出 nat 表中的所有规则
    iptables -t nat -L -nv  #  查看详细信息(IP 跟 端口会以数字形式显示)
    iptables -F             #  清除所有规则(如不指定表,则默认表为 filter)
    iptables -t nat -D INPUT 1  #  删除 nat 表 INPUT 链下的第一条规则
    
    在指定表中新建规则(如不指定,则默认为 filter 表)
    #  在 nat 表中开放 80 端口
    iptables -t nat -A INPUT -p tcp --dport 80 -j ACCEPT
    
    设置白名单
    #  允许 192.168.1.0/24 网段的主机访问
    iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT
    
    #  允许 192.168.2.0/24 网段的主机访问本机的 80 端口
    iptables -A INPUT -p all -s 192.168.2.0/24 --dport 80 -j ACCEPT
    
    指定范围
    #  指定 IP 范围
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
    #  指定端口范围
    iptables -t nat -A INPUT -p tcp --dport 90:100 -j ACCEPT
    
    端口映射
    #  当别的主机访问本地 80 端口时会被重定向到 8080 端口
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
    
    禁止
    #  禁 Ping
    iptables -A INPUT -p icmp -j DROP
    #  禁 Ping
    iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
    #  禁止 MAC 地址为 00:11:22:33:44:55 的主机访问
    iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP
    #  禁止转发 MAC 地址为 00:11:22:33:44:55 的主机的数据
    iptables -A FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROP
    
  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/anonymous-test/p/13865129.html
Copyright © 2011-2022 走看看