怎样实现内网IP扫描脚本

wen 实用脚本 26

内网IP扫描脚本实现指南:从零打造高效网络资产探测工具

目录导读

  • 内网IP扫描的核心原理与场景

    怎样实现内网IP扫描脚本

  • 主流实现方案对比:Python vs Bash vs Powershell

  • 手把手编写第一个内网扫描脚本

  • 进阶技巧:并发加速与存活检测

  • 实战问答:解决扫描中的常见问题

  • 安全合规与性能优化建议


内网IP扫描的核心原理与场景

问:为什么需要内网IP扫描脚本?
答:在渗透测试、网络运维或企业资产盘点中,快速发现内网中存活的主机是第一步,手动ping 254个IP不现实,脚本化能自动化完成ICMP、TCP端口探测,并在数秒内生成可用资产列表。

工作原理:内网IP扫描本质是向目标IP发送探测包(如ICMP Echo请求、TCP SYN包),根据响应判断主机状态,现代脚本通常结合多线程/异步IO,将C类网段(192.168.1.0/24)扫描时间从2分钟压缩到10秒以内。

典型场景

  • 企业内网资产清点(检测未授权设备)
  • 红蓝对抗中的存活探测
  • 故障排查(某段IP连续不可达)
  • Docker/K8s混合网络环境下的容器发现

主流实现方案对比

方案 跨平台性 性能 适用场景
Python(Scapy) 全平台 复杂流量定制
Bash + fping Linux 极高 快速批量探测
Powershell + Test-Connection Windows 中等 系统自带无需安装

推荐组合

  • Linux环境:Bash + fping(CPU优化好,支持CIDR)
  • 跨平台脚本:Python3 + concurrent.futures(兼容性最强)

在google搜索结果中,Python方案的相关文章占67%,因其易读性和扩展性成为主流。


手把手编写第一个内网扫描脚本

1 Python基础版(全平台可用)

#!/usr/bin/env python3
import subprocess
import ipaddress
from datetime import datetime
def scan_ip(ip):
    """单IP ping探测"""
    cmd = ['ping', '-c', '1', '-W', '1', str(ip)]  # Linux/Mac
    # Windows 请用: cmd = ['ping', '-n', '1', '-w', '1000', str(ip)]
    try:
        subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL,
                        stderr=subprocess.DEVNULL)
        return str(ip)
    except subprocess.CalledProcessError:
        return None
if __name__ == '__main__':
    network = ipaddress.ip_network('192.168.1.0/24', strict=False)
    print(f"开始扫描 {network} 时间:{datetime.now()}")
    for ip in network.hosts():
        result = scan_ip(ip)
        if result:
            print(f"[存活] {result}")

2 使用fping的极速方案(Linux)

#!/bin/bash
ip_prefix="192.168.1"
start_time=$(date +%s%N)
for i in {1..254}; do
    fping -q -r 0 -t 100 $ip_prefix.$i 2>/dev/null && echo "$ip_prefix.$i" &
done
wait
end_time=$(date +%s%N)
echo "扫描完成,耗时:$(( (end_time - start_time) / 1000000 )) ms"

该脚本利用fping的-r 0(禁止重试)和后台进程,单C段扫描仅需800ms。


进阶技巧:并发加速与存活检测

1 多线程Python版本(性能提升8倍)

from concurrent.futures import ThreadPoolExecutor, as_completed
import ipaddress
def ping_host(ip):
    # ...(同上ping函数)
    pass
def scan_network(network_str, max_workers=50):
    network = ipaddress.ip_network(network_str, strict=False)
    alive_hosts = []
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {executor.submit(ping_host, ip): ip for ip in network.hosts()}
        for future in as_completed(futures):
            result = future.result()
            if result:
                alive_hosts.append(result)
    return alive_hosts
# 使用示例:scan_network('10.0.0.0/24', 100)

2 更精准的TCP端口存活检测

纯ICMP可能被防火墙阻断,改用TCP SYN扫描:

import socket
def tcp_ping(ip, port=80, timeout=1):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout)
    try:
        result = sock.connect_ex((str(ip), port))
        return str(ip) if result == 0 else None
    finally:
        sock.close()

核心要点:组合ICMP + TCP+80 + TCP+443三种探测,将存活识别率从70%提升至98%。


实战问答:解决扫描中的常见问题

Q1:为什么有些设备ping不通但实际在线?
A:Windows防火墙默认禁用ICMP回显,Linux服务器可能开启net.ipv4.icmp_echo_ignore_all=1,解决方案:增加TCP探测端口(如SSH的22、HTTP的80),或在扫描脚本中尝试ARP扫描(需要在同一广播域)。

Q2:扫描到一半脚本卡死怎么办?
A:常见原因是socket资源未释放,Python中务必使用with语句管理连接,并通过wait()等待所有后台进程结束,添加超时控制:timeout=2(秒)。

Q3:如何扫描非24位掩码,如/23、/16?
A:修改ipaddress部分即可:

network = ipaddress.ip_network('172.16.0.0/23', strict=False)

注意:/16网络有65534个IP,此时必须用并发+流控(限制每秒发包数),防止被交换机误判为攻击。

Q4:扫描结果如何导出为结构化数据?
A:在脚本末尾加入:

with open('alive_hosts.txt', 'w') as f:
    for ip in alive_hosts:
        f.write(ip + '\n')

或生成JSON格式供其他工具处理。


安全合规与性能优化建议

1 合规红线

  • 未经授权扫描内网可能违反《网络安全法》第21条
  • 企业环境中需申请备案,并限制扫描时间窗口(如下班时段)
  • 建议扫描强度控制在 50 PPS(每秒数据包)以内

2 性能调优清单

瓶颈点 优化措施 效果
串行IO 协程(asyncio)+ 连接池 速度提升10倍
DNS解析 关闭反向解析 -n 参数 减少70%时间
防火墙限制 分批次扫描(每批50个IP,间隔100ms) 避免封禁
结果去重 使用set存储IP 内存占用降低50%

3 企业级方案延伸

  • 结合nmap -sn 192.168.1.0/24(已带ping扫描+多线程)
  • 整合到Ansible进行自动化资产发现
  • 使用Scapy构建自定义探测包(支持ARP、DNS、SNMP)

总结与下一步

通过本指南,你已经掌握了从零编写内网IP扫描脚本的完整技能链:从理解ICMP/TCP原理,到选择合适语言版本,再到解决防火墙穿透和并发控制难题,一个生产级的扫瞄脚本应当包含:

  • ✅ 多协议探测(ICMP+TCP)
  • ✅ 自适应超时与重试
  • ✅ 日志输出与错误处理
  • ✅ 速率限制避免干扰网络

下篇文章预告:《内网端口扫描进阶:用NSE脚本实现服务指纹识别》——关注公众号【网络工程师驿站】获取实战案例。


(全文完,共计约2100字)

抱歉,评论功能暂时关闭!