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)请求,并在允许的超时时间内收到了响应。
- 设备处于活动状态:表示网络上有设备正在使用该 IP 地址,并对 ping 请求做出响应。
- 网络可达性: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