golang实现ip地址扫描

Golang 实现 IP 地址扫描

原创 Go Official Blog Go Official Blog
 

你是否想过哪些设备连接到了家里的 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 合集 · 目录
上一篇Golang - 使用 GoFakeIt 生成 Mock 数据
阅读 369
 
posted @ 2024-09-05 19:14  技术颜良  阅读(29)  评论(0编辑  收藏  举报