我在 Linux 中监听多个端口时遇到问题。我想监听该服务器中从 20 到 63350 的所有端口。但是,我一次只能监听 4700 个端口。我就是这样做的。
我该如何实施?我应该修改脚本或服务器的设置吗?或者我可能需要使用 13 台服务器来监听 60000 个端口。
ulimit -n 100000
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()
(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)