Golang 實現 IP 地址掃描
你是否想過哪些設備連接到了家裏的 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 併發。
同時可以擴展上面的代碼,添加端口掃描等功能,或將其集成到更大的網絡管理工具中。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Eom7V2yQXIkP8GINHcdS7Q