运维安全05 - iptables规则保存与恢复

发布于:2025-09-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

网络安全

昨日功能优化

配置后引发的问题:

配置iptables后防火墙起到了防护作用,但使用127.0.0.1访问不了数据库了

[root@localhost /]# mysql -u admin -p -h 127.0.0.1
Enter password:

思考:如果使用localhost可以访问吗? 是什么原因?

localhost127.0.0.1 的区别

  • localhost:通常被解析为127.0.0.1,但它的访问方式不使用网卡,不受防火墙和网卡限制。它通过内存中的套接字(socket)进行通信。

  • 127.0.0.1:是一个具体的IP地址,访问时会通过网卡传输数据,受防火墙和网卡设置的限制。

当设置了iptables规则后,这些规则可能会影响网络流量,特别是针对特定IP地址或端口的流量。

  • 使用127.0.0.1无法登录:

    • 当您尝试通过127.0.0.1连接MySQL时,数据包会通过网卡发送,并受到iptables规则的检查。如果iptables规则中包含了阻止127.0.0.1访问MySQL端口(通常是3306)的规则,那么连接就会被拒绝。

  • 使用localhost可以登录:

    • 使用localhost连接MySQL时,数据不会通过网卡传输,而是直接在内存中通过套接字进行通信,因此不受iptables规则的影响。这样即使iptables有阻止127.0.0.1的规则,也不会影响到localhost的连接。

配置iptables解决问题:

[root@localhost /]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost /]# iptables -A OUTPUT -o lo -j ACCEPT
​
# 查看规则
[root@localhost /]# iptables -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
1153 68876 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
   4   176 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
   0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
​
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
​
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 630 49672 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:22
  24  1056 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80
   0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0      
 

iptables -A INPUT -i lo -j ACCEPT

允许所有从本地回环接口(lo)进入本机的网络流量。简单来说,就是让本机可以接收来自自己内部的服务请求。

iptables -A OUTPUT -o lo -j ACCEPT

允许所有通过本地回环接口(lo)向外发送的网络流量。也就是说,让本机能正常回应自己内部发出的请求。

再次测试mariadb

[root@localhost /]# mysql -u admin -p -h 127.0.0.1
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.68-MariaDB MariaDB Server
​
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
MariaDB [(none)]>

规则的保存与恢复

配置的防火墙规则如果不保存,在重启之后规则需要重新配置,规则的保存命令如下:

# 将规则保存到etc/iptables-script
[root@localhost ~]# iptables-save > /etc/iptables-script
 
# 恢复规则
[root@localhost ~]# iptables-restore /etc/iptables-script

安全加固

配置 MariaDB 以允许远程主机访问数据库服务,并通过防火墙规则进一步限制只有特定 IP 范围的客户端可以访问。

# 配置mariadb允许远程访问
MariaDB [mysql]> grant all privileges on *.* to 'admin'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
​
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

此操作虽然开放了远程访问权限,但并没有限制具体的访问源 IP。

如果仅需要特定 IP 可以访问,应将 % 替换为具体的 IP 或子网(如 'admin'@'192.168.114.0/24')。

# 配置防火墙规则,允许访问3306
[root@localhost ~]# iptables -A INPUT -p tcp --dport 3306 -m iprange --src-range 192.168.114.100-192.168.114.150 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 3306 -m iprange --dst-range 192.168.114.100-192.168.114.150 -j ACCEPT

iptables -A INPUT -p tcp 允许指定 IP 范围访问 MariaDB 端口(3306)

iptables -A OUTPUT -p tcp 允许 MariaDB 向指定 IP 范围发送响应数据

注意事项

  1. 最小权限原则:不要随意使用 GRANT ALL PRIVILEGES,应根据实际需求授予最小权限。

  2. IP 白名单限制:尽量避免使用 admin@%,改为使用 admin@192.168.114.0/24 等方式限制具体来源。

  3. 保存防火墙规则:执行完 iptables 命令后,使用 service iptables saveiptables-save > /etc/iptables/rules.v4 保存规则,防止重启后失效。

状态过滤

状态过滤(Stateful Packet Inspection,SPI)是一种防火墙技术,它不仅检查数据包的头部信息(如源IP、目标IP、端口号等),还会跟踪和维护连接的状态信息。

通过这种方式,它可以更智能地判断数据包是否合法,从而提高安全性。

假设已经配置了以下基本的 iptables 规则:

# 允许 80 端口的入站(INPUT)流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
​
# 允许 80 端口的出站(OUTPUT)流量
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
​
# 默认拒绝所有其他入站流量
iptables -P INPUT DROP
iptables -P OUTPUT DROP

思考配置存在的问题

步骤 数据方向 源 IP:端口 目标 IP:端口
1. 请求发起 客户端 → 服务器 192.168.1.10:54321 203.0.113.45:80
2. 响应返回 服务器 → 客户端 203.0.113.45:80 192.168.1.10:54321

但这只是“无状态”的规则 —— 它不会区分这个流量是否是主动发起连接后返回的响应。

情况:A服务器不能远程访问其他服务器资源

A服务器主动连接C服务器

  • A服务器 主动向 C服务器 的 80 端口发起HTTP请求。

  • 源端口 是 5623(一个非特权端口),目标端口 是 80

  • 连接被 拒绝。

问题:

  • iptables 规则中,只允许目标端口为 80 的入站流量,但没有明确允许从 A服务器 发起的出站流量。

  • 因此,即使 A服务器 使用非特权端口(如 5623)发起请求,这个连接也会被默认的 DROP 策略拒绝。

那能不能将5623设置为开放呢? 同学们请思考:

当服务器(或客户端)主动发起一个 TCP 连接时(比如访问网页、API 等),它会使用一个 临时非特权端口(ephemeral port)作为源端口。

这些端口通常在 Linux 上是范围在 32768 到 60999 或 49152 到 65535 之间(不同系统略有差异)。

所以每次建立新连接时,源端口都可能是不同的,而且是非特权端口。

如果想让从A服务器主动发起访问外部 80 端口的服务,并能接收到响应

# 允许主动发起访问远程 80 端口的请求
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
​
# 允许远程服务器返回给的响应数据包进来
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
[ 本地程序 ]
|
| 使用 TCP 协议发起请求
| 源地址: 192.168.1.10:5623
| 目标地址: 203.0.113.45:80
v
[ OUTPUT 链 - 出站规则 ]
|
| 检查 iptables 规则:
| -A OUTPUT -p tcp --dport 80 -j ACCEPT
| 匹配目标端口为 80 → 放行
v
[ 发送请求到远程服务器 ]
|
| 数据包到达远程 Web 服务器
| Web 服务器处理请求并准备返回响应
v
[ 远程 Web 服务器发送响应 ]
|
| 源地址: 203.0.113.45:80
| 目标地址: 192.168.1.10:5623
v
[ INPUT 链 - 入站规则 ]
|
| 检查 iptables 规则:
| -A INPUT -p tcp --sport 80 -j ACCEPT
v
[ 响应数据包交付给本地程序 (端口 5623) ]

情况:A服务器不能ping其他服务器 (同理)

情况:B服务器与A服务器之间的正常通信

B服务器 向 A服务器 的 80 端口发起请求,源端口 是 6534

A服务器 响应 B服务器,源端口 是 80,目标端口 是 6534

连接成功(绿色箭头)。

情况:黑客可以通过自己的80端口,连接A服务器中的一个随机端口

当从 A 服务器访问一个 Web 服务器(如 B 服务器的 http://b.example.com:80),通信过程如下:

步骤 数据包方向 源端口 目标端口
1. A 发起请求 A → B 随机非特权端口(如 54321) 80
2. B 返回响应 B → A 80 54321

当我们在上面设置针对80的过滤规则之后,就会出现问题

  1. IP欺骗:黑客构造一个TCP/IP数据包,并将该数据包的源IP地址设置为目标服务器信任的另一台服务器的IP地址。这样做的目的是让目标服务器误以为收到的数据包是来自一台它信任的机器。

  2. 端口伪装攻击:在上述的基础上,黑客进一步将源端口设为80(HTTP服务的默认端口)或其它常见的、被允许通过防火墙的服务端口。许多网络管理员会开放这些端口以确保正常的服务通信,但这同样可能成为攻击者的入口。

  3. 绕过防火墙规则:如果防火墙规则配置不当,例如仅基于目的端口(--dport)或者源端口(--sport)进行过滤,而没有考虑连接的状态或其他安全策略,那么黑客就有可能通过这种方式发送恶意流量并成功绕过防火墙限制。

处理方案:tcp协议标记位

使用tcp协议的标记位,阻止从外部进来的第一次握手请求

[root@localhost ~]# iptables -I INPUT -p tcp -m tcp --sport 80 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j DROP
​
# 简化写法,只检查SYN标记位
[root@localhost ~]# iptables -I INPUT -p tcp -m tcp -sport 80 --sync -j DROP
​
# 但这样做也是有问题的,比如协议时UDP是没有标记位的,无法通过标记位去判断来自外部的第一次请求

TCP 是面向连接的协议,通信前需要建立连接,过程如下:

  1. 客户端 → 服务端:SYN(同步标志位)=1

  2. 服务端 → 客户端:SYN=1, ACK=1

  3. 客户端 → 服务端:ACK=1

所以:

  • 第一次握手:只有 SYN=1

  • 后续才是 SYN+ACKACK

如果黑客试图伪装成 Web 服务器,主动发起连接(比如想攻击本地的 SSH、MySQL 等服务),他会发送一个 SYN 包,源 IP 和源端口伪造为可信服务器的 80 端口。

通过上面的规则:

  • 只拦截 SYN 请求(也就是“主动发起连接”的请求)

  • 不影响正常的响应流量(因为正常响应是 SYN,ACK 或者只是 ACK

这样就能有效防止黑客伪装成 Web 服务器发起连接请求。

UDP 没有 TCP 的标记位,所以不能使用 --syn 这类判断。

UDP 是无连接协议,没有三次握手,所以这类规则对 UDP 无效。

有些合法服务可能会从源端口 80 发起连接,如果不加区分地丢弃所有来自源端口 80 的 SYN 请求,可能会导致某些正常连接失败。

处理方案:state扩展

对于静态的无状态的防火墙,将每个数据包都看作是独立的数据包,并不知道数据包之间的关系,

使用 state扩展,可以分析出数据包之间的关系,不再将每个数据包只看做孤立的,

所以使用了state扩展后 netfilter可以用作有状态防火墙,相对于无状态防火墙,有状态防火墙可以定义更加精准的过滤条件。

state 说明
NEW 新创建连接的数据包。这是指那些试图建立新连接的初始数据包,通常包含TCP三次握手的第一个SYN包。
ESTABLISHED 已连接状态下的数据包。这些是已经成功建立连接后,在连接中传输的数据包,包括正常的数据交换和ACK确认等。
RELATED 新建的,且与现有连接相关的数据包,典型的如ICMP数据包,FTP数据传输数据包。这类数据包虽然不是直接属于某个已建立的连接,但与之相关联,例如FTP的控制连接和数据连接、ICMP错误消息等。
INVALID 没有与现有连接相关的数据,像一匹孤狼,直接DROP。这类数据包无法被识别为任何已知连接的一部分,可能是由于网络错误、攻击或配置问题导致的无效数据包,通常会被丢弃以防止潜在的安全威胁。

NEW:当一个数据包试图建立一个新的连接时,它会被标记为NEW。例如,当使用浏览器访问一个网站时,计算机发送的第一个SYN包就是NEW状态。

ESTABLISHED:一旦连接成功建立,后续在这个连接中传输的所有数据包都会被标记为ESTABLISHED。这包括从网站下载的数据、向网站发送的请求等。

RELATED:有些数据包虽然不是直接属于某个已建立的连接,但与之相关联。例如,当使用FTP下载文件时,除了控制连接外,还会有一个数据连接用于实际的数据传输,这个数据连接的数据包就会被标记为RELATED。再比如,ICMP错误消息也是与某个已建立的连接相关的,因此也会被标记为RELATED

INVALID:如果一个数据包无法被识别为任何已知连接的一部分,它就会被标记为INVALID。这种情况可能是由于网络错误、攻击或配置问题导致的。为了安全起见,这类数据包通常会被直接丢弃(DROP)。

使用state扩展来配置防火墙

配置之前,无法ping外部主机

[root@localhost ~]# ping 192.168.114.1
PING 192.168.114.1 (192.168.114.1) 56(84) bytes of data.
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作

结果显示 ping 操作被拒绝,提示“不允许的操作”。这表明当前的网络策略或防火墙设置阻止了 ICMP 请求。

无法访问外部 web 服务

这个执行之前请去除源端口80规则(讲解A-C的时候设置的)

[root@localhost ~]# wget www.baidu.com
--2021-08-18 17:16:26--  http://www.baidu.com/
正在解析主机 www.baidu.com (www.baidu.com)... 失败:未知的名称或服务。
wget: 无法解析主机地址 “www.baidu.com”

配置 state 扩展

[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

这里添加了两条 iptables 规则来配置状态扩展模块:

INPUT 链规则:允许所有已建立(ESTABLISHED)和相关联(RELATED)的入站数据包通过。

这意味着任何与现有连接相关的数据包都会被接受,例如响应数据包、ICMP 错误消息等。

OUTPUT 链规则:允许所有新建(NEW)、已建立(ESTABLISHED)和相关联(RELATED)的出站数据包通过。

这意味着新的连接请求、现有连接的数据传输以及与现有连接相关的数据包都会被接受。

配置后,验证

可以执行 ping

[root@localhost ~]# ping 192.168.114.1
PING 192.168.114.1 (192.168.114.1) 56(84) bytes of data.
64 bytes from 192.168.114.1: icmp_seq=1 ttl=128 time=0.165 ms

配置完成后,再次尝试使用 ping 命令访问外部 IP 地址 192.168.114.1

这次成功收到了回应,显示 ICMP 数据包已经能够正常发送和接收,说明出站和入站的 ICMP 流量已经被允许。

可以访问外部资源

[root@localhost ~]# wget www.baidu.com
--2021-08-18 17:22:34--  http://www.baidu.com/
正在解析主机 www.baidu.com (www.baidu.com)... 14.215.177.39, 14.215.177.38
正在连接 www.baidu.com (www.baidu.com)|14.215.177.39|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2381 (2.3K) [text/html]

配置完成后,再次尝试使用 wget 命令访问百度网站 www.baidu.com

这次成功解析了主机地址并建立了连接,收到了 HTTP 200 OK 响应,说明出站和入站的 HTTP 流量已经被允许,可以正常访问外部 Web 服务。

配置时需要注意规则的顺序,如果将新加的state扩展规则,放到了前面,则可能回造成远程客户机 不能访问本地web服务的问题。

nmap扫描

C:\Users\lisensir>nmap -sS -O 192.168.114.140
Starting Nmap 7.92 ( https://nmap.org ) at 2021-08-18 17:44 中国标准时间
Nmap scan report for 192.168.114.140
Host is up (0.00044s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT       STATE    SERVICE
22/tcp     open     ssh
80/tcp     closed   http
3306/tcp   closed   mysql
MAC Address: 00:0C:29:BC:31:9A (VMware)
Device type: general purpose
Running: Linux 3.x|4.x
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop

更严谨一些的方式

# 1. 允许 TCP 协议、源端口为 1024-65535 的出站流量(NEW, ESTABLISHED, RELATED)
iptables -A OUTPUT -p tcp -m multiport --sports 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
​
# 2. 允许 UDP 协议、源端口为 1024-65535 的出站流量(NEW, ESTABLISHED, RELATED)
iptables -A OUTPUT -p udp -m multiport --sports 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
​
# 3. 允许 ICMP 协议的出站流量(NEW, ESTABLISHED, RELATED)
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
​
# 4. 允许所有已建立和相关连接的入站流量
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

第一个: 允许TCP协议的出站流量,满足以下条件:

  • 源端口在 1024 到 65535 范围内(即非特权端口,客户端常用)

  • 并且连接状态是:新建 (NEW)、已建立 (ESTABLISHED) 或相关 (RELATED)

客户端发起请求时,通常使用随机非特权端口(如浏览器访问网页、curl、wget 等),这些端口一般都在 1024~65535

  • 使用 -m multiport --sports 可以限制只放行这类客户端使用的源端口。

  • 结合状态模块,确保只放行合法的新建连接或已有连接的后续通信。

用途:允许本机主动发起 TCP 连接(如访问 Web、SSH、数据库等)

第二个: 允许UDP协议的出站流量,满足以下条件:

  • 源端口在 1024~65535

  • 连接状态是:新建、已建立或相关

解释:

  • 与第一条类似,但适用于 UDP 协议(如 DNS 查询、NTP 时间同步、VoIP 等)

  • UDP 是无连接协议,但仍可通过状态模块追踪会话

用途:允许本机主动发起 UDP 请求(如解析域名)

第三个: 允许ICMP协议(如 ping)的出站流量

  • 连接状态为:新建、已建立或相关

解释:

  • ICMP 不涉及端口,所以不需要用到 multiport 模块

  • 放行 ICMP 流量是为了允许执行 pingtraceroute 等网络诊断命令

用途:允许本机使用 ping 和 traceroute 等工具测试网络连通性

第四个: 允许所有已建立连接和相关连接的入站流量

解释:

  • 这是最关键的一条安全规则!

  • 当服务器主动发起一个请求(如访问某个网站、更新系统包),远程服务器会返回响应数据包,这些响应包进入服务器时走的是 INPUT 链。

  • 如果不放行这些响应数据包,就收不到任何回复。

  • 使用状态模块可以自动识别哪些是“自己发起的连接”的返回数据包,并安全地放行它们。

用途:让服务器能正常接收自己请求的响应(比如 curl 返回结果)

FTP的防火墙配置

FTP分为主动模式和被动模式。

在主动模式下ftp服务器防火墙配置

# 允许入站的TCP连接到端口21(FTP控制端口),状态为NEW或ESTABLISHED时接受
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
​
# 允许出站的TCP连接,源端口为21,目标端口在1024-65535之间,状态为ESTABLISHED时接受
iptables -A OUTPUT -p tcp --sport 21 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
​
# 允许入站的TCP连接到端口20(FTP数据端口),状态为ESTABLISHED时接受
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
​
# 允许出站的TCP连接,源端口为20,目标端口在1024-65535之间,状态为NEW或ESTABLISHED时接受
iptables -A OUTPUT -p tcp --sport 20 --dport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

功能:允许入站的TCP连接到端口21(FTP控制端口)。

说明:当客户端尝试与FTP服务器建立新的连接(NEW)或者已经建立了连接(ESTABLISHED)时,允许这些连接通过防火墙。这是为了确保客户端能够成功地连接到FTP服务器并进行命令交互。

iptables -A OUTPUT -p tcp --sport 21 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

功能:允许出站的TCP连接,源端口为21,目标端口在1024-65535之间,状态为ESTABLISHED时接受。

说明:当FTP服务器响应客户端请求时,它会从端口21发送数据到客户端的高随机端口(1024-65535)。这条规则确保了这些响应数据包能够顺利通过防火墙返回给客户端。

iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT

功能:允许入站的TCP连接到端口20(FTP数据端口),状态为ESTABLISHED时接受。

说明:在主动模式下,FTP服务器会使用端口20来传输数据。这条规则确保了当数据传输已经开始(ESTABLISHED)时,数据包能够顺利通过防火墙到达客户端。

iptables -A OUTPUT -p tcp --sport 20 --dport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT

功能:允许出站的TCP连接,源端口为20,目标端口在1024-65535之间,状态为NEW或ESTABLISHED时接受。

说明:在主动模式下,FTP服务器会从端口20发起新的数据传输连接(NEW)或者继续已有的数据传输(ESTABLISHED)。这条规则确保了这些数据传输连接能够顺利通过防火墙。

在设置客户端防火墙时,比较麻烦: 在入站规则中,服务器的20端口号需要对客户机的一个随机的非特权端口发起连接请求。为方便客户机设置,出现了被动模式。

在被动模式下ftp服务器防火墙配置

# 1. 允许 FTP 控制连接(端口 21)
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
​
# 2. 允许 FTP 被动模式使用的端口范围(5000-5100)
iptables -A INPUT -p tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 5000:5100 -m state --state ESTABLISHED -j ACCEPT
​
# 3. 允许 FTP 主动模式下的数据连接(服务器端口 20)
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
​
# 4. 允许客户端发起的数据连接(客户端使用随机非特权端口)
iptables -A INPUT -p tcp --sport 1024:65535 --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1024:65535 --sport 20 -m state --state ESTABLISHED -j ACCEPT

连接跟踪助手(了解即可)

它是 Netfilter(即 iptables/nftables)框架下的一个模块,专门用于跟踪 FTP 协议的连接状态,尤其是被动模式下由服务器主动打开的额外数据连接。

若使用连接跟踪模块(nf_conntrack_ftp):

对于主动模式:

ftp服务器20端口号连接客户端特定端口号的第一次握手信息(SYN)将被连接跟踪模块视为相关性的 (RELATED),客户端的返回的(SYN,ACK)就是已连接(ESTABLISHED)的。

对于被动模式:

客户端主动发起连接到ftp服务器的第一次握手信息(SYN)将被连接跟踪模块视为相关性的 (RELATED),ftp服务器的返回(SYN,ACK)则为已连接的(ESTABLISHED)

[root@localhost ~]# modprobe nf_conntrack_ftp
[root@localhost ~]# modinfo nf_conntrack_ftp
filename:       /lib/modules/3.10.0-1160.15.2.e17.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko.xz
alias:          nfct-helper-ftp
alias:          ip_conntrack_ftp
description:    ftp connection tracking helper
author:         Rusty Russell <rusty@rustcorp.com.au>
license:        GPL
retpoline:      Y
rhelversion:    7.9
srcversion:     F21861D5AD43080B93CC4DD
depends:        nf_conntrack
intree:         Y
vermagic:       3.10.0-1160.15.2.e17.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        02:FB:1B:20:B0:39:E3:CD:C7:59:93:8B:A9:58:53:84:81:77:80:31
sig_hashalgo:   sha256
parm:           ports:array of ushort
parm:           loose:bool
[root@localhost ~]#

实验过程

安装vsftp服务器

停用firewalld

使用nmap扫描,查看没有设置防火墙的情况

首先设置防火墙允许22端口号,否则没法使用远程客户端

[root@localhost /]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost /]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

设置默认规则,除明确允许的端口,禁止其他所有的端口

[root@localhost /]# iptables -P INPUT DROP
[root@localhost /]# iptables -P OUTPUT DROP

允许客户端发起到ftp服务器21命令端口号的连接

[root@localhost /]# iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED \
> -j ACCEPT -m comment --comment "ftp21命令端口"
# 允许外部客户端通过 TCP 协议访问本机的 FTP 控制端口(21),无论是新发起的连接还是已经建立的连接。
​
[root@localhost /]# iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT \
> -m comment --comment "ftp21端口出站"
# 允许本机 FTP 服务通过 TCP 端口 21 发送响应数据包,但只允许那些属于已建立连接的流量,防止非法出站行为。

主动模式下,允许服务器从20端口发起数据连接

[root@localhost /]# iptables -A OUTPUT -p tcp --sport 20 -m state --state RELATED,ESTABLISHED \
> -j ACCEPT -m comment --comment "允许ftp20端口出站"
# 允许服务器通过端口 20 向客户端发送数据包,但只允许那些属于已有 FTP 控制连接(端口 21)或其关联连接的数据包通过,确保安全性。
​
[root@localhost /]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED \
> -j ACCEPT -m comment --comment "允许ftp服务器20端口进站"
# 允许客户端通过端口 20 向服务器发送数据包,但仅限于已经建立的 FTP 连接(控制通道),从而防止非法访问。

被动模式下,允许客户端连接ftp服务器的非特权端口

# 被动模式:允许客户端连接服务器的 5000~5100 端口
iptables -A INPUT -p tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT \
    -m comment --comment "允许FTP被动模式连接"
​
# 允许服务器响应客户端
iptables -A OUTPUT -p tcp --sport 5000:5100 -m state --state ESTABLISHED -j ACCEPT \
    -m comment --comment "允许FTP被动模式响应"

加载连接助手

[root@localhost /]# modprobe nf_conntrack_ftp
[root@localhost vsftpd]# setenforce 0

网站公告

今日签到

点亮在社区的每一天
去签到