code: func getExistingHostportIPTablesRules(iptables utiliptables.Interface) (map[utiliptables.Chain]string, []string, error) {
  	iptablesData := bytes.NewBuffer(nil)
  	err := iptables.SaveInto(utiliptables.TableNAT, iptablesData)
  	if err != nil { // if we failed to get any rules
  		return nil, nil, fmt.Errorf("failed to execute iptables-save: %v", err)
  	}
  	existingNATChains := utiliptables.GetChainLines(utiliptables.TableNAT, iptablesData.Bytes())
  
  	existingHostportChains := make(map[utiliptables.Chain]string)
  	existingHostportRules := []string{}
  
  	for chain := range existingNATChains {
  		if strings.HasPrefix(string(chain), string(kubeHostportsChain)) || strings.HasPrefix(string(chain), kubeHostportChainPrefix) {
  			existingHostportChains[chain] = string(existingNATChains[chain])
  		}
  	}
  
  	for _, line := range strings.Split(string(iptablesData.Bytes()), "\n") {
  		if strings.HasPrefix(line, fmt.Sprintf("-A %s", kubeHostportChainPrefix)) ||
  			strings.HasPrefix(line, fmt.Sprintf("-A %s", string(kubeHostportsChain))) {
  			existingHostportRules = append(existingHostportRules, line)
  		}
  	}
  	return existingHostportChains, existingHostportRules, nil
  }
docs: // getExistingHostportIPTablesRules retrieves raw data from iptables-save, parse it,
  // return all the hostport related chains and rules