监听linux服务器中的60000个端口

问题描述 投票:0回答:1

我在 Linux 中监听多个端口时遇到问题。我想监听该服务器中从 20 到 63350 的所有端口。但是,我一次只能监听 4700 个端口。我就是这样做的。

我该如何实施?我应该修改脚本或服务器的设置吗?或者我可能需要使用 13 台服务器来监听 60000 个端口。

  1. 我修改了Linux的文件限制,允许我同时打开更多文件。
ulimit -n 100000
  1. 编写脚本来监听端口。我尝试了
    threading
    multiprocessing
    。但他们最多只能监听4700个端口。
// When this script listens on more than 4700 ports, "too many open files" error pops up.
#!usr/bin/python3

import socket
import threading

host = ''
start_port = 10
end_port = 2010

def port_listen(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind((host, port))
        print(f'bound success(port: {port})')
        s.listen(2000)
    except Exception as e:
        print(f'failed to bind(port: {port})\nerror msg: {e}')

    while True:
        conn, addr = s.accept()
        conn.close()

threads = []
for port in range(start_port, end_port):
    thread = threading.Thread(target = port_listen, args=(port,))
    threads.append(thread)
    thread.start()

for thread in threads:
    thread. Join()
// When this script listen more than 1000 ports, the server crashes with the extremely high consume of cpu and memory. Error msg is "can't start new process".
#!usr/bin/python3

import socket
import multiprocessing

host = ''
start_port = 23
end_port = 50

def listen(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind((host, port))
        s.listen(100)
    except Exception as e:
        print(f"port {port} failed to bound: {e}")
        return

    while True:
        conn, addr = s.accept()
        print(f"{port} connected!")
        conn.close()

processes = []
for port in range(start_port, end_port + 1):
    process = multiprocessing.Process(target = listen, args = (port,))
    processes.append(process)
    process.start()

for process in processes:
    process. Join()

python linux networking port telescope
1个回答
0
投票

(1)while true循环需要添加超时时间,否则可能会导致死循环问题。

(2)Python的多处理是在单核上工作的,这意味着多处理可能不会加速程序。这样你就可以监听所有端口而无需多进程。如果你坚持使用多进程,这个链接可能对你有帮助:How to Develop a Multithreaded Port Scanner in Python

代码:

import socket
host = ''
start_port = 1025
end_port = 65536
socket_time_out = 3

def listen(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind((host, port))
        s.listen(100)
    except Exception as e:
        print(f"port {port} failed to bound: {e}")
        return
    s.settimeout(socket_time_out)
    try:
        while True:
            conn, addr = s.accept()
            print(f"{port} connected!")
            conn.close()
    except Exception as e:
        pass

processes = []
for port in range(start_port, end_port + 1):
    listen(port)
© www.soinside.com 2019 - 2024. All rights reserved.