@@ -1600,15 +1600,15 @@ metadata:
16001600 if ! utilnet .IsIPv6String (svcLoadBalancerIP ) {
16011601 ginkgo .By ("Setting up external IPv4 client with an intermediate node" )
16021602 defer func () {
1603- cleanupIPv4NetworkForExternalClient (svcLoadBalancerIP )
1603+ cleanupIPv4NetworkForExternalClient (svcLoadBalancerIP , endpointHTTPPort )
16041604 }()
1605- setupIPv4NetworkForExternalClient (svcLoadBalancerIP , nodeIP )
1605+ setupIPv4NetworkForExternalClient (svcLoadBalancerIP , endpointHTTPPort , nodeIP )
16061606 } else {
16071607 ginkgo .By ("Setting up external IPv6 client with an intermediate node" )
16081608 defer func () {
1609- cleanupIPv6NetworkForExternalClient (svcLoadBalancerIP )
1609+ cleanupIPv6NetworkForExternalClient (svcLoadBalancerIP , endpointHTTPPort )
16101610 }()
1611- setupIPv6NetworkForExternalClient (svcLoadBalancerIP , nodeIP )
1611+ setupIPv6NetworkForExternalClient (svcLoadBalancerIP , endpointHTTPPort , nodeIP )
16121612 svcIPforCurl = fmt .Sprintf ("[%s]" , svcLoadBalancerIP )
16131613 }
16141614
@@ -2192,7 +2192,7 @@ func getServiceLoadBalancerIP(c clientset.Interface, namespace, serviceName stri
21922192 return svc .Status .LoadBalancer .Ingress [0 ].IP , nil
21932193}
21942194
2195- func setupIPv4NetworkForExternalClient (svcLoadBalancerIP , nodeIP string ) {
2195+ func setupIPv4NetworkForExternalClient (svcLoadBalancerIP string , svcLoadBalancerPort int , nodeIP string ) {
21962196 // The external client configuration done in install_metallb can not be used because routes for external client
21972197 // installed in K8s node https://github.com/ovn-org/ovn-kubernetes/blob/master/contrib/kind.sh#L1045-L1047
21982198 // are ignored in shared gateway mode and traffic coming back from pod is put on the docker bridge directly by
@@ -2215,6 +2215,7 @@ func setupIPv4NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
22152215 // | 172.18.0.1 |
22162216 // | ip route add 192.168.223.0/24 via 192.168.222.2
22172217 // | ip route add <svc-ip> via|<endpoint-node-ip>
2218+ // | iptables -t filter -I FORWARD -d <svc-ip> -p tcp -m tcp --dport <svc-port> -j ACCEPT
22182219 // | |
22192220 // | vm 192.168.222.1 |
22202221 // +----------------------------------------+-------------------------------------+
@@ -2245,17 +2246,21 @@ func setupIPv4NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
22452246 err = buildAndRunCommand ("sudo ip route add 192.168.223.0/24 via 192.168.222.2" )
22462247 framework .ExpectNoError (err , "failed to add route for client to handle reverse service traffic" )
22472248
2249+ err = buildAndRunCommand (fmt .Sprintf ("sudo iptables -t filter -I FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT" , svcLoadBalancerIP , svcLoadBalancerPort ))
2250+ framework .ExpectNoError (err , "failed to add iptables rule for service" )
2251+
22482252 err = buildAndRunCommand (fmt .Sprintf ("sudo ip route add %s via %s" , svcLoadBalancerIP , nodeIP ))
22492253 framework .ExpectNoError (err , "failed to add route for external load balancer service" )
22502254}
22512255
2252- func cleanupIPv4NetworkForExternalClient (svcLoadBalancerIP string ) {
2256+ func cleanupIPv4NetworkForExternalClient (svcLoadBalancerIP string , svcLoadBalancerPort int ) {
22532257 cleanupNetNamespace ()
22542258 buildAndRunCommand ("sudo ip route delete 192.168.223.0/24 via 192.168.222.2" )
22552259 buildAndRunCommand (fmt .Sprintf ("sudo ip route delete %s" , svcLoadBalancerIP ))
2260+ buildAndRunCommand (fmt .Sprintf ("sudo iptables -t filter -D FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT" , svcLoadBalancerIP , svcLoadBalancerPort ))
22562261}
22572262
2258- func setupIPv6NetworkForExternalClient (svcLoadBalancerIP , nodeIP string ) {
2263+ func setupIPv6NetworkForExternalClient (svcLoadBalancerIP string , svcLoadBalancerPort int , nodeIP string ) {
22592264 // The external client configuration done in install_metallb can not be used because routes for external client
22602265 // installed in K8s node https://github.com/ovn-org/ovn-kubernetes/blob/master/contrib/kind.sh#L1045-L1047
22612266 // are ignored in shared gateway mode and traffic coming back from pod is put on the docker bridge directly by
@@ -2306,12 +2311,16 @@ func setupIPv6NetworkForExternalClient(svcLoadBalancerIP, nodeIP string) {
23062311
23072312 err = buildAndRunCommand (fmt .Sprintf ("sudo ip -6 route add %s via %s" , svcLoadBalancerIP , nodeIP ))
23082313 framework .ExpectNoError (err , "failed to add route for external load balancer service" )
2314+
2315+ err = buildAndRunCommand (fmt .Sprintf ("sudo ip6tables -t filter -I FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT" , svcLoadBalancerIP , svcLoadBalancerPort ))
2316+ framework .ExpectNoError (err , "failed to add iptables rule for service" )
23092317}
23102318
2311- func cleanupIPv6NetworkForExternalClient (svcLoadBalancerIP string ) {
2319+ func cleanupIPv6NetworkForExternalClient (svcLoadBalancerIP string , svcLoadBalancerPort int ) {
23122320 cleanupNetNamespace ()
23132321 buildAndRunCommand ("sudo ip -6 route delete fc00:f853:ccd:e223::2" )
23142322 buildAndRunCommand (fmt .Sprintf ("sudo ip -6 route delete %s" , svcLoadBalancerIP ))
2323+ buildAndRunCommand (fmt .Sprintf ("sudo ip6tables -t filter -D FORWARD -d %s -p tcp -m tcp --dport %d -j ACCEPT" , svcLoadBalancerIP , svcLoadBalancerPort ))
23152324}
23162325
23172326func setupNetNamespaceAndLinks () {
0 commit comments