【问题标题】:Accepting Sockets Only From Specific IPs仅接受来自特定 IP 的套接字
【发布时间】:2011-07-10 16:42:54
【问题描述】:

我的游戏服务器现在接受来自每个人的套接字。但是如何阻止特定 IP 的攻击呢?你知道,如果他们想使我的服务器崩溃或其他什么。我正在使用 SFML 库,C++。

【问题讨论】:

  • 你在使用 SFML SocketTCP 和 SocketUDP 类吗?

标签: c++ tcp network-programming udp sfml


【解决方案1】:

使用 TCP,当您的程序(或您正在使用的库)调用 accept(2) 时,第二个参数是一个输出,它告诉您客户端的地址。

使用 UDP 没有连接,但有 recvfrom(2),就像 accept(2) 一样,为您提供对等方的地址。所以你可以忽略你不喜欢的同行。

或者您可以在某种防火墙设备后面运行您的服务器并在那里添加规则,或者在主机上使用 iptables 或类似软件作为防火墙。

在 SFML 中,您有 SocketTCP::AcceptSocketUDP::Receive,如果您将空地址作为参数传递,它们都会为您提供对等方的地址。

【讨论】:

  • 好的,所以在请求之后检查IP?
  • 是的,在accept()之后,检查返回的IP,如果IP被列入黑名单(或未列入白名单),则关闭连接。
  • UDP 怎么样?我的意思是,用户可以用大量数据轰炸我的服务器,而我的带宽会变得疯狂。
  • 对于 UDP,您所能做的就是丢弃(忽略)数据包。您可以在路由器上设置防火墙,但这只会将它们向您发送数据包的地方移动得更远。 (当然,即使在您编写此游戏服务器之前,它们也可能立即用数据包淹没您的路由器。)
  • 我扩展了我的答案以处理 UDP。
【解决方案2】:

我不知道阻止某些 ip 的任何具体方法,但您肯定可以在确定原始 ip 后拒绝请求(在您的情况下可能是连接请求)。维护一个被阻止的 ip(或黑名单 ip)列表(使其可配置以便更容易添加/删除)并拒绝来自黑名单 ip 之一的请求。

【讨论】:

  • 好的,所以在请求之后检查IP?
  • 是的(使用一些想法:getperrname),这肯定适用于您的情况。
  • UDP 怎么样?我的意思是,用户可以用大量数据轰炸我的服务器,而我的带宽会变得疯狂。
【解决方案3】:

在 Windows 下,WinSock 2.x 有一个可选的 WSAAccept() 回调参数,可用于有条件地接受/拒绝连接请求。客户端 IP/端口是可用参数之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2013-06-06
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多