Commit b31874fe authored by Minhan Xia's avatar Minhan Xia

bug fixes and nits

parent 1acaa1db
...@@ -43,7 +43,7 @@ const ( ...@@ -43,7 +43,7 @@ const (
// kubernetes postrouting rules // kubernetes postrouting rules
KubePostroutingChain utiliptables.Chain = "KUBE-POSTROUTING" KubePostroutingChain utiliptables.Chain = "KUBE-POSTROUTING"
// kubernetes postrouting rules // kubernetes firewall rules
KubeFirewallChain utiliptables.Chain = "KUBE-FIREWALL" KubeFirewallChain utiliptables.Chain = "KUBE-FIREWALL"
) )
......
...@@ -581,11 +581,11 @@ func servicePortChainName(s proxy.ServicePortName, protocol string) utiliptables ...@@ -581,11 +581,11 @@ func servicePortChainName(s proxy.ServicePortName, protocol string) utiliptables
return utiliptables.Chain("KUBE-SVC-" + portProtoHash(s, protocol)) return utiliptables.Chain("KUBE-SVC-" + portProtoHash(s, protocol))
} }
// servicePortChainName takes the ServicePortName for a service and // externalLoadBalancerChainName takes the ServicePortName for a service and
// returns the associated iptables chain. This is computed by hashing (sha256) // returns the associated iptables chain. This is computed by hashing (sha256)
// then encoding to base32 and truncating with the prefix "KUBE-FW-". // then encoding to base32 and truncating with the prefix "KUBE-XLB-".
func serviceFirewallChainName(s proxy.ServicePortName, protocol string) utiliptables.Chain { func externalLoadBalancerChainName(s proxy.ServicePortName, protocol string) utiliptables.Chain {
return utiliptables.Chain("KUBE-FW-" + portProtoHash(s, protocol)) return utiliptables.Chain("KUBE-XLB-" + portProtoHash(s, protocol))
} }
// This is the same as servicePortChainName but with the endpoint included. // This is the same as servicePortChainName but with the endpoint included.
...@@ -872,33 +872,32 @@ func (proxier *Proxier) syncProxyRules() { ...@@ -872,33 +872,32 @@ func (proxier *Proxier) syncProxyRules() {
// Capture load-balancer ingress. // Capture load-balancer ingress.
for _, ingress := range svcInfo.loadBalancerStatus.Ingress { for _, ingress := range svcInfo.loadBalancerStatus.Ingress {
if ingress.IP != "" { if ingress.IP != "" {
args := []string{ // create service external loadbalancer chain
"-A", string(kubeServicesChain), xlbChain := externalLoadBalancerChainName(svcName, protocol)
"-m", "comment", "--comment", fmt.Sprintf(`"%s loadbalancer IP"`, svcName.String()), if chain, ok := existingNATChains[xlbChain]; ok {
"-m", protocol, "-p", protocol,
"-d", fmt.Sprintf("%s/32", ingress.IP),
"--dport", fmt.Sprintf("%d", svcInfo.port),
}
// create service firewall chain
fwChain := serviceFirewallChainName(svcName, protocol)
if chain, ok := existingNATChains[fwChain]; ok {
writeLine(natChains, chain) writeLine(natChains, chain)
} else { } else {
writeLine(natChains, utiliptables.MakeChainLine(fwChain)) writeLine(natChains, utiliptables.MakeChainLine(xlbChain))
} }
// jump to service firewall chain activeNATChains[xlbChain] = true
// The service firewall rules are created based on ServiceSpec.loadBalancerSourceRanges field. // The service firewall rules are created based on ServiceSpec.loadBalancerSourceRanges field.
// This currently works for loadbalancers that preserves source ips. // This currently works for loadbalancers that preserves source ips.
// For loadbalancers which direct traffic to service NodePort, the firewall rules will not apply. // For loadbalancers which direct traffic to service NodePort, the firewall rules will not apply.
writeLine(natRules, append(args, "-j", string(fwChain))...)
args = []string{ args := []string{
"-A", string(fwChain), "-A", string(kubeServicesChain),
"-m", "comment", "--comment", fmt.Sprintf(`"%s loadbalancer IP"`, svcName.String()), "-m", "comment", "--comment", fmt.Sprintf(`"%s loadbalancer IP"`, svcName.String()),
"-m", protocol, "-p", protocol, "-m", protocol, "-p", protocol,
"-d", fmt.Sprintf("%s/32", ingress.IP), "-d", fmt.Sprintf("%s/32", ingress.IP),
"--dport", fmt.Sprintf("%d", svcInfo.port), "--dport", fmt.Sprintf("%d", svcInfo.port),
} }
// jump to service firewall chain
writeLine(natRules, append(args, "-j", string(xlbChain))...)
args = []string{
"-A", string(xlbChain),
"-m", "comment", "--comment", fmt.Sprintf(`"%s loadbalancer IP"`, svcName.String()),
}
// We have to SNAT packets from external IPs. // We have to SNAT packets from external IPs.
writeLine(natRules, append(args, "-j", string(KubeMarkMasqChain))...) writeLine(natRules, append(args, "-j", string(KubeMarkMasqChain))...)
...@@ -1056,7 +1055,7 @@ func (proxier *Proxier) syncProxyRules() { ...@@ -1056,7 +1055,7 @@ func (proxier *Proxier) syncProxyRules() {
for chain := range existingNATChains { for chain := range existingNATChains {
if !activeNATChains[chain] { if !activeNATChains[chain] {
chainString := string(chain) chainString := string(chain)
if !strings.HasPrefix(chainString, "KUBE-SVC-") && !strings.HasPrefix(chainString, "KUBE-SEP-") { if !strings.HasPrefix(chainString, "KUBE-SVC-") && !strings.HasPrefix(chainString, "KUBE-SEP-") && !strings.HasPrefix(chainString, "KUBE-XLB-") {
// Ignore chains that aren't ours. // Ignore chains that aren't ours.
continue continue
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment