当前位置: 首页 > 知识库问答 >
问题:

如何处理套接字中的网络端口滥用

贲永思
2023-03-14
close( mSocket );

终止TCP/IP连接的最佳方法是什么,该连接清理了系统上的开放套接字,但让远程方挂起。那就是我想要关闭一个插座的方式,对我来说是最低的成本,但对他们来说是最高的成本。

@尼古拉斯·威尔逊:

使用tcprepair似乎是个好主意。当套接字在TCP_REPAIR模式下关闭时,不会发送FIN或RST数据包。远程插座挂起。我要去试试看然后回去报告。下面是我的(未经测试的)代码:

if ( abuse )
{
   int aux = 1;
   if ( setsockopt( mSocket, SOL_TCP, TCP_REPAIR, &aux, sizeof( aux )) < 0 )
      reportError( "Tried to do a rude socket close... but could not turn on repair mode.\n" );
}
close( mSocket );
  1. 只是不要关闭它。打开的插座是永远的。攻击者代价:高-他们没有鳍。对我来说成本更高。我的所有文件描述符最终都会被使用。
  2. 为每个套接字生成一个线程,使其Hibernate10分钟,然后关闭套接字。攻击者代价:高-他们没有鳍。对我来说成本更高。虽然我最终关闭了套接字,但对于每一个请求,我的套接字使用的时间比攻击者的时间长,而且我有一个线程的开销。
  3. 生成一个线程来处理过期的所有被滥用的套接字。攻击者代价:高-他们没有鳍。对我来说成本更高。就像2号一样,很多插座都开着。管理它的单线程开销。代码复杂度,令人烦恼。

共有1个答案

姬裕
2023-03-14

好的,做了一些研究,我有了一个适合我的答案,基于tcprepair。它比我一开始想象的要复杂一点:

if ( abuse )
{
   // read some bytes from the spammer - to establish the connection
   u32 tries = 20;
   while ( tries )
   {
      sleep( 1000 );
      char tmpBuf[32];
      s32 readCount = recv( mSocket, &tmpBuf[0], 32, 0 );
      if ( readCount > -1 ) break;
      tries--;
   }
#ifdef TCP_REPAIR
   int aux = 1;
   if ( setsockopt( mSocket, SOL_TCP, TCP_REPAIR, &aux, sizeof( aux )) < 0 )
   {
     reportError( "could not turn on repair mode" );
   }
#else // !TCP_REPAIR
   // no TCP REPAIR - best we can do is an abort close
   struct linger so_linger;
   so_linger.l_onoff = 1;
   so_linger.l_linger = 0;
   if ( setsockopt( mSocket, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger ) < 0  )
   {
      reportError( "Cannot turn off SO_LINGER" );
   }
#endif // TCP_REPAIR
}
close( mSocket );

在内核级别,如果您关闭连接,TCP堆栈将发送FIN或RST数据包,无论您如何执行(关闭或关闭)。无论哪种方式都将通知攻击者您关闭了连接。

我们想悄悄地关闭连接,让他们等着发现你没有应答。因为我们有报复心。

但如果您在连接后立即通过IP阻止请求,而不首先读取套接字,则会以某种方式通知远程方。他们得到了RST。或者连接中的某些东西从未完全完成,远程系统几乎立即中止请求。

所以我们首先从黑客的套接字中读取几个字节。在我的例子中,套接字已经处于非阻塞模式。但如果不是,您想要将套接字设置为非阻塞,否则您将自己打开给黑客打开连接,但不发送数据包,让您的服务器挂起--就像您计划对他做的那样。如果几微秒后你没有收到一个数据包,你还是会关闭他。

但如果你从他那里读了几个字节,那么他的程序就会一直等待你的响应,而这个响应永远不会来。

像一个魅力一样工作,将您的浏览器指向此处:

http://oroboro.com/fail

铬至少会挂在那里5-10秒。看看我的日志,我每秒被打10次--他只能每10秒打我一次。从以下内容加载到我的系统:0。

 类似资料:
  • 我在我的C#网络项目中使用无状态,主要是因为它是一种很好的方法来添加功能,如套接字连接后的有线级授权、重新连接的延迟等。 话虽如此,但我自己却陷入了一些竞争状态和僵局--我向以下各州寻求解决问题的最佳方法: 它的功能是套接字将自动重新连接,并在连接时启动接收循环。如果出现套接字错误,它应该返回以释放资源,然后循环返回以重新启动。 然而,当我处理对象时,连接的套接字中止,这也释放了资源,并且它尝试自

  • 问题内容: 大家好。我有一个使用ServerSocket和Socket类用Java编写的服务器。 我希望能够检测并处理断开连接,然后在必要时重新连接新客户端。 检测客户端断开连接,关闭套接字然后接受新客户端的正确步骤是什么? 问题答案: 大概是在从套接字读取数据,也许是在输入流上使用包装器,例如BufferedReader。在这种情况下,当相应的读取操作返回-1(对于原始read()调用)或为nu

  • 计算机网络基础 ip地址 为了使网络上的计算机能够彼此识别对方,每台计算机都需要一个IP地址以标识自己。 IPv4:32位,IPv6:64位 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 地址解析 地址解析是指将计算机的协议地址解析为物理地址,即MAC(Medium Access Control)地址,又称为媒体访问控制地址。通常,在网络上由地址解析协议(ARP)

  • 问题内容: 我想知道当轮询设置这些位时应该怎么做?关闭插座,忽略它还是什么? 问题答案: 甲装置插座不再连接。在TCP中,这意味着已接收和发送FIN。 A 表示套接字收到异步错误。在TCP中,这通常意味着已经接收或发送了RST。如果文件描述符不是套接字,则可能意味着设备不支持轮询。 对于上述两种情况,套接字文件描述符仍处于打开状态,并且尚未关闭(但可能已经被调用)。文件描述符上的A 将释放仍代表套

  • 然而,我遇到了一些问题。特别是带有内部异常的WebException(“无法连接到远程服务器”): 无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满127.0.0.1:52395 我正在尝试以每线程500次迭代的方式运行100个线程。 我可以使用更少的迭代和/或更少的线程来操作测试,因为看起来套接字最终会退出这个TIME_WAIT状态。但是,这不是一个解决方案,因为它没有充分测试web

  • 问题内容: 我正在调试基于ac的linux socket程序。作为网站上所有可用的示例,我应用了以下结构: 当删除服务器关闭其服务器程序时,我可以检测到断开连接。但是,如果拔下以太网电缆,则send函数仍然返回正值,而不是-1。 假设无法更改服务器端,如何在客户端程序中检查网络连接? 问题答案: 但是,如果拔下以太网电缆,则send函数仍然返回正值,而不是-1。 首先,您应该知道实际上并没有发送任