Files
kubevpn/pkg/util/net.go
2023-10-29 17:11:53 +08:00

112 lines
2.4 KiB
Go

package util
import (
"fmt"
"net"
"strings"
"time"
"github.com/cilium/ipam/service/allocator"
"github.com/cilium/ipam/service/ipallocator"
"github.com/prometheus-community/pro-bing"
"github.com/wencaiwulue/kubevpn/pkg/config"
)
func GetTunDevice(ips ...net.IP) (*net.Interface, error) {
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, i := range interfaces {
addrs, err := i.Addrs()
if err != nil {
return nil, err
}
for _, addr := range addrs {
for _, ip := range ips {
if strings.Contains(addr.String(), ip.String()) {
return &i, nil
}
}
}
}
return nil, fmt.Errorf("can not found any interface with ip %v", ips)
}
func GetTunDeviceByConn(tun net.Conn) (*net.Interface, error) {
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
var ip string
if tunIP, ok := tun.LocalAddr().(*net.IPNet); ok {
ip = tunIP.IP.String()
} else {
ip = tun.LocalAddr().String()
}
for _, i := range interfaces {
addrs, err := i.Addrs()
if err != nil {
return nil, err
}
for _, addr := range addrs {
if strings.Contains(addr.String(), tun.LocalAddr().String()) {
return &i, nil
}
}
}
return nil, fmt.Errorf("can not found any interface with ip %v", ip)
}
func Ping(targetIP string) (bool, error) {
pinger, err := probing.NewPinger(targetIP)
if err != nil {
return false, err
}
pinger.SetLogger(nil)
pinger.SetPrivileged(true)
pinger.Count = 3
pinger.Timeout = time.Millisecond * 1500
err = pinger.Run() // Blocks until finished.
if err != nil {
return false, err
}
stat := pinger.Statistics()
return stat.PacketsRecv == stat.PacketsSent, err
}
func IsIPv4(packet []byte) bool {
return 4 == (packet[0] >> 4)
}
func IsIPv6(packet []byte) bool {
return 6 == (packet[0] >> 4)
}
func GetIPBaseNic() (*net.IPNet, error) {
addrs, _ := net.InterfaceAddrs()
var sum int
for _, addr := range addrs {
ip, _, _ := net.ParseCIDR(addr.String())
for _, b := range ip {
sum = sum + int(b)
}
}
dhcp, err := ipallocator.NewAllocatorCIDRRange(config.DockerCIDR, func(max int, rangeSpec string) (allocator.Interface, error) {
return allocator.NewContiguousAllocationMap(max, rangeSpec), nil
})
if err != nil {
return nil, err
}
var next net.IP
for i := 0; i < sum%255; i++ {
next, err = dhcp.AllocateNext()
}
if err != nil {
return nil, err
}
_, bits := config.DockerCIDR.Mask.Size()
return &net.IPNet{IP: next, Mask: net.CIDRMask(bits, bits)}, nil
}