Iptables:“-p udp --state ESTABLISHED”

Iptables:“-p udp --state ESTABLISHED”

让我们看看这两个常用于允许传出 DNS 的 iptables 规则:

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

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

我的问题是:我到底应该如何理解 UDP 中的 ESTABLISHED 状态?UDP 是无状态的。

这是我的直觉——我想知道这是否不正确或者哪里不正确:

手册页告诉我这一点:

状态

此模块与连接跟踪结合使用时,允许访问
此数据包的连接跟踪状态。

  - 状态 ...

因此,iptables 基本上会记住用于传出数据包的端口号(对于 UDP 数据包它还能记住什么?),然后允许在短时间内发回的第一个传入数据包?攻击者必须猜测端口号(那真的太难了吗?)

关于避免冲突:

内核会跟踪哪些端口被阻止(被其他服务或以前传出的 UDP 数据包阻止),以便这些端口不会在时间范围内用于新的传出 DNS 数据包?(如果我意外地尝试在时间范围内启动该端口上的服务,会发生什么情况 - 该尝试会被拒绝/阻止吗?)

请找出以上文字中的所有错误:-)。

答案1

因此,iptables 基本上会记住用于传出数据包的端口号(对于 UDP 数据包,它还能记住什么?),

我非常确定 UDP 的源和目标端口和地址都已存储。

如果您想检查状态表,请安装 conntrack 和/或 netstat-nat。

(如果我意外地尝试在时间范围内启动该端口上的服务,会发生什么情况 - 该尝试会被拒绝/阻止吗?)

由于您使用的是 OUTPUT 和 INPUT,因此您谈论的是本地服务。端口已被使用,我认为您的系统不会允许您启动另一个服务,因为某些服务已经在侦听该端口。我想,如果您真的想这样做,您可以停止第一个服务并启动另一个服务,在这种情况下,响应可能会到达您的服务。服务对数据包的操作取决于数据包的内容以及它是什么服务。

答案2

注意:该答案已被编辑。

尽管手册页上说了什么,但ESTABLISHED似乎意味着“有状态”。对于 UDP,这仅仅意味着(如您所建议的)记住每个出站 UDP 数据包(“源 ip、源端口 目标 ip、目标端口”三元组)一段时间并识别其响应。

仅供参考,我对 DNS 流量的正常规则如下:

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

即控制OUTPUT链上的流量,然后让iptables状态模块处理链上的所有其他事情INPUT

也可以看看这个相关问题

答案3

iptables 开发人员认为,无论两个客户端之间的协议是什么,当在两个方向上都可以看见数据包时,就会出现“ESTABLISHED”状态。

状态扩展是 conntrack 的一部分。内核通过表来理解状态

/proc/net/nf_conntrack

从发送方角度看,表 nf_conntrack 中 UDP 的 iptable 状态示例。假设您在 UDP 上发送 DNS 查询

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

数据包已发送。它未回复,哦,表中有预期返回的数据(DNS 应答的数据包)。

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

回复已到达,未回复标志消失,这意味着此 UDP 连接在系统定义的一小段时间内处于 ESTABLISHED 状态。

答案4

这是关于 UDP 的一个常见误解,大多数人会混淆无状态和无连接。UDP 是无连接的,但其会话存储在 TCPIP 堆栈的会话表中,iptables 和 conntrack 也使用该会话表。

相关内容