我的数据库服务器上的 iptables 规则是:
-A INPUT -p tcp --dport 6432 -s 10.115.0.150 -j ACCEPT
我有其他规则(环回等),但我想知道该特定规则是否可以被“破解”。有人可以“欺骗” IP 地址吗(即使它是私有网络地址 - 而且,如果它是公共地址,它会有所不同)?有什么不同吗?
答案1
Iain 的回答总体上是正确的,但需要稍微扩展一下来解释为什么这次袭击将很难实施。
TCP 使用基于位的标志和 32 位计数器(称为序列号和确认号)的组合来驱动状态机,该状态机在整个 TCP 连接生命周期内跟踪连接进度。了解这两个 32 位计数器如何在每次 TCP 连接中传输有效载荷数据之前的三次握手中发挥作用,将使使用伪造的源 IP 地址进行攻击的不切实际变得清晰起来。
当客户端发起与远程服务器的 TCP 连接时,它会发送一个设置了 SYN 位且具有随机选择的初始序列号的 TCP 段。远程服务器会使用一个设置了 SYN 位和 ACK 位的 TCP 段、一个随机选择的初始序列号和一个等于客户端的初始序列号加 1 的确认号进行响应。最后,客户端会使用一个设置了 ACK 位的 TCP 段进行响应,该段的序列号等于客户端发送的初始序列号加 1,确认号等于远程服务器的初始序列号加 1。
当攻击者伪造来自另一台主机的源 IP 地址的 IP 数据报时,通常情况下攻击者不会收到他们可能发送的任何数据包的响应。在这种情况下,攻击者实际上拥有一条通往远程服务器的单向通信通道。查看 TCP 握手中的数据包流,攻击者需要预测远程服务器将在其 SYN/ACK 响应中生成的初始序列号,以便在 ACK 响应中使用适当的确认号进行响应,从而完成三次握手。攻击者需要正确猜出一个 32 位数字才能使攻击奏效。
如今,这种攻击完全行不通。但在过去,一些引人注目的袭击正是使用了这种方法。这是可能的,因为在过去,一些操作系统的初始序列号非常可预测。(您可能会发现 Michal Zalewski 的论文奇异吸引子和 TCP/IP 序列号分析 - 一年后就描述各种操作系统的初始序列号的可预测性而言,这是一篇有趣的读物。
答案2
正常情况下不会。
TCP 协议通过三次握手来建立连接
Host A sends a SYN packet to Host B
Host B sends a SYN ACK packet to host A
Host A sends an ACK packet to host B
并且连接已建立
现在,如果我们引入一个主机 C,它可以欺骗主机 A 的地址
Host C sends a spoofed SYN packet to Host B
Host B sends a SYN ACK packet to Host A
主机 A 不期待 SYN ACK,所以它就忽略它。