问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Golang实现IP地址扫描

创作时间:
作者:
@小白创作中心

Golang实现IP地址扫描

引用
1
来源
1.
https://www.cnblogs.com/cheyunhua/p/18399083

你是否想过哪些设备连接到了家里的 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 并发。

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号