Answers:
Radhil过于谨慎地删除了他的回复,虽然需要整合,但这是正确的。
首先,规则的字面含义:它丢弃(-j DROP)所有开始新连接的数据包(-m state --state NEW),这些数据包不属于TCP协议的SYN类型(! - syn)( - p tcp)。
然后几点评论。在TCP协议中,连接由三个包(SYN(客户端到服务器) - > SYN / ACK(服务器到客户端) - > ACK(客户端到服务器))的仪式交换启动。不是由SYN数据包发起的连接,就像上面的iptables规则所引发的连接一样,是建立连接的不正确方法,这种连接追求不同的目标,正如radhil正确指出的那样。
此规则经常被错误地认为是必要的,以抑制Web上的同步泛滥攻击:例如,请参阅此网页,其中明确说明:
下一个要拒绝的模式是同步泛滥攻击。
iptables -A INPUT -p tcp!--syn -m state --state NEW -j DROP
SYN-Flood-Attacks意味着攻击者打开一个新连接,但没有说出他们想要的东西(即SYN,ACK等等)。他们只是想占用我们服务器的资源。我们不接受此类套餐。
当然,通过接受(!!!!)SYN数据包用于新连接来尝试消除syn-flood攻击是没有意义的。它应该是数据包,而不是包。
同步洪水攻击确实带来了一些尚未完全解决的问题。这导致开发了一个名为SYNPROXY的新iptables模块,您可以在此处讨论。通常使用速率限制,例如参见此处,但是这确实引起了前面引用中提到的问题,即 conntrack模块,它是跟踪哪些连接是新的以及哪些连接是旧的以及在哪种状态下完美运行所必需的。对于有限数量的连接,但在连接数增加时消耗不成比例的时间(例如,由于SYN泛洪攻击)。这就是可伸缩性问题的含义。
总而言之,我并不完全清楚上面的iptables规则有任何有意义的目的。
-A INPUT
- 附加到“INPUT”链的末尾
-p tcp
- 匹配TCP协议
! --syn
- 匹配没有TCP SYN标志的数据包
-m state
- 使用“状态”模块(不建议使用;新规则集应使用“conntrack”代替)
--state NEW
- 匹配具有“NEW”状态的数据包(即不属于任何已建立的连接)
-j DROP
- 跳转到“DROP”目标(这是丢弃数据包的最终目标)
基本上TCP数据包要么打开一个新连接(并且始终具有SYN标志),要么属于现有连接,要么尝试关闭中止连接(使用RST标志),或者是垃圾。因此,此规则尝试丢弃最后一个类别中的数据包,这些数据包既不会尝试打开新连接也不属于现有连接。
恕我直言这有点多余......也许它应该防止各种奇怪的portscan类型(如nmap中所示)。也可能只是偏执狂。