import socket
import concurrent.futures
import time
def resolve_domain(domain):
"""解析域名获取IP地址"""
try:
ip = socket.gethostbyname(domain)
return ip
except socket.gaierror:
print(f"域名解析失败: {domain}")
return None
def scan_port(ip, port, timeout=1.5):
"""检测指定IP的单个端口状态"""
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(timeout)
result = s.connect_ex((ip, port))
return port, result == 0 # 返回端口号及状态(True=开放)
except Exception as e:
return port, False
def port_scanner(domain, ports, timeout=1.5, max_threads=100):
"""执行端口扫描主函数"""
# 域名解析
ip = resolve_domain(domain)
if not ip:
return
print(f"开始扫描 {domain} ({ip})")
open_ports = []
start_time = time.time()
# 使用线程池并发扫描
with concurrent.futures.ThreadPoolExecutor(max_workers=max_threads) as executor:
futures = {executor.submit(scan_port, ip, port, timeout): port for port in ports}
for future in concurrent.futures.as_completed(futures):
port, is_open = future.result()
if is_open:
print(f"端口 {port} [开放]")
open_ports.append(port)
# 扫描结果摘要
print(f"n扫描完成! 耗时: {time.time()-start_time:.2f}秒")
print(f"开放端口总数: {len(open_ports)}")
print("开放端口列表:", sorted(open_ports))
if __name__ == "__main__":
# 配置参数
TARGET_DOMAIN = "example.com" # 目标域名
COMMON_PORTS = [21, 22, 23, 25, 53, 80, 110, 143, 443, 465, 587, 993, 995, 3306, 3389, 8080] # 常见端口列表
TIMEOUT = 1 # 连接超时(秒)
THREADS = 200 # 最大并发线程数
# 执行扫描
port_scanner(TARGET_DOMAIN, COMMON_PORTS, TIMEOUT, THREADS)
功能说明:
-
域名解析:

- 使用
socket.gethostbyname()将域名转换为IP地址 - 自动处理解析失败情况
- 使用
-
端口扫描:
- TCP连接扫描(全连接)
- 可自定义超时时间(默认1.5秒)
- 支持批量端口检测
-
并发处理:
- 使用线程池实现高速扫描
- 可配置最大并发数(默认100线程)
-
结果输出:

- 实时显示开放端口
- 扫描结束后统计开放端口列表
- 显示总耗时
使用示例:
# 扫描百度的常见端口
port_scanner("www.baidu.com", [80, 443, 8080, 8888])
# 扫描自定义端口范围
port_scanner("example.com", range(1, 1024))
注意事项:
-
合法性:
- 仅扫描自己拥有或获得书面授权的目标
- 未经授权的端口扫描可能违反法律
-
防火墙影响:
- 结果可能受本地/目标防火墙影响
- 实际开放端口可能被安全设备拦截
-
性能调节:

- 增加线程数可提高速度(但可能被目标封禁)
- 减少超时时间可加速扫描(但可能增加误报)
-
替代方案:
# 使用Nmap命令行工具 nmap -p 1-65535 example.com
提示:对于专业级扫描需求,推荐使用成熟的网络安全工具如Nmap,其提供更全面的检测技术(SYN扫描、服务识别、漏洞检测等)。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/285920.html

