@@ -62,7 +62,7 @@ func (kl *Kubelet) syncNetworkUtil() {
62
62
klog .Errorf ("Failed to ensure that %s chain %s exists: %v" , utiliptables .TableNAT , KubeMarkDropChain , err )
63
63
return
64
64
}
65
- if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableNAT , KubeMarkDropChain , "-j" , "MARK" , "--set-xmark " , dropMark ); err != nil {
65
+ if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableNAT , KubeMarkDropChain , "-j" , "MARK" , "--or-mark " , dropMark ); err != nil {
66
66
klog .Errorf ("Failed to ensure marking rule for %v: %v" , KubeMarkDropChain , err )
67
67
return
68
68
}
@@ -72,7 +72,7 @@ func (kl *Kubelet) syncNetworkUtil() {
72
72
}
73
73
if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableFilter , KubeFirewallChain ,
74
74
"-m" , "comment" , "--comment" , "kubernetes firewall for dropping marked packets" ,
75
- "-m" , "mark" , "--mark" , dropMark ,
75
+ "-m" , "mark" , "--mark" , fmt . Sprintf ( "%s/%s" , dropMark , dropMark ) ,
76
76
"-j" , "DROP" ); err != nil {
77
77
klog .Errorf ("Failed to ensure rule to drop packet marked by %v in %v chain %v: %v" , KubeMarkDropChain , utiliptables .TableFilter , KubeFirewallChain , err )
78
78
return
@@ -112,7 +112,7 @@ func (kl *Kubelet) syncNetworkUtil() {
112
112
klog .Errorf ("Failed to ensure that %s chain %s exists: %v" , utiliptables .TableNAT , KubePostroutingChain , err )
113
113
return
114
114
}
115
- if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableNAT , KubeMarkMasqChain , "-j" , "MARK" , "--set-xmark " , masqueradeMark ); err != nil {
115
+ if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableNAT , KubeMarkMasqChain , "-j" , "MARK" , "--or-mark " , masqueradeMark ); err != nil {
116
116
klog .Errorf ("Failed to ensure marking rule for %v: %v" , KubeMarkMasqChain , err )
117
117
return
118
118
}
@@ -121,12 +121,26 @@ func (kl *Kubelet) syncNetworkUtil() {
121
121
klog .Errorf ("Failed to ensure that %s chain %s jumps to %s: %v" , utiliptables .TableNAT , utiliptables .ChainPostrouting , KubePostroutingChain , err )
122
122
return
123
123
}
124
- // Establish the masquerading rule.
124
+
125
+ // Set up KUBE-POSTROUTING to unmark and masquerade marked packets
125
126
// NB: THIS MUST MATCH the corresponding code in the iptables and ipvs
126
127
// modes of kube-proxy
128
+ if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableNAT , KubePostroutingChain ,
129
+ "-m" , "mark" , "!" , "--mark" , fmt .Sprintf ("%s/%s" , masqueradeMark , masqueradeMark ),
130
+ "-j" , "RETURN" ); err != nil {
131
+ klog .Errorf ("Failed to ensure filtering rule for %v: %v" , KubePostroutingChain , err )
132
+ return
133
+ }
134
+ // Clear the mark to avoid re-masquerading if the packet re-traverses the network stack.
135
+ // We know the mark bit is currently set so we can use --xor-mark to clear it (without needing
136
+ // to Sprintf another bitmask).
137
+ if _ , err := kl .iptClient .EnsureRule (utiliptables .Append , utiliptables .TableNAT , KubePostroutingChain ,
138
+ "-j" , "MARK" , "--xor-mark" , masqueradeMark ); err != nil {
139
+ klog .Errorf ("Failed to ensure unmarking rule for %v: %v" , KubePostroutingChain , err )
140
+ return
141
+ }
127
142
masqRule := []string {
128
143
"-m" , "comment" , "--comment" , "kubernetes service traffic requiring SNAT" ,
129
- "-m" , "mark" , "--mark" , masqueradeMark ,
130
144
"-j" , "MASQUERADE" ,
131
145
}
132
146
if kl .iptClient .HasRandomFully () {
@@ -141,5 +155,5 @@ func (kl *Kubelet) syncNetworkUtil() {
141
155
// getIPTablesMark returns the fwmark given the bit
142
156
func getIPTablesMark (bit int ) string {
143
157
value := 1 << uint (bit )
144
- return fmt .Sprintf ("%#08x/%#08x" , value , value )
158
+ return fmt .Sprintf ("%#08x" , value )
145
159
}
0 commit comments