Python套接字侦听所有端口

时间:2017-11-18 06:00:29

标签: python sockets

基本上,我想使用套接字模块监听所有端口。如何使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()

2 个答案:

答案 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)。

注释

  1. 如果包括传出流量,除非您首先收到连接或具有其他接口,否则您将无法与外界通信。这是因为传出的流量将路由到您的全部处理流程(由于route-to关键字)。
  2. 请注意,此方法允许从外部访问绑定到localhost的进程。在上面的设置中,任何连接到en0上任何端口的人都可以与绑定到127.0.0.1:5000的进程进行对话。
  3. 在更改rules.txt后,请记住重新加载规则,以使其生效。
  4. 要禁用数据包过滤和转换,请运行pfctl -d