iptables:“-p udp --state已建立”


18

让我们看一下这两个iptables规则,这些规则通常用于允许传出DNS:

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数据包?(如果我不小心尝试在该时间范围内在该端口上启动服务,将会发生什么情况?该尝试会被拒绝/阻止吗?)

请在上面的文本中找到所有错误:-)谢谢,

克里斯

Answers:


12

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

我非常确定对于UDP,源端口和目标端口以及地址都已存储。

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

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

由于您正在使用OUTPUT和INPUT,因此您正在谈论本地服务。该端口已被使用我不相信您的系统会允许您启动另一个服务,因为某些内容已经在该端口上进行监听。我想如果您确实愿意,可以停止第一个服务,然后再启动另一个服务,在这种情况下,响应可能会到达您的服务。服务对数据包的处理方式取决于数据包的内容以及服务的内容。


因此,如果我开始在端口8080上说一个Tomcat实例,那么如果偶然在同一端口上运行DNS查询,我将有1:(65535-1023)的机会启动失败?还是只是等到时间表到期?默认情况下,时间表是多长时间?
克里斯·勒彻

6
在Linux上,我相信临时端口范围通常为32768-61000(请参阅/ proc / sys / net / ipv4 / ip_local_port_range),其中不会包括示例端口8080。设置服务以侦听端口通常非常罕见在短暂范围内。的时间在表中的一个条目UDP状态通常为30秒(见的/ proc / SYS /净/网络过滤/ nf_conntrack_udp_timeout)
Zoredache

2
+1感谢,尤其是/ proc路径!
克里斯·勒彻

1
如果有人希望延长udp_timeout,请使用echo "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran

8

注意:此答案已被编辑。

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

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

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

另请参阅此相关问题


1
我知道我也应该允许TCP。但是“相关”对UDP意味着什么?联机帮助页:“相关意味着数据包正在启动新连接,但与现有连接相关联,...” UDP连接?也许确实比ESTABLISHED更有意义,但这是我想发现的。
克里斯·勒彻

当我使用您的规则,但将udp INPUT限制为RELATED时,我的DNS查询不起作用。似乎我必须允许建立。是否有任何理由也允许RELATED(用于UDP)?
克里斯·勒彻

好的,似乎ESTABLISHED的意义远超出手册页所说的。无论如何,如果您使用像我的这样的OUTPUT过滤器并且不接受无约束的流量,那么该INPUT规则就是您唯一需要的规则。
Alnitak

1
根据我们发现的情况,相关的udp数据包不存在AFAIK。但是(例如),如果您曾经从该框中执行出站 FTP,则需要数据通道的RELATED状态规则。单个“ ESTABLISHED,RELATED”规则是AFAIK最佳的入口流量单个规则。
Alnitak

1
实际上,RTP 可能存在RELATEDUDP数据包。
Alnitak

1

iptables开发人员认为,无论两个客户端之间的协议如何,都可以在两个方向上看到数据包的情况是“已建立”状态。

状态扩展名是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状态。

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.