iptables-state-ftp介绍
原视频地址
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
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
3.3、安装ftp客户端(即,ftp命令)
在10.211.55.10虚拟机上
3.3.1、安装ftp客户端命令
yum install -y ftp
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
3.6.3、加载nf_conntrack_ftp内核模块
登录到10.211.55.20服务器上
modprobe nf_conntrack_ftp
3.6.4、如何移除nf_conntrack_ftp模块呢?
登录到10.211.55.20
modprobe -r nf_conntrack_ftp
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条规则:
- 针对的是客户端向服务器发起远程登录时,
- 服务器端接收到的第1个数据包,此时的数据包状态定义为NEW
- 第2条规则:
- 针对的是,被动模式下,由客户端主动向服务器端发起的新的链接,此链接专门用于传输数据;
- 由于此链接是在第一个链接的影响下产生的,因此,创建新的链接时的第一个数据包的状态为RELATED
- 第3条规则:
- 第1个链接里第1个数据包的状态为NEW,该连接里后续数据包的状态就是ESTABLISHED;
- 第1个链接,一般称为控制链接,专门用来传输FTP命令的;如PASV,PORT,USER
- 第4条规则:
- 在被动模式下,客户端给服务器端反馈的ACK,SYN,FIN类型的数据包
针对的是服务器端数据包出站的防火墙规则
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条规则:
- 针对的是主动模式,在建立数据链接时,服务器端传输给客户端的第1个数据包,此数据包的状态被称为RELATED
- 防火墙的规则是:匹配目的地址是客户端的IP,tcp协议,状态是RELATED,满足这些条件的数据包,就可以通过,否则拒绝通过
- 第2条规则:
- 该规则其实并不起作用,可以删除。
- 针对的是服务器端向客户端主动发起新的链接时,传输的第1个数据包。
- 实际情况是,服务器端不会主动向客户端发起新的链接
- 第3条规则:
- 针对的是服务器端向客户端传输数据包,
- 此类数据包的状态被称为ESTABLISHED
查看当前filter表下的链情况
3.8、测试上传文件是否能获取到数据包的状态
先查看filter表,初始状态情况
3.8.1、客户端远程登录时iptables规则匹配情况
接下来,登录到服务器端,再次查看一下防火墙规则情况
3.8.2、在服务器端10.211.55.20上使用tcpdump命令抓取客户端远程登录服务器端时发送的数据包,进行分析一下
3.8.3、将ftp-login.icmp使用Wireshark软件进行分析
从这里可以看出来,一共抓取了15个数据包
序号是1的数据包的状态为 new
第1个数据包中的S Y N 表示同步信号标志,
其实,就是客户端将自己的一些信息告诉服务器端,让服务器端知道客户端的基本情况,如客户端的端口,窗口大小等等
第2个数据包的S Y N,也是表示同步,将服务器端的一些信息告诉客户端,如服务器端最终能接收的数据量大小等等。
第2个数据包中的A C K ,表示服务器端已经接收到客户端的同步数据,给客户端的反馈。
第3个数据包中的A C K,表示客户端已经收到服务器端的同步信息,是对服务器端信息的确认。
前三个数据包是TCP的三次握手协议,其实,就是双方将自己的能力告诉对方,不要越界。
3.8.4、被动模式下
默认情况下,使用的是被动模式。
在客户端10.211.55.10上
在登录到服务器端,查看filter表下,数据包都匹配到了哪些规则,
可以先执行
iptables -Z
将统计数据清零。
这样,新的统计数据基本上都是受put 22.txt的影响产生的了
上传22.txt文件,整个过程消耗了14个数据包
在服务器端一侧,使用tcpdump命令,抓取响应的数据包
到目前为止,我们分析了
- 远程登录命令时,哪些数据包匹配到了哪些规则
- 上传文件时,哪些数据包匹配到了哪些规则,
明白了一点:
- 第1个链接里,第一个数据包的状态为NEW, 该连接里后续的数据包状态为ESTABLISHED
- 第2个链接里(由第1个链接影响产生),第一个数据包的状态为RELATED,该连接后续的数据包状态也为ESTABLISHED
3.8.5、主动模式下
如何在被动模式下,转换为主动模式呢?
其他,包的分析方式,跟上一样。
分析每个命令产生的影响,向将数据统计清零,再操作。