code: func NewCustomProxier(loadBalancer LoadBalancer, listenIP net.IP, iptables iptables.Interface, exec utilexec.Interface, pr utilnet.PortRange, syncPeriod, minSyncPeriod, udpIdleTimeout time.Duration, nodePortAddresses []string, makeProxySocket ProxySocketFunc) (*Proxier, error) {
  	if listenIP.Equal(localhostIPv4) || listenIP.Equal(localhostIPv6) {
  		return nil, ErrProxyOnLocalhost
  	}
  
  	// If listenIP is given, assume that is the intended host IP.  Otherwise
  	// try to find a suitable host IP address from network interfaces.
  	var err error
  	hostIP := listenIP
  	if hostIP.Equal(net.IPv4zero) || hostIP.Equal(net.IPv6zero) {
  		hostIP, err = utilnet.ChooseHostInterface()
  		if err != nil {
  			return nil, fmt.Errorf("failed to select a host interface: %v", err)
  		}
  	}
  
  	err = setRLimit(64 * 1000)
  	if err != nil {
  		return nil, fmt.Errorf("failed to set open file handler limit: %v", err)
  	}
  
  	proxyPorts := newPortAllocator(pr)
  
  	klog.V(2).Infof("Setting proxy IP to %v and initializing iptables", hostIP)
  	return createProxier(loadBalancer, listenIP, iptables, exec, hostIP, proxyPorts, syncPeriod, minSyncPeriod, udpIdleTimeout, makeProxySocket)
  }
docs: // NewCustomProxier functions similarly to NewProxier, returning a new Proxier
  // for the given LoadBalancer and address.  The new proxier is constructed using
  // the ProxySocket constructor provided, however, instead of constructing the
  // default ProxySockets.