Python 实现 TCP 和 UDP 端口扫描的方法
TCP 端口扫描
TCP 端口扫描指的是使用 TCP 协议进行端口扫描,即向目标主机发送连接请求,如果连接成功,则说明该端口是打开状态,否则该端口是关闭状态。
Python 的 socket 模块可以用来实现 TCP 端口扫描。
实现步骤:
-
导入 socket 模块
-
创建一个 socket 对象
-
设置连接超时时间
-
循环扫描目标主机的端口
-
发送连接请求,如果连接成功,则说明该端口是打开状态
-
关闭 socket 连接
代码演示:
import socket # 定义目标主机和端口范围 target_host = "pidancode.com" target_port_range = range(1, 100) # 创建一个 socket 对象 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置连接超时时间 client.settimeout(0.1) # 循环扫描目标主机的端口 for target_port in target_port_range: try: # 发送连接请求,如果连接成功,则说明该端口是打开状态 client.connect((target_host, target_port)) print(f"Port {target_port} is open") except: pass # 关闭 socket 连接 client.close()
UDP 端口扫描
UDP 端口扫描指的是使用 UDP 协议进行端口扫描,即向目标主机发送消息,如果可以收到响应,则说明该端口是打开状态,否则该端口是关闭状态。
Python 的 socket 模块同样可以用来实现 UDP 端口扫描。
实现步骤:
-
导入 socket 模块
-
创建一个 socket 对象
-
设置超时时间
-
循环扫描目标主机的端口
-
发送 UDP 消息,如果可以收到响应,则说明该端口是打开状态
-
关闭 socket 连接
代码演示:
import socket # 定义目标主机和端口范围 target_host = "pidancode.com" target_port_range = range(1, 100) # 创建一个 socket 对象 client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 设置超时时间 client.settimeout(0.1) # 循环扫描目标主机的端口 for target_port in target_port_range: try: # 发送 UDP 消息,如果可以收到响应,则说明该端口是打开状态 client.sendto(b"Hello", (target_host, target_port)) data, addr = client.recvfrom(1024) print(f"Port {target_port} is open") except: pass # 关闭 socket 连接 client.close()
注意事项:
TCP 端口扫描和 UDP 端口扫描在实现上有一些细微的差别,需要注意。
其中,TCP 端口扫描使用的是 socket.SOCK_STREAM,UDP 端口扫描使用的是 socket.SOCK_DGRAM。另外,TCP 端口扫描使用的是 connect() 方法,UDP 端口扫描使用的是 sendto() 和 recvfrom() 方法。
相关文章