让我们看看这两个经常用于允许传出 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 数据包?(如果我不小心在该时间范围内尝试在该端口上启动服务,会发生什么 - 该尝试会被拒绝/阻止吗?)
请找出以上文本中的所有错误 :-) 谢谢,
克里斯
我很确定对于 UDP,源和目标端口和地址都已存储。
如果要检查状态表,请安装 conntrack 和/或 netstat-nat。
由于您使用的是 OUTPUT 和 INPUT,因此您正在谈论本地服务。该端口已被使用我不相信您的系统将允许您启动另一个服务,因为某些东西已经在该端口上侦听。我想如果你真的想的话,你可以停止第一个服务并启动另一个服务,在这种情况下,响应可能会到达你的服务。服务对数据包做什么取决于数据包的内容是什么,以及它是什么服务。
注意:此答案已被编辑。
尽管手册页说了什么,但
ESTABLISHED
似乎意味着“有状态”。对于 UDP,这只是意味着(如您所建议的)记住每个出站 UDP 数据包(“src ip,src port dst ip,dst port”元组)一段时间并识别其响应。FWIW,我对 DNS 流量的正常规则是这样的:
即控制
OUTPUT
链上的流量,然后让iptables
状态模块处理INPUT
链上的所有其他事情。另请参阅此相关问题。
iptables 开发人员认为“ESTABLISHED”状态是指无论两个客户端之间的协议如何,都可以在两个方向上看到数据包的情况。
状态扩展是 conntrack 的一部分。内核从表中理解状态
从发送者的角度来看,表 nf_conntrack 中 UDP 的 iptable 状态示例。假设您在 UDP 上发送 DNS 查询
已发送数据包。它没有回复,哦,该表包含预期返回的数据(DNS 应答的数据包)。
回复到达,未回复标志消失,这意味着此 UDP 连接在您系统中定义的一小段时间内处于 ESTABLISHED 状态。
这是对 UDP 的一个常见误解,大多数人对 STATE-LESS 和 CONNECTION-LESS 感到困惑。UDP 是无连接的,但它的会话存储在 TCPIP 堆栈的会话表中,iptables 和 conntrack 使用相同的会话表。