基本上,我想使用套接字模块监听所有端口。如何使port
=对服务器上的所有开放端口?任何指南和/或资源都非常受欢迎这是我目前的代码。
import socket
def Main():
host = '127.0.0.1'
port = 5000
s = socket.socket()
s.bind((host, port))
s.listen(1)
c, addr = s.accept()
print('Connection from: ' + str(addr))
while True:
data = c.recv(1024)
if not data:
break
print('from connected user: ' + str(data))
data = str(data).upper()
print('sending: ' + str(data))
c.send(data)
c.close()
if __name__ == '__main__':
Main()
答案 0 :(得分:4)
您可以尝试所有可能的端口并将它们存储在列表中。请记住,保留低于1024的端口,并且某些端口可能正在使用中。因此,您将遇到一些错误,如果无法绑定到该端口,则需要处理这些错误。此外,每个端口都需要一个套接字,因为套接字只能在一个端口上侦听。创建一个返回套接字的函数create_socket
,然后将它们存储为一个列表。如果您在尝试连接时遇到错误,请传递这些错误。这可能不是一个好方法,但它会对你有用。
def create_socket(port_number):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('127.0.0.1', port_number))
server_socket.listen(1)
return server_socket
socket_list = []
for port_number in range(1025,65536):
try:
socket_list.append(create_socket(port_number))
except Exception:
pass
答案 1 :(得分:1)
另一种选择是在主机中设置数据包筛选和转换,以将所有传入的TCP请求都定向到您的进程,而不考虑目标端口。 sshuttle这样做是为了将所有请求传送到ssh服务器。这样,您的进程就无需打开数千个文件。
在freeBSD / macOS中,如下配置。其他操作系统将有其特定的操作方式(例如Debian中的nftables的nft(8))。
创建一个包含以下内容的文件(在本示例中为rules.txt
)
# Redirect incoming traffic on interface en0 to localhost:5000
rdr pass on en0 inet proto tcp all -> 127.0.0.1 port 5000
将en0
更改为您希望截获传入连接的接口。删除inet
或替换为inet6
分别接受IP和IPv6或仅接受IPv6。检查pf.conf(5)以获得此文件的确切语义和语法。
具有管理访问权限,请运行以下命令以加载先前创建的文件中包含的规则。
启用数据包过滤和转换:
pfctl -e
刷新所有内容(请小心,因为这将删除已设置的现有路由和翻译配置):
pfctl -F a
加载规则:
pfctl -f rules.txt
测试一下。
如果您还希望像sshuttle一样包含传出流量,则应将下一行附加到rules.txt
:
pass out route-to lo0 inet proto tcp all
您还可以调整此规则以使其更具选择性,并避免将自己设置为网络监狱(请参阅下面注释的条目1)。
route-to
关键字)。en0
上任何端口的人都可以与绑定到127.0.0.1:5000
的进程进行对话。rules.txt
后,请记住重新加载规则,以使其生效。pfctl -d
。