iptables:新,已建立和相关数据包之间的区别


46

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

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

当我在线搜索时,我总是看到该规则中使用了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

有人可以向我解释什么时候恰好一个新数据包变为已建立和相关?

Answers:


46

在接收者接听电话之前,将新数据包视为电话呼叫。已建立的数据包是他们的“ Hello”。如果您要打电话告诉他们您将要发送给他们的电子邮件,则这是一个相关数据包。(相关电子邮件。)

如果我的类比不太好,我个人认为手册页可以很好地处理它:

NEW-表示数据包已开始新的连接,或者与未在两个方向上都看到数据包的连接相关联,并且

已建立-表示封包与已在两个方向上看到封包的连接相关联,

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

iptables(8)-Linux手册页


9
出于好奇,您知道它如何确定“相关”数据包吗?应用程序是否可以使用某种机制来向iptables发信号通知某个连接将是一个相关的连接,或者它仅仅是iptables的有状态部分的一部分?
马修·沙利

9
它由一系列名为ip_conntrack_ *的内核模块处理,每个模块都是为使用不相关连接(例如FTP)的特定协议编写的。为了回答您的问题,我认为您需要为您的应用程序加载一个类似的模块。
凯尔·史密斯

4
好的谢谢。但是回到带有NEW的规则,难道不能使数据包看起来像已经建立了,因此不受规则限制吗?
克里斯(Kris)2012年

2
@Kris:伪造传出的数据包非常困难,因此答案中手册页的措辞让我看不到。您是正确的,有可能伪造看起来像是一个开放连接的数据包,但是即使没有防火墙,如果TCP堆栈还不知道来自网络的开放连接,TCP堆栈也会将其丢在地板上。发件人。如果这是在路由器上防火墙,它仍然可能通过检查,以保持这种状态SYN/ ACK/ RST/等包原样通过路由器,和我期望iptables来做到这一点。
马修·沙利

2
@Kris:VNC软件(例如TeamViewer)使用类似于此的内容(尽管在技术上并不相同)来穿越防火墙/路由器。该过程称为打孔。简而言之,您有一台要从其他设备(通过Internet)连接到的主机PC(可能位于限制性防火墙之后)。两台PC都打开到单独服务器的单独连接(例如,TeamViewer服务器),它们在它们之间进行“调解”,因此它会像对待数据包一样查看其防火墙,从而使这些P​​C能够与每个PC建立单独的连接。其他。
Levit 2014年

14

为服务器和客户端同时假设一个限制性INPUT和开放性OUTPUT,即:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

iptables-extensions(8)到活动模式下的FTP示例:

1.新

NEW数据包已开始新的连接,或者与未在两个方向上都看到数据包的连接相关联。

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

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2.建立

已建立数据包与一个已在两个方向看到数据包的连接相关联。

现在,在客户端上,他开到服务器的端口的出站连接21使用本地端口50000和他所需要的下面的防火墙以允许从到达响应server (21)client (50000)

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3.相关

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

现在,在建立FTP连接并即将执行数据连接之后,客户端将在端口上打开服务器套接字(是的,活动的FTP客户端将成为数据连接的服务器)60000(据我所知,客户端将标记该端口)60000()RELATED中的其他连接50000->21,并将使用FTP PORT命令将此端口号发送到服务器。然后,FTP服务器将开放其港口一个新的连接20端口60000在客户端上,和好了,客户端现在需要以下允许这个新的连接成功:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

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

modprobe ip_conntrack_ftp

建立仅需要以前本地产生的单向流,而不需要TCP 3向握手,我的理解正确吗?
sdaffa23fdsf

感谢您的回答,对于建立的您说“ iptables允许响应从服务器(21)到达客户端(50000)”,如果它是从服务器到客户端,为什么它是INPUT而不是OUTPUT?
Medya

@Medya,因为从客户端的角度来看,从服务器(21)发送到客户端(50000)的数据包是传入数据包,因此对于客户端来说,它是一个INPUT
Jaime Hablutzel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.