【问题标题】:Deny a client's TCP connect request before accept()在 accept() 之前拒绝客户端的 TCP 连接请求
【发布时间】:2020-01-12 07:42:03
【问题描述】:

我正在尝试用 C 语言编写 TCP 服务器代码。我刚刚注意到accept() 函数在连接建立后返回。

一些客户端充斥着随机数据,一些客户端只是发送一次随机数据,之后我想关闭他们当前的连接和未来的连接几分钟(或更长时间,取决于程序有多少负载)。

我可以将坏客户端 IP 地址保存在数组中,也可以保存时间,但我找不到任何函数来中止当前连接或拒绝来自坏客户端的未来连接。

我找到了一个名为 WSAAccept 的 Windows 操作系统函数,它允许您根据用户的选择拒绝连接,但我不使用 Windows 操作系统。

我尝试了代码原始 TCP 服务器,它允许您从头开始访问 TCP 数据包,包括所有 TCP 标头,并且它不会自动接受连接。我尝试通过程序端处理连接,包括 SYN ACK 和其他 TCP 信号。它有效,但后来我注意到原始 TCP 服务器接收到我的网络接口中的所有数据包,当其他程序使用高流量时,它也会使我的程序滞后。

我尝试使用 libnetfilter,它允许您过滤网络接口中的整个流量。它也可以工作,但就像原始 TCP 服务器一样,它也接收整个网络接口的数据包,当流量很大时,它会变得很慢。我还尝试将 libnetfilter 与 iptables 进行比较。 libnetfilter 比 iptables 慢。

总而言之,我怎样才能在不损害其他客户端连接的情况下中止客户端当前和未来的连接?

我有 linux 和 debian 10。

【问题讨论】:

  • 我相信您正在寻找的解决方案是内核的数据包过滤器。另请参阅 Packet Filtering HowToHow can I programmatically manage iptables rules on the fly?(和朋友)。
  • 包过滤非常慢,因为它不仅处理我服务器的 TCP 端口,还处理整个接口。此外,带有system() 调用的iptables 命令非常脏,而且编码起来也很费劲。 @jww
  • 查找 libiptc.
  • 我会尽快检查 libiptc。 @matteomartelli 的问题有点相同,但该线程没有回答我要查找的内容。

标签: c linux sockets networking tcp


【解决方案1】:

一旦您在数据包级别上列入黑名单,您可能很快就容易受到基于 IP 欺骗的微不足道的攻击。对于一个非常基本的实现,攻击者可以使用您的数据包级别黑名单将他想要的任何人列入黑名单,只需向您发送许多带有虚假源 IP 地址的数据包。通常你不想接触这些过滤(除非你真的知道你在做什么)并且你只是信任你的防火墙等。

所以我真的建议在从accept 获取文件描述符后立即将其发送给close

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2016-04-22
    • 2016-09-15
    • 1970-01-01
    • 2014-01-10
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多