in cmd/egress-cni-plugin/snat/snat.go [50:90]
func Add(ipt iptableswrapper.IPTablesIface, nodeIP, src net.IP, multicastRange, chain, comment, rndSNAT string) error {
//Defaults to `random-fully` unless a different option is explicitly set via
//`AWS_VPC_K8S_CNI_RANDOMIZESNAT`. If the underlying iptables version doesn't support
//'random-fully`, we will fall back to `random`.
useRandomFully, useHashRandom := true, false
if rndSNAT == "none" {
useRandomFully = false
} else if rndSNAT == "hashrandom" || !ipt.HasRandomFully() {
useHashRandom, useRandomFully = true, false
}
rules := iptRules(nodeIP, src, multicastRange, chain, comment, useRandomFully, useHashRandom)
chains, err := ipt.ListChains("nat")
if err != nil {
return err
}
existingChains := make(map[string]bool, len(chains))
for _, ch := range chains {
existingChains[ch] = true
}
for _, rule := range rules {
_chain := rule[0]
if !existingChains[_chain] {
if err = ipt.NewChain("nat", _chain); err != nil {
return err
}
existingChains[_chain] = true
}
}
for _, rule := range rules {
_chain := rule[0]
if err = ipt.AppendUnique("nat", _chain, rule[1:]...); err != nil {
return err
}
}
return nil
}