首页 > 其他分享 >golang实现ip地址扫描

golang实现ip地址扫描

时间:2024-09-05 19:14:46浏览次数:10  
标签:ip 扫描 网络 golang 地址 IP Go

Golang 实现 IP 地址扫描

原创 Go Official Blog Go Official Blog    2024年09月05日 18:13 中国香港 听全文

你是否想过哪些设备连接到了家里的 Wi-Fi 网络?无论是出于安全目的还是单纯的好奇心,我们都可以去了解一下家庭网络中的设备情况。在本文中,我们将介绍如何使用 Go 构建一个简单的 IP 地址扫描器,它可以扫描家庭网络并列出所有活动设备。

为什么要构建 Ip scanner

市面上有很多网络扫描工具,但自己构建网络扫描工具能让我们灵活地理解和修改代码,以满足需求。此外,这还是学习 Go 网络编程的好方法。有了这个工具,你就能识别网络上的设备,帮助你检测任何未经授权的访问,或查看连接的设备。

介绍

我们的 IP 地址扫描器将通过向指定范围内的每个 IP 地址发送 ICMP(ping)请求来工作。如果设备响应,则认为该设备处于活动状态。扫描仪将:

  • 确定网络范围。
  • Ping 该范围内的每个 IP 地址。
  • 报告哪些 IP 处于活动状态。

IP Scanner 实现

新建一个名为 main.go 的 Go 文件,并添加以下代码:

package main

import (
 "fmt"
 "net"
 "os"
 "sync"
 "time"
)

// Function to perform a ping scan on an IP address
func scanIP(ip string, wg *sync.WaitGroup) {
   defer wg.Done()

   conn, err := net.DialTimeout("ip4:icmp", ip, time.Second*1)
   if err != nil {
      fmt.Printf("Failed to ping IP %s: %v\n", ip, err)
    return
 }
   defer conn.Close()

   fmt.Printf("IP %s is up\n", ip)
}

func main() {
   var wg sync.WaitGroup

   // Identify the local network IP range (adjust based on your network)
   localIP := "192.168.1." // Example local network range
   startIP := 1
   endIP := 254

   // Check if the program is running with the necessary privileges
   if os.Geteuid() != 0 {
    fmt.Println("Warning: Running without root privileges may prevent pinging.")
 }

   for i := startIP; i <= endIP; i++ {
    ip := fmt.Sprintf("%s%d", localIP, i)
    wg.Add(1)
    go scanIP(ip, &wg)
 }

   wg.Wait()
   fmt.Println("Scan complete")
}

代码解释

  • Local Network Range: localIP 变量包含 IP 范围的基数(192.168.1.)。startIP 和 endIP 变量定义要扫描的 IP 地址范围,本例中为 1-254。
  • Ping Function: 扫描 IP 功能通过尝试建立 ICMP 连接来 Ping 一个 IP 地址。如果成功,则打印出该 IP 已 "启动"。
  • 并发:每个 IP 扫描都在单独的 Goroutine 中运行,由 sync.WaitGroup 管理,以确保程序在退出前等待所有扫描结束。

“IP is up” 是什么意思

当程序打印 "IP is up"(IP 已连接)时,表示程序成功向指定 IP 地址发送了 ICMP(ping)请求,并在允许的超时时间内收到了响应。

  1. 设备处于活动状态:表示网络上有设备正在使用该 IP 地址,并对 ping 请求做出响应。
  2. 网络可达性:IP 地址是可到达的,这意味着网络基础设施(路由器、交换机等)可以正确路由该 IP 地址的流量。

如果某个 IP 地址没有响应(即程序没有打印 "IP is up"),这可能意味着:

  • 该 IP 地址当前未分配给任何设备。
  • 使用该 IP 地址的设备已关闭或断开网络连接。
  • 设备或网络防火墙正在阻止 ICMP (ping) 请求。

Running the Scanner

go run main.go

程序将扫描指定范围内的 IP 地址,并打印出找到的任何活动 IP。输出:

$ go run main.go 

IP 192.168.1.1 is up
IP 192.168.1.5 is up
IP 192.168.1.75 is up
IP 192.168.1.10 is up
IP 192.168.1.76 is up
Scan complete

自定义

  • 网络范围:修改 main.go 中的 localIP、startIP 和 endIP 变量,以扫描不同的 IP 范围。
  • 超时:调整 DialTimeout 功能中的超时值,在扫描速度和精度之间取得平衡。

改进和需要考虑的因素

  • 可定制范围:修改 localIP、startIP 和 endIP 变量,扫描不同范围甚至不同网络。

  • 超时调整:调整 DialTimeout 功能中的超时时间,在扫描速度和准确性之间取得平衡。

  • 错误处理:程序目前忽略扫描过程中出现的错误。可能需要添加错误处理功能,尤其是针对不同类型的网络故障。

总结

只需几行 Go 代码,我们就能创建一个扫描网络的强大工具。这个 IP 扫描器可以帮助你随时查看连接了哪些设备,并确保网络上没有潜伏未经授权的设备。同时还能帮助你熟悉 Go 语言中网络编程和 Goroutine 并发。

同时可以扩展上面的代码,添加端口扫描等功能,或将其集成到更大的网络管理工具中。

 

Go Official Blog

 你的肯定是对我最大的鼓励 

赞赏二维码喜欢作者

Go blog 合集119 Go blog 合集 · 目录 上一篇Golang - 使用 GoFakeIt 生成 Mock 数据 阅读 369   ​

标签:ip,扫描,网络,golang,地址,IP,Go
From: https://www.cnblogs.com/cheyunhua/p/18399083

相关文章

  • onvif应用--IPC鉴权(认证)
    一、鉴权原理1)onvif的用户验证,是基于WS_UsernameToken,所谓的WS_UsernameToken加密,就是将用户名、密码、Nonce、Created都包含在了header里面参数意义username待认证的用户名Nonce客户端随机产生的字符串Created请求认证的UTC时间(格式:2023-11-29T08:05:52Z)PasswordDigest......
  • 目录扫描-dirsearch
    dirsearch.py-uhttps://www.xxxx///对xxxx进行目录扫描dirsearch.py-uhttps://www.xxxx/-i200//筛选状态码为200的结果dirsearch.py-uhttps://www.xxxx/-x401,403//排除状态码为401,403的结果dirsearch.py-uhttps://www.xxxx/-i200-oC:\Users\Administrat......
  • 从 iPhone 14/13/12/11/Xs Max/Xs 恢复已删除的联系人
    拥有iPhone14/13,您肯定不希望设备发生任何意外,尤其是数据丢失。但意外总是难免,比如您发现重要的联系人在iPhoneXsMax或iPhoneXs上不见了。那么,您有什么办法可以恢复它们呢? 常见导致iPhone联系人丢失的原因操作不当导致联系人丢失;手机病毒感染;恢复至出厂设置而......
  • php 通过ip获取国家和城市
    functiongetLocationInfoByIp(){ $client=@$_SERVER['HTTP_CLIENT_IP']; $forward=@$_SERVER['HTTP_X_FORWARDED_FOR']; $remote=@$_SERVER['REMOTE_ADDR']; $result=array('country'=>'','......
  • 解决swiper轮播时候点击click触发不了,且获取不到当前点击的数据问题
    查阅官网,可以通过监听on,以及clickedSlide解决。html代码如下:<divclass="swiperPlat"style="overflow:hidden;width:1200px;position:relative"><divclass="swiper-wrapper"style="w......
  • HCIP和HCIE,差别竟然这么大?
    我们都知道,在华为认证体系中,除了方向非常齐全之外,还分为三个等级的认证:这三个等级分别是HCIA、HCIP以及HCIEHCIA是基础级别的HCIP是资深级别的HCIE是专家级别的而这几个级别的认证中,HCIP和HCIE因为其含金量是更多人的选择。但是这两者到底选哪个比较好,HCIP和HCIE差别很大吗?01、考试......
  • 【转载】golang内存分配
     同时Go对于GC后回收的内存页,并不是马上归还给操作系统,而是会延迟归还,用于满足未来的内存需求.  在1.10以前go的堆地址空间是线性连续扩展的,比如在1.10(linuxamd64)中,最大可扩展到512GB.因为go在gc的时候会根据拿到的指针地址来判断是否位于......
  • 【JavaScript学习第六天】—讲述JS学习历程的知识分享!
    前言本篇主要讲述了面向对象开发的特点,对象和类的概念与区别,包括详细讲解一个Tab选项卡案例一、面向对象在引出面向对象之前,我们首先要了解面向过程的概念面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了......
  • 一文带你了解IP版本
    一、IP地址有哪些版本互联网协议的原始版本于1983年在互联网的前身ARPANET中首次部署,也就是互联网协议版本4(IPv4)。在发展过程中,IPv4逐渐成为了互联网的基础协议之一。然而可供分配的IPv4地址空间逐渐耗尽,这促使互联网工程任务组(IETF)探索新技术以扩展互联网的寻址能力。其结果是互联......
  • Python 之pip换源
    Python修改pip源为国内源1.临时换源:#清华源pipinstallmarkdown-ihttps://pypi.tuna.tsinghua.edu.cn/simple#阿里源pipinstallmarkdown-ihttps://mirrors.aliyun.com/pypi/simple/#腾讯源pipinstallmarkdown-ihttp://mirrors.cloud.tencent.com/pypi/sim......