mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-09-27 03:36:09 +08:00
112 lines
2.4 KiB
Go
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
|
|
}
|