在 Linux 服务器中侦听 60000 个端口

listen 60000 ports in linux server

提问人:Z4R1 提问时间:11/1/2023 最后编辑:Z4R1 更新时间:11/1/2023 访问量:83

问:

我在 Linux 中收听多个端口时遇到问题。我想侦听此服务器中从 20 到 63350 的所有端口。但是,我一次只能侦听 4700 个端口。这是我是如何做到的。

我正在研究网络望远镜的东西(又名暗网,分组望远镜)。我需要确保所有端口都被监听,或者当我尝试 tcpdump 以捕获具有非侦听端口的数据包时,我的服务器将拒绝请求,这会阻止我捕获数据包。RSTSYN

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

  1. 我修改了 Linux 的文件限制,允许我同时打开更多文件。
ulimit -n 100000
  1. 编写脚本以侦听端口。我试过了.但他们最多只能监听 4700 个端口。threadingmultiprocessing
// 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 tcp 网络编程 端口

评论

4赞 leaf_yakitori 11/1/2023
这似乎是一个 X-Y 问题,几乎没有理由通过 python 脚本监听服务器中的所有端口。请检查 X-Y 问题并询问您真正想做什么。
0赞 gre_gor 11/1/2023
您确定限制是端口而不是线程吗?
1赞 tripleee 11/1/2023
然后,只需将数据包捕获设置为混杂捕获所有数据包,而无需 TCP 层抽象。您可以侦听的端口数量有内核限制,但对于此用例来说,这无关紧要。
1赞 Ulrich Eckhardt 11/1/2023
每个套接字使用一个线程的扩展性非常差。请改用 或特定于 Linux 的等效项。关于多线程(或多处理),经验法则是每个资源使用一个线程到几个线程。在这种情况下,资源不是套接字,而是物理网络接口。select()
4赞 Ron Maupin 11/1/2023
认真地?想要进行安全检查的人不了解网络层,在较低层捕获将捕获所有封装的上层?端口不是问题,连接可能是问题,您可以捕获给定 IP 地址的所有连接,或给定主机接口的所有流量。端口只是传输协议和应用程序之间的虚拟链接的地址,并非所有传输协议都使用端口。

答: 暂无答案