// RequestPort requests new port from global ports pool for specified ip and proto. // If port is 0 it returns first free port. Otherwise it cheks port availability // in pool and return that port or error if port is already busy. func RequestPort(ip net.IP, proto string, port int) (int, error) { mutex.Lock() defer mutex.Unlock() if proto != "tcp" && proto != "udp" { return 0, ErrUnknownProtocol } if ip == nil { ip = defaultIP } ipstr := ip.String() protomap, ok := globalMap[ipstr] if !ok { protomap = newProtoMap() globalMap[ipstr] = protomap } mapping := protomap[proto] if port > 0 { if _, ok := mapping.p[port]; !ok { mapping.p[port] = struct{}{} return port, nil } return 0, NewErrPortAlreadyAllocated(ipstr, port) } port, err := mapping.findPort() if err != nil { return 0, err } return port, nil }
func (n *network) deleteSvcRecords(name string, epIP net.IP, ipMapUpdate bool) { c := n.getController() c.Lock() defer c.Unlock() sr, ok := c.svcDb[n.ID()] if !ok { return } if ipMapUpdate { delete(sr.ipMap, netutils.ReverseIP(epIP.String())) } ipList := sr.svcMap[name] for i, ip := range ipList { if ip.Equal(epIP) { ipList = append(ipList[:i], ipList[i+1:]...) break } } sr.svcMap[name] = ipList if len(ipList) == 0 { delete(sr.svcMap, name) } }
// GetPrivateIP returns the first private IP address found in a list of // addresses. func GetPrivateIP(addresses []net.Addr) (net.IP, error) { var candidates []net.IP // Find private IPv4 address for _, rawAddr := range addresses { var ip net.IP switch addr := rawAddr.(type) { case *net.IPAddr: ip = addr.IP case *net.IPNet: ip = addr.IP default: continue } if ip.To4() == nil { continue } if !IsPrivateIP(ip.String()) { continue } candidates = append(candidates, ip) } numIps := len(candidates) switch numIps { case 0: return nil, fmt.Errorf("No private IP address found") case 1: return candidates[0], nil default: return nil, fmt.Errorf("Multiple private IPs found. Please configure one.") } }
func interfaceGot(index int, pciAddr int, name string, inf *network.Settings) (*InterfaceCreated, error) { ip, nw, err := net.ParseCIDR(fmt.Sprintf("%s/%d", inf.IPAddress, inf.IPPrefixLen)) if err != nil { glog.Error("can not parse cidr") return &InterfaceCreated{Index: index, PCIAddr: pciAddr, DeviceName: name}, err } var tmp []byte = nw.Mask var mask net.IP = tmp rt := []*RouteRule{} /* Route rule is generated automaticly on first interface, * or generated on the gateway configured interface. */ if (index == 0 && inf.Automatic) || (!inf.Automatic && inf.Gateway != "") { rt = append(rt, &RouteRule{ Destination: "0.0.0.0/0", Gateway: inf.Gateway, ViaThis: true, }) } return &InterfaceCreated{ Index: index, PCIAddr: pciAddr, Bridge: inf.Bridge, HostDevice: inf.Device, DeviceName: name, Fd: inf.File, MacAddr: inf.Mac, IpAddr: ip.String(), NetMask: mask.String(), RouteTable: rt, }, nil }
// getDNSRecordTypeByIP returns the DNS record type for the given IP. // It will return "A" for an IPv4 address and "AAAA" for an IPv6 address. func getDNSRecordTypeByIP(ip net.IP) string { if ip.To4() == nil { return "AAAA" } return "A" }
func IpToRadixkey(prefix net.IP, prefixLen uint8) string { b := prefix.To4() if b == nil { b = prefix.To16() } return toRadixkey(b, prefixLen) }
// Marks a port as being owned by a particular service, or returns error if already claimed. // Idempotent: reclaiming with the same owner is not an error func (proxier *Proxier) claimNodePort(ip net.IP, port int, protocol api.Protocol, owner proxy.ServicePortName) error { proxier.portMapMutex.Lock() defer proxier.portMapMutex.Unlock() // TODO: We could pre-populate some reserved ports into portMap and/or blacklist some well-known ports key := portMapKey{ip: ip.String(), port: port, protocol: protocol} existing, found := proxier.portMap[key] if !found { // Hold the actual port open, even though we use iptables to redirect // it. This ensures that a) it's safe to take and b) that stays true. // NOTE: We should not need to have a real listen()ing socket - bind() // should be enough, but I can't figure out a way to e2e test without // it. Tools like 'ss' and 'netstat' do not show sockets that are // bind()ed but not listen()ed, and at least the default debian netcat // has no way to avoid about 10 seconds of retries. socket, err := newProxySocket(protocol, ip, port) if err != nil { return fmt.Errorf("can't open node port for %s: %v", key.String(), err) } proxier.portMap[key] = &portMapValue{owner: owner, socket: socket} glog.V(2).Infof("Claimed local port %s", key.String()) return nil } if existing.owner == owner { // We are idempotent return nil } return fmt.Errorf("Port conflict detected on port %s. %v vs %v", key.String(), owner, existing) }
func (d *driver) resolvePeer(nid string, peerIP net.IP) (net.HardwareAddr, net.IPMask, net.IP, error) { qPayload := fmt.Sprintf("%s %s", string(nid), peerIP.String()) resp, err := d.serfInstance.Query("peerlookup", []byte(qPayload), nil) if err != nil { return nil, nil, nil, fmt.Errorf("resolving peer by querying the cluster failed: %v", err) } respCh := resp.ResponseCh() select { case r := <-respCh: var macStr, maskStr, vtepStr string if _, err := fmt.Sscan(string(r.Payload), &macStr, &maskStr, &vtepStr); err != nil { return nil, nil, nil, fmt.Errorf("bad response %q for the resolve query: %v", string(r.Payload), err) } mac, err := net.ParseMAC(macStr) if err != nil { return nil, nil, nil, fmt.Errorf("failed to parse mac: %v", err) } return mac, net.IPMask(net.ParseIP(maskStr).To4()), net.ParseIP(vtepStr), nil case <-time.After(time.Second): return nil, nil, nil, fmt.Errorf("timed out resolving peer by querying the cluster") } }
// GetLocalIP return the first external-IP4 configured for the first // interface connected to this node. func GetLocalIP() (net.IP, error) { interfaces, err := net.Interfaces() if err != nil { return nil, err } for _, iface := range interfaces { if (iface.Flags & net.FlagUp) == 0 { continue // interface down } if (iface.Flags & net.FlagLoopback) != 0 { continue // loopback interface } addrs, err := iface.Addrs() if err != nil { return nil, err } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } if ip != nil && !ip.IsLoopback() { if ip = ip.To4(); ip != nil { return ip, nil } } } } return nil, errors.New("cannot find local IP address") }
// // 获取带有指定Prefix的Ip // func GetIpWithPrefix(prefix string) string { ifaces, _ := net.Interfaces() // handle err for _, i := range ifaces { addrs, _ := i.Addrs() // handle err for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } ipAddr := ip.String() // fmt.Println("ipAddr: ", ipAddr) if strings.HasPrefix(ipAddr, prefix) { return ipAddr } } } return "" }
// GetIfacesByIP searches for and returns the interfaces with the given IP // Disregards the subnet mask since not every net.IP object contains // On success it will return the list of found interfaces func (n *Networking) GetIfacesByIP(ifaceIP net.IP) ([]net.Interface, error) { ifaces, err := net.Interfaces() if err != nil { return nil, err } searchAddr := strings.Split(ifaceIP.String(), "/")[0] resultInterfaces := make([]net.Interface, 0) for _, iface := range ifaces { if iface.Flags&net.FlagLoopback != 0 { continue } addrs, err := iface.Addrs() if err != nil { return nil, errwrap.Wrap(fmt.Errorf("cannot get addresses for interface %v", iface.Name), err) } for _, addr := range addrs { currentAddr := strings.Split(addr.String(), "/")[0] if searchAddr == currentAddr { resultInterfaces = append(resultInterfaces, iface) break } } } if len(resultInterfaces) == 0 { return nil, fmt.Errorf("no interface found with IP %q", ifaceIP) } return resultInterfaces, nil }
// bigForIP creates a big.Int based on the provided net.IP func bigForIP(ip net.IP) *big.Int { b := ip.To4() if b == nil { b = ip.To16() } return big.NewInt(0).SetBytes(b) }
func lookup(stmt *sql.Stmt, IP net.IP, nIP uint32) (*GeoIP, error) { var reserved bool for _, net := range reservedIPs { if net.Contains(IP) { reserved = true break } } geoip := GeoIP{Ip: IP.String()} if reserved { geoip.CountryCode = "RD" geoip.CountryName = "Reserved" } else { if err := stmt.QueryRow(nIP).Scan( &geoip.CountryCode, &geoip.CountryName, &geoip.RegionCode, &geoip.RegionName, &geoip.CityName, &geoip.ZipCode, &geoip.Latitude, &geoip.Longitude, &geoip.MetroCode, &geoip.AreaCode, ); err != nil { return nil, err } } return &geoip, nil }
// Validate given node IP belongs to the current host func (kl *Kubelet) validateNodeIP() error { if kl.nodeIP == nil { return nil } // Honor IP limitations set in setNodeStatus() if kl.nodeIP.IsLoopback() { return fmt.Errorf("nodeIP can't be loopback address") } if kl.nodeIP.To4() == nil { return fmt.Errorf("nodeIP must be IPv4 address") } addrs, err := net.InterfaceAddrs() if err != nil { return err } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } if ip != nil && ip.Equal(kl.nodeIP) { return nil } } return fmt.Errorf("Node IP: %q not found in the host's network interfaces", kl.nodeIP.String()) }
// Request answers a dhcp request // Uses etcd as backend // part of DHCPDataSource interface implementation func (ds *EtcdDataSource) Request(nic string, currentIP net.IP) (net.IP, error) { ds.lockDHCPAssign() defer ds.unlockdhcpAssign() machines, _ := ds.Machines() macExists, ipExists := false, false for _, node := range machines { thisNodeIP, _ := node.IP() ipMatch := thisNodeIP.String() == currentIP.String() macMatch := nic == node.Mac().String() if ipMatch && macMatch { ds.store(node, thisNodeIP) return currentIP, nil } ipExists = ipExists || ipMatch macExists = macExists || macMatch } if ipExists || macExists { return nil, errors.New("Missmatch in lease pool") } macAddress, _ := net.ParseMAC(nic) ds.CreateMachine(macAddress, currentIP) return currentIP, nil }
// GetPrivateIP is used to return the first private IP address // associated with an interface on the machine func GetPrivateIP() (net.IP, error) { addresses, err := net.InterfaceAddrs() if err != nil { return nil, fmt.Errorf("Failed to get interface addresses: %v", err) } // Find private IPv4 address for _, rawAddr := range addresses { var ip net.IP switch addr := rawAddr.(type) { case *net.IPAddr: ip = addr.IP case *net.IPNet: ip = addr.IP default: continue } if ip.To4() == nil { continue } if !isPrivateIP(ip.String()) { continue } return ip, nil } return nil, fmt.Errorf("No private IP address found") }
// Gets the ipv4 addr for a network interface func (f *NetworkFingerprint) ipAddress(intf *net.Interface) (string, error) { var addrs []net.Addr var err error if addrs, err = f.interfaceDetector.Addrs(intf); err != nil { return "", err } if len(addrs) == 0 { return "", errors.New(fmt.Sprintf("Interface %s has no IP address", intf.Name)) } for _, addr := range addrs { var ip net.IP switch v := (addr).(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } if ip.To4() != nil { return ip.String(), nil } } return "", fmt.Errorf("Couldn't parse IP address for interface %s", intf.Name) }
func pbToValidationRecord(in *corepb.ValidationRecord) (record core.ValidationRecord, err error) { if in == nil { return core.ValidationRecord{}, ErrMissingParameters } if in.AddressUsed == nil || in.Hostname == nil || in.Port == nil || in.Url == nil { return core.ValidationRecord{}, ErrMissingParameters } addrs := make([]net.IP, len(in.AddressesResolved)) for i, v := range in.AddressesResolved { addrs[i] = net.IP(v) } var addrUsed net.IP err = addrUsed.UnmarshalText(in.AddressUsed) if err != nil { return } return core.ValidationRecord{ Hostname: *in.Hostname, Port: *in.Port, AddressesResolved: addrs, AddressUsed: addrUsed, Authorities: in.Authorities, URL: *in.Url, }, nil }
func pbToRegistration(pb *corepb.Registration) (core.Registration, error) { var key jose.JsonWebKey err := key.UnmarshalJSON(pb.Key) if err != nil { return core.Registration{}, err } var initialIP net.IP err = initialIP.UnmarshalText(pb.InitialIP) if err != nil { return core.Registration{}, err } var contacts *[]string if *pb.ContactsPresent { if len(pb.Contact) != 0 { contacts = &pb.Contact } else { // When gRPC creates an empty slice it is actually a nil slice. Since // certain things boulder uses, like encoding/json, differentiate between // these we need to de-nil these slices. Without this we are unable to // properly do registration updates as contacts would always be removed // as we use the difference between a nil and empty slice in ra.mergeUpdate. empty := []string{} contacts = &empty } } return core.Registration{ ID: *pb.Id, Key: &key, Contact: contacts, Agreement: *pb.Agreement, InitialIP: initialIP, CreatedAt: time.Unix(0, *pb.CreatedAt), Status: core.AcmeStatus(*pb.Status), }, nil }
// CreateMasterServiceIfNeeded will create the specified service if it // doesn't already exist. func (c *Controller) CreateMasterServiceIfNeeded(serviceName string, serviceIP net.IP, servicePort int) error { ctx := api.NewDefaultContext() if _, err := c.ServiceRegistry.GetService(ctx, serviceName); err == nil { // The service already exists. return nil } svc := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: serviceName, Namespace: api.NamespaceDefault, Labels: map[string]string{"provider": "kubernetes", "component": "apiserver"}, }, Spec: api.ServiceSpec{ Ports: []api.ServicePort{{Port: servicePort, Protocol: api.ProtocolTCP, TargetPort: util.NewIntOrStringFromInt(servicePort)}}, // maintained by this code, not by the pod selector Selector: nil, ClusterIP: serviceIP.String(), SessionAffinity: api.ServiceAffinityNone, Type: api.ServiceTypeClusterIP, }, } if err := rest.BeforeCreate(rest.Services, ctx, svc); err != nil { return err } _, err := c.ServiceRegistry.CreateService(ctx, svc) if err != nil && errors.IsAlreadyExists(err) { err = nil } return err }
// Build a slice of iptables args that are common to from-container and from-host portal rules. func iptablesCommonPortalArgs(destIP net.IP, addPhysicalInterfaceMatch bool, addDstLocalMatch bool, destPort int, protocol api.Protocol, service proxy.ServicePortName) []string { // This list needs to include all fields as they are eventually spit out // by iptables-save. This is because some systems do not support the // 'iptables -C' arg, and so fall back on parsing iptables-save output. // If this does not match, it will not pass the check. For example: // adding the /32 on the destination IP arg is not strictly required, // but causes this list to not match the final iptables-save output. // This is fragile and I hope one day we can stop supporting such old // iptables versions. args := []string{ "-m", "comment", "--comment", service.String(), "-p", strings.ToLower(string(protocol)), "-m", strings.ToLower(string(protocol)), "--dport", fmt.Sprintf("%d", destPort), } if destIP != nil { args = append(args, "-d", fmt.Sprintf("%s/32", destIP.String())) } if addPhysicalInterfaceMatch { args = append(args, "-m", "physdev", "!", "--physdev-is-in") } if addDstLocalMatch { args = append(args, "-m", "addrtype", "--dst-type", "LOCAL") } return args }
// setEndpoints sets the endpoints for the given service. // in a multi-master scenario only the master will be publishing an endpoint. // see SchedulerServer.bootstrap. func (m *SchedulerServer) setEndpoints(serviceName string, ip net.IP, port int) error { // The setting we want to find. want := []api.EndpointSubset{{ Addresses: []api.EndpointAddress{{IP: ip.String()}}, Ports: []api.EndpointPort{{Port: port, Protocol: api.ProtocolTCP}}, }} ctx := api.NewDefaultContext() e, err := m.client.Endpoints(api.NamespaceValue(ctx)).Get(serviceName) createOrUpdate := m.client.Endpoints(api.NamespaceValue(ctx)).Update if err != nil { if errors.IsNotFound(err) { createOrUpdate = m.client.Endpoints(api.NamespaceValue(ctx)).Create } e = &api.Endpoints{ ObjectMeta: api.ObjectMeta{ Name: serviceName, Namespace: api.NamespaceDefault, }, } } if !reflect.DeepEqual(e.Subsets, want) { e.Subsets = want glog.Infof("setting endpoints for master service %q to %#v", serviceName, e) _, err = createOrUpdate(e) return err } // We didn't make any changes, no need to actually call update. return nil }
// Allocate a network interface func Allocate(job *engine.Job) engine.Status { var ( ip *net.IP err error id = job.Args[0] requestedIP = net.ParseIP(job.Getenv("RequestedIP")) ) if requestedIP != nil { ip, err = ipallocator.RequestIP(bridgeNetwork, &requestedIP) } else { ip, err = ipallocator.RequestIP(bridgeNetwork, nil) } if err != nil { return job.Error(err) } out := engine.Env{} out.Set("IP", ip.String()) out.Set("Mask", bridgeNetwork.Mask.String()) out.Set("Gateway", bridgeNetwork.IP.String()) out.Set("Bridge", bridgeIface) size, _ := bridgeNetwork.Mask.Size() out.SetInt("IPPrefixLen", size) currentInterfaces.Set(id, &networkInterface{ IP: *ip, }) out.WriteTo(job.Stdout) return engine.StatusOK }
func GetServerIP() string { ifaces, err := net.Interfaces() if err != nil { log.Panic("Can't acess the network interfaces.") } var ip net.IP for _, i := range ifaces { addrs, err := i.Addrs() if err != nil { log.Panic("Can't read the IP.") } for _, addr := range addrs { switch v := addr.(type) { case *net.IPNet: //log.Printf("Evaluating IPNet: %v\r\n", v.IP) if (v.IP.To4() != nil) && !v.IP.IsLinkLocalUnicast() && !v.IP.IsLoopback() && !v.IP.IsMulticast() { ip = v.IP } case *net.IPAddr: //log.Printf("Evaluating IPAddr: %v\r\n", v.IP) if (v.IP.To4() != nil) && !v.IP.IsLinkLocalUnicast() && !v.IP.IsLoopback() && !v.IP.IsMulticast() { ip = v.IP } } } } // process IP address return ip.String() }
func (s *Session) handleNodeUp(ip net.IP, port int, waitForBinary bool) { if gocqlDebug { log.Printf("gocql: Session.handleNodeUp: %s:%d\n", ip.String(), port) } addr := ip.String() host := s.ring.getHost(addr) if host != nil { if s.cfg.IgnorePeerAddr && host.Peer() != addr { host.setPeer(addr) } if s.cfg.HostFilter != nil { if !s.cfg.HostFilter.Accept(host) { return } } else if !s.cfg.Discovery.matchFilter(host) { // TODO: remove this when the host selection policy is more sophisticated return } if t := host.Version().nodeUpDelay(); t > 0 && waitForBinary { time.Sleep(t) } host.setPort(port) s.pool.hostUp(host) s.policy.HostUp(host) host.setState(NodeUp) return } s.handleNewNode(ip, port, waitForBinary) }
func newProxySocket(protocol api.Protocol, ip net.IP, port int) (proxySocket, error) { host := "" if ip != nil { host = ip.String() } switch strings.ToUpper(string(protocol)) { case "TCP": listener, err := net.Listen("tcp", net.JoinHostPort(host, strconv.Itoa(port))) if err != nil { return nil, err } return &tcpProxySocket{Listener: listener, port: port}, nil case "UDP": addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(host, strconv.Itoa(port))) if err != nil { return nil, err } conn, err := net.ListenUDP("udp", addr) if err != nil { return nil, err } return &udpProxySocket{UDPConn: conn, port: port}, nil } return nil, fmt.Errorf("unknown protocol %q", protocol) }
func removeEncryption(localIP, remoteIP net.IP, em *encrMap) error { em.Lock() indices, ok := em.nodes[remoteIP.String()] em.Unlock() if !ok { return nil } for i, idxs := range indices { dir := reverse if i == 0 { dir = bidir } fSA, rSA, err := programSA(localIP, remoteIP, idxs, nil, dir, false) if err != nil { logrus.Warn(err) } if i != 0 { continue } err = programSP(fSA, rSA, false) if err != nil { logrus.Warn(err) } } return nil }
func ipIsLocal(ip net.IP) bool { if ip.To4() == nil { return ip.Equal(net.IPv6loopback) } return v4Loopback.Contains(ip) }
func (tun *_BaseTun) SetIPv4(typ int, ip net.IP) error { if typ == NETMASK { // Hack for OSX // must set IP Address again after setting netmask defer func() { ip, err := tun.GetIPv4(ADDRESS) if err == nil { tun.SetIPv4(ADDRESS, ip) } }() } ifreq := _IfReqIPv4{family: syscall.AF_INET} copy(ifreq.name[:], tun.name) if ipv4 := ip.To4(); ipv4 == nil { return fmt.Errorf("Invalid IPv4 Address %v", ip) } else { copy(ifreq.address[:], ipv4) } var cmd uintptr switch typ { case ADDRESS: cmd = syscall.SIOCSIFADDR case DST_ADDRESS: cmd = syscall.SIOCSIFDSTADDR case NETMASK: cmd = syscall.SIOCSIFNETMASK default: return fmt.Errorf("Invalid type %v", typ) } return ioctl(cmd, uintptr(unsafe.Pointer(&ifreq))) }
func (n *network) addSvcRecords(name string, epIP net.IP, ipMapUpdate bool) { c := n.getController() c.Lock() defer c.Unlock() sr, ok := c.svcDb[n.ID()] if !ok { sr = svcInfo{ svcMap: make(map[string][]net.IP), ipMap: make(map[string]string), } c.svcDb[n.ID()] = sr } if ipMapUpdate { reverseIP := netutils.ReverseIP(epIP.String()) if _, ok := sr.ipMap[reverseIP]; !ok { sr.ipMap[reverseIP] = name } } ipList := sr.svcMap[name] for _, ip := range ipList { if ip.Equal(epIP) { return } } sr.svcMap[name] = append(sr.svcMap[name], epIP) }