ip

package
v1.7.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 16, 2025 License: Apache-2.0 Imports: 11 Imported by: 1

README

IP - IP地址管理模块

📋 功能概述

IP模块提供了全面的IP地址管理功能,包括公网IPv4/IPv6地址获取、本地网络地址分析、IP范围计算和网段管理等。支持获取本机公网地址、指定网卡的IP地址,以及计算IP范围等实用功能。

✨ 核心功能

🌍 公网IP获取
  • IPv4公网地址: 多API服务支持,确保获取成功率
  • IPv6公网地址: 自动过滤本地和临时地址
  • 指定网卡: 支持获取特定网卡的公网地址
  • 容错机制: 多个API服务依次尝试,提高可靠性
🏠 本地网络管理
  • 默认网段: 获取本机默认网卡的网段信息
  • 网段遍历: 列出网段内的所有IP地址
  • 网络接口: 集成eth模块的网络接口管理
🔢 IP范围计算
  • CIDR解析: 支持CIDR表示法的IP范围生成
  • 掩码计算: 根据IP和子网掩码生成IP列表
  • 范围限制: 智能限制防止过大范围导致性能问题
  • 批量生成: 一次性生成完整的IP列表
🔧 统一管理
  • IPManager: 统一管理所有IP相关功能
  • 标准化接口: 一致的API设计和使用方式
  • 错误处理: 完善的错误信息和异常处理

📁 文件结构

info.go - 核心数据结构
// ipv4IPW - IPv4查询结果结构
type ipv4IPW struct {
    Result    bool   `json:"result"`    // 查询是否成功
    Code      string `json:"code"`      // 返回码
    Message   string `json:"message"`   // 返回信息
    IP        string `json:"IP"`        // IP地址
    IPVersion string `json:"IPVersion"` // IP版本
}

// ipv4Uomg - IPv4用户操作信息
type ipv4Uomg struct {
    Code    string `json:"code"`    // 返回码
    System  string `json:"system"`  // 系统信息
    IP      string `json:"ip"`      // IP地址
    Browser string `json:"browser"` // 浏览器信息
    Time    string `json:"time"`    // 时间
}

// IPManager - IP统一管理器
type IPManager struct{}
ipv4.go - IPv4功能实现
// 获取本机公网IPv4地址
func GetPublicIpv4() (string, error)

// 获取指定网卡的公网IPv4地址
func GetPublicIpv4Eth(ethName string) (net.IP, error)

// 创建绑定客户端
func createBoundClient(bindIP net.IP) *http.Client
ipv6.go - IPv6功能实现
// 获取公网IPv6地址列表
func GetPublicIpv6() ([]net.IP, error)

// 获取所有IPv6地址
func GetIpv6() ([]net.IP, error)

// 获取指定网卡的公网IPv6地址
func GetPublicIpv6Eth(ethName string) ([]net.IP, error)
local.go - 本地网络功能
// 获取默认网卡的网段
func GetDefaultNetworkSubnet() ([]net.IP, error)

// 打印默认网段内所有IP
func PrintDefaultNetworkSubnet() error
range.go - IP范围计算
// CIDR转IP范围
func CIDRToIPRange(cidr string) ([]net.IP, error)

// IP+掩码转IP范围
func IPsInSubnet(baseIP, subnetMask string) ([]net.IP, error)

// 打印IP范围
func PrintIPRange(cidr string) error
ipv4_utils.go - IPv4工具函数
// 通过uomg.com获取公网IP
func getPublicIpv4Sb(client *http.Client) (string, error)

// 通过uomg API获取IP信息
func getIpv4Uomg(client *http.Client) (string, error)

// 通过ipw.cn获取公网IP
func getPublicIP1Ipw(client *http.Client) (string, error)

🚀 使用示例

公网IPv4地址获取
package main

import (
    "fmt"
    "gitee.com/liumou_site/gns/ip"
)

func main() {
    // 获取本机公网IPv4地址
    publicIP, err := ip.GetPublicIpv4()
    if err != nil {
        fmt.Printf("获取公网IP失败: %v\n", err)
        return
    }
    fmt.Printf("✓ 本机公网IPv4地址: %s\n", publicIP)
    
    // 使用IP管理器获取
    manager := ip.NewIPManager()
    publicIP2, err := manager.GetPublicIPv4()
    if err != nil {
        fmt.Printf("IP管理器获取失败: %v\n", err)
        return
    }
    fmt.Printf("✓ IP管理器获取的公网IP: %s\n", publicIP2)
}
指定网卡公网IP获取
// 获取指定网卡的公网IPv4地址
func getEthPublicIP() {
    // 先获取网卡列表
    ethManager := eth.NewEth(false)
    ethList := ethManager.GetEthList()
    
    if len(ethList) == 0 {
        fmt.Println("未找到网络接口")
        return
    }
    
    // 获取第一个网卡的公网IP
    firstEth := ethList[0]
    fmt.Printf("正在获取 %s 网卡的公网IP...\n", firstEth)
    
    publicIP, err := ip.GetPublicIpv4Eth(firstEth)
    if err != nil {
        fmt.Printf("获取 %s 网卡公网IP失败: %v\n", firstEth, err)
        return
    }
    
    fmt.Printf("✓ %s 网卡公网IP: %s\n", firstEth, publicIP.String())
}
IPv6地址管理
// 获取所有IPv6地址
func getAllIPv6() {
    ipv6List, err := ip.GetIpv6()
    if err != nil {
        fmt.Printf("获取IPv6地址失败: %v\n", err)
        return
    }
    
    fmt.Printf("找到 %d 个IPv6地址:\n", len(ipv6List))
    for i, ipv6 := range ipv6List {
        fmt.Printf("  IPv6 #%d: %s\n", i+1, ipv6.String())
    }
}

// 获取公网IPv6地址
func getPublicIPv6() {
    publicIPv6, err := ip.GetPublicIpv6()
    if err != nil {
        fmt.Printf("获取公网IPv6失败: %v\n", err)
        return
    }
    
    fmt.Printf("找到 %d 个公网IPv6地址:\n", len(publicIPv6))
    for i, ipv6 := range publicIPv6 {
        fmt.Printf("  公网IPv6 #%d: %s\n", i+1, ipv6.String())
    }
}
本地网段管理
// 获取默认网段信息
func getDefaultSubnet() {
    ips, err := ip.GetDefaultNetworkSubnet()
    if err != nil {
        fmt.Printf("获取默认网段失败: %v\n", err)
        return
    }
    
    fmt.Printf("默认网段包含 %d 个IP:\n", len(ips))
    for i, ipAddr := range ips {
        if i < 10 { // 只显示前10个
            fmt.Printf("  IP #%d: %s\n", i+1, ipAddr.String())
        } else if i == 10 {
            fmt.Printf("  ... (还有 %d 个IP)\n", len(ips)-10)
            break
        }
    }
}

// 打印默认网段所有IP
func printDefaultSubnetIPs() {
    fmt.Println("=== 打印默认网段所有IP ===")
    err := ip.PrintDefaultNetworkSubnet()
    if err != nil {
        fmt.Printf("打印失败: %v\n", err)
    }
}
IP范围计算
// CIDR范围计算
func calculateCIDRRange() {
    cidrExamples := []string{
        "192.168.1.0/24",
        "10.0.0.0/28",
        "172.16.0.0/16",
    }
    
    for _, cidr := range cidrExamples {
        fmt.Printf("\n计算 %s 范围内的IP:\n", cidr)
        ips, err := ip.CIDRToIPRange(cidr)
        if err != nil {
            fmt.Printf("  计算失败: %v\n", err)
            continue
        }
        
        fmt.Printf("  找到 %d 个IP地址:\n", len(ips))
        for i, ipAddr := range ips {
            if i < 5 { // 只显示前5个
                fmt.Printf("    IP #%d: %s\n", i+1, ipAddr.String())
            } else if i == 5 {
                fmt.Printf("    ... (还有 %d 个IP)\n", len(ips)-5)
                break
            }
        }
    }
}

// IP+掩码范围计算
func calculateSubnetRange() {
    examples := []struct {
        ip       string
        mask     string
        desc     string
    }{
        {"192.168.1.100", "255.255.255.0", "C类网络"},
        {"10.0.0.50", "255.255.0.0", "B类网络"},
        {"172.16.5.10", "255.255.255.252", "点对点网络"},
    }
    
    for _, example := range examples {
        fmt.Printf("\n计算 %s (%s) 网络范围:\n", example.ip, example.desc)
        ips, err := ip.IPsInSubnet(example.ip, example.mask)
        if err != nil {
            fmt.Printf("  计算失败: %v\n", err)
            continue
        }
        
        fmt.Printf("  网络范围: %s\n", ips[0].String())
        fmt.Printf("  广播地址: %s\n", ips[len(ips)-1].String())
        fmt.Printf("  总IP数: %d\n", len(ips))
        
        if len(ips) <= 10 {
            for i, ipAddr := range ips {
                fmt.Printf("    IP #%d: %s\n", i+1, ipAddr.String())
            }
        }
    }
}

// 打印IP范围
func printIPRangeExamples() {
    cidr := "192.168.1.0/30" // /30网络,只有4个IP
    fmt.Printf("打印 %s 范围内的所有IP:\n", cidr)
    err := ip.PrintIPRange(cidr)
    if err != nil {
        fmt.Printf("打印失败: %v\n", err)
    }
}
综合IP管理
// 综合IP信息获取
func comprehensiveIPInfo() {
    fmt.Println("=== 综合IP信息获取 ===")
    
    // 1. 公网IPv4
    fmt.Println("\n1. 公网IPv4地址:")
    publicIPv4, err := ip.GetPublicIpv4()
    if err != nil {
        fmt.Printf("   获取失败: %v\n", err)
    } else {
        fmt.Printf("   ✓ %s\n", publicIPv4)
    }
    
    // 2. 公网IPv6
    fmt.Println("\n2. 公网IPv6地址:")
    publicIPv6, err := ip.GetPublicIpv6()
    if err != nil {
        fmt.Printf("   获取失败: %v\n", err)
    } else {
        for i, ipv6 := range publicIPv6 {
            fmt.Printf("   ✓ IPv6 #%d: %s\n", i+1, ipv6.String())
        }
    }
    
    // 3. 默认网段
    fmt.Println("\n3. 默认网段信息:")
    defaultIPs, err := ip.GetDefaultNetworkSubnet()
    if err != nil {
        fmt.Printf("   获取失败: %v\n", err)
    } else {
        fmt.Printf("   网段大小: %d 个IP\n", len(defaultIPs))
        if len(defaultIPs) > 0 {
            fmt.Printf("   网络地址: %s\n", defaultIPs[0].String())
            fmt.Printf("   广播地址: %s\n", defaultIPs[len(defaultIPs)-1].String())
        }
    }
    
    // 4. 本地IPv6
    fmt.Println("\n4. 本地IPv6地址:")
    localIPv6, err := ip.GetIpv6()
    if err != nil {
        fmt.Printf("   获取失败: %v\n", err)
    } else {
        for i, ipv6 := range localIPv6 {
            fmt.Printf("   ✓ IPv6 #%d: %s\n", i+1, ipv6.String())
        }
    }
}
网络扫描准备
// 为网络扫描准备IP列表
func prepareNetworkScan() {
    // 获取默认网段
    defaultIPs, err := ip.GetDefaultNetworkSubnet()
    if err != nil {
        fmt.Printf("获取默认网段失败: %v\n", err)
        return
    }
    
    fmt.Printf("准备扫描 %d 个IP地址\n", len(defaultIPs))
    
    // 可以将IP列表传递给其他模块进行扫描
    // 比如传递给ARP扫描器或端口扫描器
    
    // 示例:过滤特定IP范围
    scanTargets := []net.IP{}
    for _, ipAddr := range defaultIPs {
        // 排除网络地址和广播地址
        if ipAddr.String() != defaultIPs[0].String() && 
           ipAddr.String() != defaultIPs[len(defaultIPs)-1].String() {
            scanTargets = append(scanTargets, ipAddr)
        }
    }
    
    fmt.Printf("实际可扫描IP数量: %d\n", len(scanTargets))
    
    // 显示前10个扫描目标
    for i, target := range scanTargets {
        if i < 10 {
            fmt.Printf("  扫描目标 #%d: %s\n", i+1, target.String())
        } else {
            break
        }
    }
}

🔧 配置说明

IP范围限制
  • 最大支持4096个IP地址的生成
  • 超过限制会返回错误以保护系统性能
  • 建议合理设置CIDR范围
公网IP获取策略
  • 多个API服务依次尝试
  • 支持绑定到特定网卡的HTTP客户端
  • 3秒超时设置,避免长时间等待
IPv6筛选规则
  • 排除回环地址 (127.0.0.1, ::1)
  • 排除链路本地地址 (fe80::/10)
  • 排除临时地址 (2001:db8::/32)
  • 只保留公网地址 (240.0.0.0/4)

⚠️ 注意事项

  1. 网络权限:

    • 获取公网IP需要网络连接
    • 某些网络环境可能限制外部API访问
  2. API依赖:

    • 公网IP获取依赖外部API服务
    • API服务可用性可能影响获取成功率
  3. 性能考虑:

    • 大范围IP生成可能消耗较多内存
    • 建议控制CIDR范围大小
  4. IPv6支持:

    • IPv6功能可能在某些系统上不可用
    • 需要系统支持IPv6协议栈
  5. 并发安全:

    • IP模块不是并发安全的
    • 多线程使用需要适当的同步机制

📊 API参考

主要函数
函数 参数 返回值 说明
GetPublicIpv4() string, error 获取公网IPv4
GetPublicIpv4Eth() ethName net.IP, error 指定网卡公网IPv4
GetPublicIpv6() []net.IP, error 获取公网IPv6
GetIpv6() []net.IP, error 获取所有IPv6
CIDRToIPRange() cidr []net.IP, error CIDR转IP列表
IPsInSubnet() ip, mask []net.IP, error IP+掩码转列表
IPManager方法
方法 参数 返回值 说明
GetPublicIPv4() string, error 获取公网IPv4
GetPublicIPv4Eth() ethName net.IP, error 指定网卡公网IPv4

🔗 相关模块

  • eth - 网络接口管理
  • arp - ARP协议支持
  • detect - 综合网络检测
  • gns - 核心网络工具集成

📖 相关文档

💡 使用技巧

  1. API容错: 利用多个API服务提高公网IP获取成功率
  2. 范围控制: 合理设置CIDR范围,避免过大范围影响性能
  3. IPv6过滤: 理解IPv6地址筛选规则,获得准确的公网地址
  4. 网络诊断: 结合本地网段信息进行网络故障诊断
  5. 扫描准备: 使用IP范围功能为网络扫描准备目标列表

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CIDRToIPRange added in v1.6.0

func CIDRToIPRange(cidr string) ([]net.IP, error)

CIDRToIPRange 根据CIDR表示的子网范围生成所有IP地址

func GetDefaultNetworkSubnet added in v1.6.0

func GetDefaultNetworkSubnet() ([]net.IP, error)

GetDefaultNetworkSubnet 获取本机默认网卡的网段信息

func GetIpv6

func GetIpv6() ([]net.IP, error)

GetIpv6 获取系统中所有的非回环、非链路本地和非临时的IPv6地址

返回值:

- []net.IP: 包含符合条件的IPv6地址的切片

- error: 如果没有找到符合条件的IPv6地址,则返回错误

func GetIpv6Eth added in v1.5.6

func GetIpv6Eth(eth string) ([]net.IP, error)

GetIpv6Eth 获取指定网卡的IPv6地址(包含私有地址) 该函数遍历所有网络接口,寻找与指定网卡名称匹配的接口,并尝试获取其IPv6地址。 参数:

eth: 网卡名称,例如 "eth0"。

返回值:

net.IP: 网卡的IPv6地址。
error: 如果找不到指定网卡或获取IPv6地址失败,则返回错误。

func GetPublicIpv4

func GetPublicIpv4() (string, error)

GetPublicIpv4 获取本机的公网IPv4地址

该函数会尝试多个IP查询服务,按以下顺序尝试:

1. 首先尝试从 uomg.com 获取IP地址

2. 如果第一个服务失败,则尝试从 ipw.cn 获取IP地址

返回值:

  • string: 获取到的IP地址字符串
  • error: 如果所有服务都失败则返回最后一个错误

func GetPublicIpv4Eth added in v1.5.7

func GetPublicIpv4Eth(ethName string) (net.IP, error)

GetPublicIpv4Eth 获取指定网卡的公网IPv4地址。

参数:

  • ethName: 要获取公网IP的网卡名称

返回值:

  • net.IP: 获取到的公网IPv4地址
  • error: 获取过程中出现的错误s

func GetPublicIpv6 added in v1.5.7

func GetPublicIpv6() ([]net.IP, error)

GetPublicIpv6 获取系统的公网IPv6地址。

返回值:

- []net.IP: 包含公网IPv6地址的切片。

- error: 如果获取失败,则返回错误信息。

func GetPublicIpv6Eth added in v1.5.6

func GetPublicIpv6Eth(eth string) ([]net.IP, error)

GetPublicIpv6Eth 获取指定网卡的公共IPv6地址。 该函数首先调用GetIpv6Eth来获取指定网卡的所有IPv6地址, 然后筛选出以"240"开头的IPv6地址,将其作为结果返回。 参数:

eth - 网卡名称,例如"eth0"。

返回值:

[]net.IP - 筛选后的公共IPv6地址列表。
error - 如果获取IPv6地址时发生错误,则返回该错误。

func IPsInSubnet added in v1.6.0

func IPsInSubnet(baseIP, subnetMask string) ([]net.IP, error)

IPsInSubnet 根据IP地址和子网掩码生成所有IP地址

func PrintDefaultNetworkSubnet added in v1.6.0

func PrintDefaultNetworkSubnet() error

PrintDefaultNetworkSubnet 打印本机默认网卡网段内的所有IP地址

func PrintIPRange added in v1.6.0

func PrintIPRange(cidr string) error

PrintIPRange 打印指定CIDR范围内的所有IP地址

Types

type IPManager added in v1.6.0

type IPManager struct{}

IPManager 统一的IP管理结构体,绑定所有ip相关功能

func NewIPManager added in v1.6.0

func NewIPManager() *IPManager

NewIPManager 创建并初始化一个新的IPManager实例

func (*IPManager) CIDRToIPRange added in v1.6.0

func (im *IPManager) CIDRToIPRange(cidr string) ([]net.IP, error)

CIDRToIPRange 根据CIDR表示的子网范围生成所有IP地址

func (*IPManager) GetDefaultNetworkSubnet added in v1.6.0

func (im *IPManager) GetDefaultNetworkSubnet() ([]net.IP, error)

GetDefaultNetworkSubnet 获取本机默认网卡的网段信息

func (*IPManager) GetIPv6 added in v1.6.0

func (im *IPManager) GetIPv6() ([]net.IP, error)

GetIPv6 获取系统中所有的非回环、非链路本地和非临时的IPv6地址

func (*IPManager) GetIPv6Eth added in v1.6.0

func (im *IPManager) GetIPv6Eth(eth string) ([]net.IP, error)

GetIPv6Eth 获取指定网卡的IPv6地址

func (*IPManager) GetPublicIPv4 added in v1.6.0

func (im *IPManager) GetPublicIPv4() (string, error)

GetPublicIPv4 获取本机的公网IPv4地址

func (*IPManager) GetPublicIPv4Eth added in v1.6.0

func (im *IPManager) GetPublicIPv4Eth(ethName string) (net.IP, error)

GetPublicIPv4Eth 获取指定网卡的公网IPv4地址

func (*IPManager) GetPublicIPv6 added in v1.6.0

func (im *IPManager) GetPublicIPv6() ([]net.IP, error)

GetPublicIPv6 获取系统的公网IPv6地址

func (*IPManager) GetPublicIPv6Eth added in v1.6.0

func (im *IPManager) GetPublicIPv6Eth(eth string) ([]net.IP, error)

GetPublicIPv6Eth 获取指定网卡的公共IPv6地址

func (*IPManager) IPsInSubnet added in v1.6.0

func (im *IPManager) IPsInSubnet(baseIP, subnetMask string) ([]net.IP, error)

IPsInSubnet 根据IP地址和子网掩码生成所有IP地址

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL