• iptables 之 state模块(ftp服务练习)


    1、state扩展模块是用来做什么的?

    有些场景下,我们要能够识别出报文是主机主动发送出去的,还是主机被动接收的;

    因此,需要给报文添加上一些状态;

    防火墙可以根据数据包的状态,添加更加详细、有效的防火墙规则。

    2、state定义了数据包哪些状态?

    只关心用户层面,不考虑内核层。

    在用户层面,定义了4种状态:

    • NEW 状态
      • 此数据包表明,该连接是新的连接;
      • 可能是第一次建立连接
      • 也可能是重新进行连接
      • 或者链接重定向
    • ESTABLISHED 状态
      • 此数据包是某个已经建立起链接的数据包
      • 就是说,链接已经建立起来了,除了第1个数据包外,后续发送的数据包的状态都是 ESTABLISHED
    • RELATED 状态
      • 举个例子说明:
        • FTP有两个链接:一个是传输控制命令的链接,一个是传输数据的链接。
      • 先建立起的链接是传输控制命令的链接,
      • 然后,由于链接里的某个命令,需要创建一个新的链接,
      • 那么这个新的链接里的第1个数据包的状态就是RELATED状态
      • 新连接后续的数据包的状态也是 ESTABLISHED 状态
    • INVALID 状态
      • 数据已经破损,
      • 此数据包不属于某个链接
      • 这些数据包一般被DROP掉了。

    3、使用FTP来练习state扩展模块

    3.1、测试环境说明

    在这里插入图片描述

    在Mac环境上使用PD创建两个虚拟机,系统是centos7.5

    左边的虚拟机,用于安装vsftpd服务,IP是10.211.55.20

    右侧的虚拟机,用户安装ftp命令客户端,IP是10.211.55.10

    整个过程,会创建两个链接:

    • 一个链接专门用于传输命令
    • 一个链接专门用于传输数据(比方说,传输具体的文件)

    3.2、安装ftp服务器端(即,vsftpd服务)

    在10.211.55.20虚拟机上

    3.2.1、安装vsftpd服务

    yum install -y vsftpd
    
    • 1

    3.2.2、修改配置文件,使得远程可以通过root命令进行登录

    3.2.2.1、修改/etc/vsftpd/vsftpd.conf

    在这里插入图片描述

    3.2.2.2、修改/etc/vsftpd/ftpusers

    在这里插入图片描述

    3.2.3、启动vsftpd服务

    systemctl start vsftpd
    systemctl status vsftpd
    
    • 1
    • 2

    3.3、安装ftp客户端(即,ftp命令)

    在10.211.55.10虚拟机上

    3.3.1、安装ftp客户端命令

    yum install -y ftp
    
    • 1

    3.3.2、测试一下

    在这里插入图片描述

    3.4、介绍一下ftp服务的两种传输模型

    3.4.1、ftp服务的两种模型

    • 被动模式
    • 主动模式

    3.4.2、如何区分被动模式和主动模式呢?

    主要是根据:传输数据的链接是由客户端主动发起的,还是由服务器端主动发起的 来进行判断。

    • 被动模式下
      • 客户端发起PASV命令;
      • 服务器端会将自己专门用于传输数据的端口发送给客户端
      • 客户端主动发起新的链接,此链接专门用来传输数据;如,传输文件
      • 一般情况下使用被动模式多些
    • 主动模式
      • 客户端发起PORT命令;
      • 通过PORT命令告诉服务器端,客户端传输数据的端口是多少
      • 由服务器端主动发起新的链接,此链接专门用来传输数据;如,传输文件
      • 此种方式不安全,因为客户端一般不受防火墙控制,此端口不安全

    总之:

    • 由客户端主动发起的新的链接是被动模式
    • 由服务器端主动发起的新的链接是主动模式

    3.4.3、被动模式PASV传输流程图

    在这里插入图片描述

    3.4.4、主动模式PORT传输流程图

    在这里插入图片描述

    3.5、如何编写iptables命令呢?

    同样,先拿出数据包的流向图来

    在这里插入图片描述

    根据上面的图进行分析

    首先,明确一点,在10.211.55.20上编写iptables规则

    本次测试不涉及到数据包的转发,因此,不考虑FORWARD链

    对入站和出站的数据包进行过滤,只有满足目标状态的数据包才能放行;

    因此,选择的是filter表下的INPUT链和OUTPUT链

    3.6、如何抓取到RELATED状态的数据包呢?(需要加载能获取RELATED状态的内核模块)

    3.6.1、为什么要加载nf_conntrack_ftp内核模块?

    为了获取RELATED状态的ftp的数据包,需要加载特定的内核模块nf_conntrack_ftp。

    nf_conntrack_ftp模块应该针对的是ftp服务的RELATED状态的获取;

    应该不适用于其他服务的RELATED状态获取;

    在centos7.5系统下,该内核模块没有默认加载,因此,需要提前加载。

    3.6.2、查看是否存在nf_conntrack_ftp

    登录到10.211.55.20服务器上

    lsmod | grep nf_conntrack_ftp
    
    • 1

    3.6.3、加载nf_conntrack_ftp内核模块

    登录到10.211.55.20服务器上

    modprobe nf_conntrack_ftp
    
    • 1

    3.6.4、如何移除nf_conntrack_ftp模块呢?

    登录到10.211.55.20

    modprobe -r nf_conntrack_ftp
    
    • 1

    在这里插入图片描述

    3.7、开始编写iptables规则

    登录到10.211.55.20虚拟机上

    在这里插入图片描述

    针对的是数据包入站的iptables规则

    iptables -A INPUT -d 10.211.55.20 -p tcp --dport 21 -m state --state NEW -j ACCEPT
    
    iptables -A INPUT -d 10.211.55.20 -p tcp -m state --state RELATED -j ACCEPT
    
    iptables -A INPUT -d 10.211.55.20 -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT
    
    iptables -A INPUT -d 10.211.55.20 -p tcp ! --dport 22 -m state --state ESTABLISHED -j ACCEPT
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    规则说明:

    • 第1条规则:
      • 针对的是客户端向服务器发起远程登录时,
      • 服务器端接收到的第1个数据包,此时的数据包状态定义为NEW
    • 第2条规则:
      • 针对的是,被动模式下,由客户端主动向服务器端发起的新的链接,此链接专门用于传输数据;
      • 由于此链接是在第一个链接的影响下产生的,因此,创建新的链接时的第一个数据包的状态为RELATED
    • 第3条规则:
      • 第1个链接里第1个数据包的状态为NEW,该连接里后续数据包的状态就是ESTABLISHED;
      • 第1个链接,一般称为控制链接,专门用来传输FTP命令的;如PASV,PORT,USER
    • 第4条规则:
      • 在被动模式下,客户端给服务器反馈的ACK,SYN,FIN数据包

    针对的是数据包出站的iptables规则

    iptables -A OUTPUT -d 10.211.55.10 -p tcp -m state --state RELATED -j ACCEPT
    
    iptables -A OUTPUT -d 10.211.55.10 -p tcp -m state --state NEW -j ACCEPT
    
    iptables -A OUTPUT -d 10.211.55.10 -p tcp -m state --state ESTABLISHED -j ACCEPT
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看当前filter表下的链情况
    在这里插入图片描述

    3.8、测试上传文件是否能获取到数据包的状态

    先查看filter表,初始状态情况

    在这里插入图片描述

    3.8.1、客户端远程登录时iptables规则匹配情况

    在这里插入图片描述

    在这里插入图片描述

    3.8.2、在服务器端10.211.55.20上使用tcpdump命令抓取数据包,进行分析一下

    在这里插入图片描述

    3.8.3、将ftp-login.icmp使用Wireshark软件进行分析

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    3.8.4、被动模式下

    默认情况下,使用的是被动模式。

    在客户端10.211.55.10上
    在这里插入图片描述

    在登录到服务器端,查看filter表下,数据包都匹配到了哪些规则,
    可以先执行

    iptables -Z
    
    • 1

    将统计数据清零。

    这样,新的统计数据基本上都是受put 22.txt的影响产生的了

    在这里插入图片描述

    上传22.txt文件,整个过程消耗了14个数据包

    在服务器端一侧,使用tcpdump命令,抓取响应的数据包
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    到目前为止,我们分析了

    • 远程登录命令时,哪些数据包匹配到了哪些规则
    • 上传文件时,哪些数据包匹配到了哪些规则,

    明白了一点:

    • 第1个链接里,第一个数据包的状态为NEW, 该连接里后续的数据包状态为ESTABLISHED
    • 第2个链接里(由第1个链接影响产生),第一个数据包的状态为RELATED,该连接后续的数据包状态也为ESTABLISHED

    3.8.5、主动模式下

    如何在被动模式下,转换为主动模式呢?

    在这里插入图片描述

    在这里插入图片描述

    其他,包的分析方式,跟上一样。

    分析每个命令产生的影响,向将数据统计清零,再操作。

  • 相关阅读:
    【洛谷 P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题解(模拟+向量)
    CS5801|替代LT6711A|HDMI转DP转接线方案|HDMI转DP带供电芯片方案
    基于SpringBoot的招聘网站
    # Maven错误Error executing Maven
    Spring(四)- Spring配置非自定义Bean
    CodeTON Round 6 (Div 1 + Div 2, Rated, Prizes!)(A - E)
    C++是如何从代码到游戏的
    vue3解决elementPlus table组件数据量大时的卡顿问题
    多线程概述
    【机器学习】决策树
  • 原文地址:https://blog.csdn.net/u011582922/article/details/125417161