iptables:“-p udp --state ESTABLISHED”

Chr*_*her 20 domain-name-system linux iptables udp

让我们看看这两个经常用于允许传出 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
Run Code Online (Sandbox Code Playgroud)

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

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

手册页告诉我:

状态

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

  - 状态 ...

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

关于避免冲突:

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

请找出以上文本中的所有错误:-) 谢谢,

克里斯

Zor*_*che 12

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

我很确定 UDP 存储了源和目标端口和地址。

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

(如果我不小心尝试在时间范围内在该端口上启动服务会发生什么 - 该尝试会被拒绝/阻止吗?)

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

  • 在 Linux 上,我相信临时端口范围通常是 32768-61000(请参阅 /proc/sys/net/ipv4/ip_local_port_range)这不包括您的示例端口 8080。设置服务以侦听端口往往非常不常见短暂的范围内。表中 UDP 条目状态的时间通常为 30 秒(请参阅 /proc/sys/net/netfilter/nf_conntrack_udp_timeout) (6认同)
  • +1 谢谢,尤其是 /proc 路径! (2认同)
  • 如果有人希望延长 udp_timeout,请使用 `echo "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf` (2认同)

Aln*_*tak 8

注意:此答案已被编辑。

尽管手册页说了什么,ESTABLISHED似乎意味着“有状态”。对于 UDP,这只是意味着(如您所建议的)记住每个出站 UDP 数据包(“src ip, src port dst ip, dst port”元组)一段时间并识别其响应。

FWIW,我对 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
Run Code Online (Sandbox Code Playgroud)

即控制OUTPUT链上的流量,然后让iptables状态模块处理INPUT链上的其他一切。

另请参阅此相关问题