Loading

Linux进阶(一)

架构图

image

IPtables

  • 简介

    IPtablesLinux防火墙工具,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构;防火墙是干什么的呢?防止别人恶意访问,为了保证安全而存在;IP tables是上架构图中的“冰山一角”~

    image

    网络从设备驱动进入,往上走,netfilter是网络安全框架用于过滤,hook勾子函数!

    • 防火墙的分类

      防火墙种类 名称
      硬件防火墙 [F5](F5设备_百度百科 (baidu.com))
      软件防火墙 iptables 和 firewalld
      云服务防火墙 安全组
    • 包过滤防火墙

      • 包:数据传输过程,并不是一次性传输完成的,而是将数据分成若干个数据包,一点一点传输;类似看视频,加载的缓存,不是一次性将视频加载出来,而是一点一点加载;
      • 包过滤防火墙:过滤数据包的防火墙
    • Iptables如何过滤

      iptables通过四表五链过滤各种规则

    • “四表”

      filter、nat、mangle、raw

      表名 作用 与链的关系
      filter表 过滤数据包 INPUT、OUTPUT、FORWARD
      Nat表 用于网络地址转换(IP、端口) PREROUTING、INPUT、OUTPUT、POSTROUTING
      Mangle表 修改数据包的服务类型、TTL、并且可以配置路由实现QOS PREROUTING、INPUT、OUTPUT、POSTROUTING、FORWARD
      Raw表 决定数据包是否被状态跟踪机制处理 PREROUTING、OUTPUT
    • “五链”

      PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING

      链名 处理机制
      INPUT链 进来的数据包应用此规则链中的策略
      OUTPUT链 外出的数据包应用此规则链中的策略
      FORWARD链 转发数据包时应用此规则链中的策略
      PREROUTING链 主机外报文进入位置,所有的数据包进来的时侯都先由这个链处理,允许的表mangle, nat(目标地址转换,把本机地址转换为真正的目标机地址,通常指响应报文)
      POSTROUTING链 报文经过路由被转发出去,所有的数据包出来的时侯都先由这个链处理,允许的表mangle,nat(源地址转换,把原始地址转换为转发主机出口网卡地址)
    • Iptables流程

      完整流程

      image

      经常用filter和nat,filter和nat 版

      image

      如果有网络A,和网络B,或需要AB中间网络转换,运用上述流程该如何走?如下:

      image

IPtables的使用

  • Iptables安装

    • 查看是否安装了iptables:systemctl status iptables
    • 安装iptables:yum install iptables* -y
    • 启动iptables:systemctl start iptables
    • 关闭防火墙: systemctl disable --now firewalld
    • 关闭selinux:vim /etc/selinux/config
      image
  • Iptables 命令说明

    • 格式:iptables [-t 表名] [参数 链名] [参数 协议] [参数 端口] [参数 动作]
    • 参数:
      参数符号 说明
      -t 指定操作的表
      -L 列出当前的规则
      -v 显示数据包和数据包大小
      -n 不反解地址
      -A 追加一条规则到链中
      -I 插入一条规则,插入到顶部
      -F 清空
      -Z 清空计数器(包数量 、包大小)
      -D 删除链中的规则
      -R 修改规则
      -S 列出所有的规则
      -N 创建一个自定义链
      -X 删除一个自定义链
      -P 指定链的默认策略
    • ” 动作 “ 表如下:
      “动作名” 说明
      ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链
      REJECT 拦阻该数据包,并传送数据包通知对方
      DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
      REDIRECT 将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则
    • iptables使用协议表如下:
      条件/协议名 说明
      TCP 按TCP协议匹配,http归属到TCP中
      UDP 按UDP协议匹配
      ICMP 按ICMP协议匹配,类似ping
      ALL 所有协议都可以
    • 端口搭配参数
      参数 说明
      --sport 源端口,发送请求的端口
      --dport 目标端口,访问的端口
    • -i,-o,-m,-j,-s,-d参数,可以指定网卡,模块,动作,协议,地址
      参数 说明
      -i 进来的网卡
      -o 出去的网卡
      -m 指定模块
      -j 执行的动作(上表)
      -p 指定协议
      -s 源地址,发送请求的地址
      -d 目标地址,访问的地址
    • Iptables常用命令
      • iptables -h 查询帮助
      • iptables -L -v 列出(filter表)所有规则
      • iptables -L -n 列出(filter表,默认的)所有规则(区别-v,-n是不反解版)
      • iptables -L -n -t nat 列出(nat表)所有规则
      • iptables -F 清除(filter表)所有规则
      • iptables -F -t nat 清除(nat表)中所有规则
      • service iptables save 保存配置(保存配置后必须重启iptables)
      • systemctl restart iptables 重启
    • Iptables常用语法
      • -A:追加到规则的最后一条
      • -D:删除记录
      • -I:添加到规则的第一条
      • -p:(proto)规定通信协议,常见的协议有:tcp、udp、icmp、all
      • -j:(jump)指定要跳转的目标,常见的目标有:ACCEPT(接收数据 包)、DROP(丢弃数据包)、REJECT(重定向)三种,但是一 般不适用重定向,会带来安全隐患
    • 案例

      案例1:只允许22端口(目标端口)可以访问,其他端口全部无法访问
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
      [root@m01 ~]# iptables -L -v
      # 查看(结果太长不写了)
      [root@m01 ~]# iptables -L -v
      
      案例2:只允许22,80,443端口可以访问(目标端口),其他端口全部无法访问。 
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 80  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 443  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP   -j DROP
      # 这时获取百度就响应超时了,不知道curl的端口
      [root@m01 ~]# curl www.baidu.com
      curl: (7) Failed connect to www.baidu.com:80; Connection timed out
      
      案例3:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。 
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 80  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 443  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
      
      案例4:要求能够通过22端口(目标端口)去链接地址192.168.15.81(目标地址),但是其他的不行
      # 通俗理解:通过22端口可以连接到192.168.15.81地址,192.168.15.81:22
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22  -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
      # 可以通过新开窗口测试,或者新开虚拟机测试	
      
      案例5:要求地址192.168.15.71(源地址)允许通过22端口(目标端口)连接地址192.168.15.81(目标地址),其他不行
      [root@m01 ~]# iptables -t filter -A INPUT -p  TCP -s 192.168.15.71  -d 192.168.15.81 --dport 22 -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
      # 可以从71去连接81,81已经断开
      
      案例6:要求192.168.15.71对外部不可见
      [root@prometheus ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP
      # 相当于虚拟机里的这个地址对外不可见,会连接不上虚拟机
      
      案例7:要求使用eth0网卡的所有请求全部拒绝(进来的网卡,连接虚拟机)
      [root@prometheus ~]# iptables -t filter -A INPUT -p TCP -i etho -j DROP
      案例8:使用eth1网卡登录进来的窗口,不允许访问百度。(出去的网卡,连接虚拟机)
      [root@prometheus ~]# iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP
      
      案例9:要求访问服务器的8080端口转发至80端口
      [root@m01 ~]# iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80
      
      案例10:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
      # 先查看windows下的地址:ipconfig > WMnet8 >IPV4地址
      [root@m01 ~]# iptables -t filter -I INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
      [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j DROP
      
      
      # IP过滤
      # 禁止192.168.1.3 IP地址的所有类型数据访问
      iptables -A INPUT ! -s 192.168.1.3 -j DROP
      
      # 开放80端口
      iptables -A INPUT -p tcp --dport 80 -j ACCEPT #开放80端口
      
      # 开放端口范围
      iptables -I INPUT -p tcp --dport 22:80 -j ACCEPT #开发22-80范围的端口
      
      # 不允许80端口流出
      iptables -I OUTPUT -p tcp --dport 80 -j DROP
      
      # filter是默认的表,可以不指定,也可以指定
      
    • 模块

      -m:指定模块

      • multiport模块

        连续匹配多个端口

        • 参数:--dports 的意思是指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)
          # 案例:要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝
          [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
          [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
          
      • iprange模块

        指定一段连续的ip地址范围

        • 参数:
          • --src-range from[-to]:源地址范围
          • --dst-range from[-to]:目标地址范围
          # 案例:要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
          [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT 
          [root@m01 ~]# iptables -t filter -A INPUT -p TCP -j DROP
          
      • string模块

        匹配指定字符串

        • 参数
          • --string pattern :指定要匹配的字符串
          • --algo {bm|kmp} :匹配的查询算法
            # 案例:要求访问数据包中包含HelloWorld的数据不允许通过
            [root@m01 ~]# cd /usr/share/nginx/html/
            [root@m01 html]# rm -rf ./*
            [root@m01 html]# echo "Helloworld" > index.html
            [root@m01 html]# echo "Hello" > demo.html
            
            # 规则
            [root@m01 html]# iptables -t filter -A INPUT -p TCP -m string --string "Helloworld" --algo kmp -j DROP
            
            [root@m01 html]# curl http://192.168.15.81/demo.html
            Hello
            [root@m01 html]# curl http://192.168.15.81/index.html
            
            
            # Helloworld被过滤掉了
            
      • time模块

        根据时间段匹配数据包

        • 参数:
          • --timestart hh:mm[:ss] :开始时间
          • --timestop hh:mm[:ss] : 结束时间
          • --monthdays day[,day...] : 指定一个月的某一天
          • --weekdays day[,day...] : 指定周 还是 周天
            # 案例: 要求每天的22到23之间,不允许访问
            [root@m01 ~]# iptables -t filter -A INPUT -p TCP -m time --timestart 14:00  --timestop 15:00 -j DROP
            
            # 注意这里使用的时间是UTC,记得-8
            
      • icmp模块

        禁ping, 默认本机无法ping别人 、别人无法ping自己

        • 参数:--icmp-type
          • echo-request (8) 请求
          • echo-reply (0) 回应
          # 要求别人不能ping本机,但是本机可以ping别人(优化上普通案例3)
          [root@m01 ~]# iptables -t filter -A INPUT -p ICMP -m icmp --icmp-type "echo-request" -j DROP
          # 本机ping百度
          [root@m01 ~]# ping www.baidu.com
          PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
          64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=128 time=15.1 ms
          # 别人不能ping本机
          [root@m01 ~]# ping 192.168.15.81
          PING 192.168.15.81 (192.168.15.81) 56(84) bytes of data.
          
      • connlimit模块

        限制链接数,并发连接数

        • 参数
          • --connlimit-upto n : 如果现有连接数小于或等于 n 则 匹配
          • --connlimit-above n : 如果现有连接数大于n 则匹配
            # 要求主机连接最多有2个(最多开两个窗口)
            [root@m01 ~]# iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP
            
            image
      • limit模块

        针对 报文速率 进行限制; 秒、分钟、小时、天。

        • 参数
          • --limit rate[/second|/minute|/hour|/day] :报文数量
          • --limit-burst number :报文数量(默认:5)
            # 案例 :要求限制速率在500k/s左右,大约每秒为333个数据包
            # 生成一个测试文件
            [root@m01 ~]# dd if=/dev/zero of=a.txt bs=100M count=10
            10+0 records in
            10+0 records out
            1048576000 bytes (1.0 GB) copied, 7.64477 s, 137 MB/s
            # 限速(控制是不准确的!)
            [root@m01 ~]# iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT
            [root@m01 ~]# iptables -t filter -A OUTPUT -p TCP -j DROP
            
            # 传输
            [root@m01 ~]# scp a.txt root@192.168.15.71:/root
            
            传输是不准确的,慢慢在降低,直到稳定!
            image
    • 补充知识

      • 查看centos版本

        cat    /etc/redhat-release
        
      • 查看本机端口占用的命令

        [root@m01 ~]# netstat -nutlp
        Active Internet connections (only servers)
        Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
        tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1591/nginx: master  
        tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1304/sshd           
        tcp6       0      0 :::80                   :::*                    LISTEN      1591/nginx: master  
        tcp6       0      0 :::22                   :::*                    LISTEN      1304/sshd 
        
      • iptables脚本设置

        #!/bin/sh
        iptables -P INPUT ACCEPT
        iptables -F
        iptables -X
        iptables -Z
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A INPUT -p tcp --dport 22 -j ACCEPT
        iptables -A INPUT -p tcp --dport 21 -j ACCEPT
        iptables -A INPUT -p tcp --dport 80 -j ACCEPT
        iptables -A INPUT -p tcp --dport 443 -j ACCEPT
        iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
        iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -P INPUT DROP
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD DROP
        service iptables save
        systemctl restart iptables.service
        
      • 补充案例

        如果日志文件/var/logmessages出现:kernel:nf_conntrack:table full,droppint packet,解决办法如下:
        # 上述的结果会让业务访问的很慢
        net.nf_conntack_max = 250000000
        net.netfilter.nf_conntrack_max = 250000000
        # 响应时间调短
        net.netfilter.nf_conntrack_timeout_established = 170
        net.netfilter.nf_conntrack_timeout_wait = 120
        net.netfilter.nf_conntrack_timeout_close_wait= 60
        net.netfilter.nf_conntrack_timeout_fin_wait = 100
        
posted @ 2022-10-02 18:42  爱learn  阅读(48)  评论(0编辑  收藏  举报