让我们看看这两个常用于允许传出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数据包? (如果我在一定的时间内意外尝试在该端口上启动服务,会发生什么情况 – 这种尝试会被拒绝/阻止吗?)
请在上面的文本中find所有错误:-)谢谢,
克里斯
因此,iptables基本上记住了用于外出数据包的端口号(还有什么可以记住的UDP数据包?),
我很确定UDP的源和目标端口和地址是存储的。
如果你想检查状态表安装conntrack和/或netstat-nat。
(如果我在一定的时间内意外尝试在该端口上启动服务,会发生什么情况 – 这种尝试会被拒绝/阻止吗?)
由于您正在使用OUTPUT和INPUT,所以您正在讨论本地服务。 该端口已被使用我不相信你的系统将允许你启动另一个服务,因为有东西已经在该端口上监听。 我想如果你真的想要的话,你可以停止第一个服务,然后开始另一个服务,在这种情况下,响应可能会得到你的服务。 该服务对数据包的处理取决于数据包的内容,以及它是什么服务。
注意:这个答案已被编辑。
尽pipe手册页说了什么, ESTABLISHED
似乎意味着“有状态的”。 对于UDP来说,只是意味着(如你所build议的)记住每个出站UDP数据包(“src ip,src port dst ip,dst port”元组),并识别它的响应。
FWIW,我对DNSstream量的正常规则是这样的:
# 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
链上的stream量,然后让iptables
状态模块处理INPUT
链上的所有其他事情。
另请参阅这个相关的问题 。
iptables开发者已经考虑到“ESTABLISHED”状态是在两个客户端之间的任何协议的两个方向上看到分组的情况。
状态扩展是conntrack的一部分。 内核从表格中了解状态
/proc/net/nf_conntrack
从发送者的angular度来看表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连接在系统中定义的less量时间处于ESTABLISHED状态。