Golang 實現 IP 地址掃描

你是否想過哪些設備連接到了家裏的 Wi-Fi 網絡?無論是出於安全目的還是單純的好奇心,我們都可以去了解一下家庭網絡中的設備情況。在本文中,我們將介紹如何使用 Go 構建一個簡單的 IP 地址掃描器,它可以掃描家庭網絡並列出所有活動設備。

爲什麼要構建 Ip scanner

市面上有很多網絡掃描工具,但自己構建網絡掃描工具能讓我們靈活地理解和修改代碼,以滿足需求。此外,這還是學習 Go 網絡編程的好方法。有了這個工具,你就能識別網絡上的設備,幫助你檢測任何未經授權的訪問,或查看連接的設備。

介紹

我們的 IP 地址掃描器將通過向指定範圍內的每個 IP 地址發送 ICMP(ping)請求來工作。如果設備響應,則認爲該設備處於活動狀態。掃描儀將:

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")
}

代碼解釋

“IP is up” 是什麼意思

當程序打印 "IP is up"(IP 已連接)時,表示程序成功向指定 IP 地址發送了 ICMP(ping)請求,並在允許的超時時間內收到了響應。

  1. 設備處於活動狀態:表示網絡上有設備正在使用該 IP 地址,並對 ping 請求做出響應。

  2. 網絡可達性:IP 地址是可到達的,這意味着網絡基礎設施(路由器、交換機等)可以正確路由該 IP 地址的流量。

如果某個 IP 地址沒有響應(即程序沒有打印 "IP is up"),這可能意味着:

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

自定義

改進和需要考慮的因素

總結

只需幾行 Go 代碼,我們就能創建一個掃描網絡的強大工具。這個 IP 掃描器可以幫助你隨時查看連接了哪些設備,並確保網絡上沒有潛伏未經授權的設備。同時還能幫助你熟悉 Go 語言中網絡編程和 Goroutine 併發。

同時可以擴展上面的代碼,添加端口掃描等功能,或將其集成到更大的網絡管理工具中。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Eom7V2yQXIkP8GINHcdS7Q