iptables:NEW、ESTABLISHED 和 RELATED 数据包之间的区别

Kri*_*ris 61 firewall iptables packet

服务器上防火墙的一部分:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP
Run Code Online (Sandbox Code Playgroud)

当我在线搜索时,我总是看到该规则中使用了 NEW,但我很难理解为什么没有使用 ESTABLISHED 和 RELATED。

像这样 :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释什么时候新数据包完全变为 ESTABLISHED 和 RELATED 吗?

Aar*_*ley 60

将新数据包视为接收方接听之前的电话呼叫。一个 ESTABLISHED 数据包是他们的“你好”。如果您打电话告诉他们您将要向他们发送的电子邮件,则相关数据包将是。(电子邮件是相关的。)

如果我的类比不是很好,我个人认为手册页处理得很好:

NEW——意味着数据包已经开始了一个新的连接,或者与一个在两个方向都没有看到数据包的连接相关联,和

ESTABLISHED——意味着数据包与一个在两个方向都看到数据包的连接相关联,

RELATED -- 意味着数据包正在启动一个新连接,但与现有连接相关联,例如 FTP 数据传输或 ICMP 错误。

iptables(8) - Linux 手册页

  • 出于好奇,您知道它如何确定 RELATED 数据包吗?应用程序是否可以使用某种机制向 iptables 发出信号,表明连接将是相关连接,还是纯粹是 iptables 的有状态部分的一部分? (15认同)
  • 它由一系列称为 ip_conntrack_* 的内核模块处理,每个模块都是为使用不相关连接(例如 FTP)的特定协议编写的。要回答您的问题,我认为您需要为您的应用程序加载一个类似的模块。 (11认同)
  • 好的谢谢。但是回到带有 NEW 的规则,是不是可以使数据包看起来像是已经建立并且因此不被规则阻止? (4认同)
  • @Kris:TeamViewer 等 VNC 软件使用类似的东西(尽管技术上不相同)来通过防火墙/路由器进行隧道传输。该过程称为**打孔**。简而言之,您有一台主机 PC(可能位于限制性防火墙后面),您希望从不同的设备(通过互联网)连接到它。两台 PC 都打开与单独服务器(例如 TeamViewer 服务器)的单独连接,该服务器在它们之间进行“调解”,因此它们的防火墙看起来好像数据包是相关的,因此这些 PC 能够与每个 PC 建立单独的连接其他。 (3认同)
  • @Kris:伪造传出数据包非常困难,因此根据答案中手册页的措辞,我不知道如何。您是正确的,可以伪造一个看起来像是绑定到开放连接的数据包,但是即使没有防火墙,如果 TCP 堆栈还不知道来自发件人。如果这是在路由器的防火墙上,仍然可以通过在通过路由器时检查`SYN`/`ACK`/`RST`/etc 数据包来保持这种状态,我希望 iptables 能够做到这一点。 (2认同)
  • 考虑到解析高层(例如应用程序)中较低层的通信细节的协议,例如 FTP,正变得“过时”,并且“相关”状态为可能的漏洞利用打开了许多大门(*例如,如果您提到的特定于应用程序的模块,找出给定应用程序的“相关”意味着什么,其中有错误,然后可以利用该错误*)可以肯定地说,默认情况下应该**不* * 允许相关连接,除非协议有问题(然后只允许该协议的“相关”)? (2认同)

Jai*_*zel 20

假设服务器和客户端都具有限制性INPUT和开放性OUTPUT,即:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
Run Code Online (Sandbox Code Playgroud)

来自iptables-extensions(8)在主动模式下的 FTP 示例:

1. 新

NEW 数据包已经开始了一个新的连接,或者与一个在两个方向都没有看到数据包的连接相关联。

端口上的客户端50000(任何随机的非特权端口)连接到端口上的 FTP 服务器21,服务器至少需要这个来接受这个传入的连接:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

2. 成立

ESTABLISHED 数据包与在两个方向都看到数据包的连接相关联。

现在在客户端,他21使用本地端口在端口上打开了到服务器的传出连接50000,他需要以下 iptables 以允许响应从server (21)to到达client (50000)

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

3. 相关

RELATED 数据包正在启动一个新连接,但与现有连接相关联,例如 FTP 数据传输或 ICMP 错误。

现在在建立 FTP 连接并且即将执行数据连接后,客户端将在端口上打开一个服务器套接字(是的,活动的 FTP 客户端成为数据连接的服务器)60000(据我了解,客户端将标记此端口)60000至于RELATED来自50000->21)的另一个连接,并将使用 FTPPORT命令将此端口号发送到服务器。然后 FTP 服务器将打开一个从其端口2060000客户端端口的新连接,那么,客户端现在需要以下内容才能使这个新连接成功:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

最后,要使其正常工作,您需要启用ip_conntrack_ftp内核模块以允许系统将连接/包标记为RELATED(这是我的理解,我没有深入研究):

modprobe ip_conntrack_ftp
Run Code Online (Sandbox Code Playgroud)