暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

测试 ssh 的最大连接数

生有可恋 2023-02-13
6466

大部分的网络程序都有连接数的限制,当连接数超出配置要求后,新的连接将无法接入。这就是所谓的DoS攻击(Denial of Service),如果是多台主机对网络服务发起攻击,就是DDos攻击(Distributed Denial of Service),即分布式DoS攻击。

我们要了解DoS攻击,首先要了解 socket 编程相关的基础。服务端会绑定一个端口等待客户端连接。如果一台客户端主机发起大量的连接请求,就会造成会话数超标,最终会超出服务器的服务能力。

我们以 ssh 服务为例,看看如果超出服务器的 ssh 最大连接数会出现什么后果。以下是 ssh 会话数为10个时的情况,此时还没有达到 ssh 服务的最大连接数:

在服务器上统计会话数:

    netstat -anp | grep :22 | grep ESTABLISHED

    当前会话数还在正常范围内,我们此时还可以通过 ssh 连接至服务器。如果我们将客户端的连接数加至 1000,此时再观察客户端和服务器两边的统计信息:

    客户端在发起 connect() 连接请求后,并没有任何数据交互,而服务器会处于等待状态,当超时后会释放连接。在服务端可以看到后台的会话数并没有达到预期的 1000。统计处于 ESTABLISHED 状态的 ssh 会话数,发现只有100个左右。

    当前通过正常的 ssh 客户端已经无法连接到服务器,连接服务器时会报错:

      $ ssh -l root it.com
      kex_exchange_identification: Connection closed by remote host

      通过测试发现 ssh 的默认会话数只能保持在 100 个左右,当发起超过这个数量的连接时,ssh server 会拒绝提供服务。

      发起连接的测试程序代码为:

        #!python3


        import socket
        import sys
        import time


        def max_session(n):
        MAX = n
        SLEEP = 30
        host, port = ('it.com',22)
        port = int(port)


        L = []


        for i in range(MAX):
        s = socket.socket()
        s.connect((host, port))
        L.append(s)
        print(s)
        time.sleep(30)


        if __name__ == '__main__':
        while True:
        max_session(1000)

        这里通过 sleep() 保持网络会话资源的占用状态,并在 ssh server 主动断开连接前再次发起新的连接请求。之所以最终 ssh 服务被爆掉,是因为断开连接也是需要时间的。当断开连接的速度慢于发起请求的速度,网络服务就会被非正常请求影响。防御手段也很简单,就是封掉发起攻击的IP,让对方无法发起连接请求。

        通过模拟大量会话请求的情况,我们可以测试网络服务的性能瓶颈,以及当出现最坏情况时服务器的具体表现。

        全文完。

        如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

               

        文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论