How can I solve this? The user must use the destination server bandwidth instead the redirect server. Thank you.
Generally there's a few ways:
- Use Round Robin DNS. All servers share the same name, but on different IP's. Clients will pick a random server.
- Use redirects to send the users to an appropriate server.
- Use Anycast. All servers have the same IP. Due to the way routing works, users will generally connect to a local one.
Round Robin DNS and redirects is generally something you can configure yourself. For anycast you will have to either be able to announce BGP in multiple regions yourself, and involve yourself with multiple ISPs around the world.
Another excellent idea would be to simply ignore the problem, and slap a service such as Cloudflare or Akami in front, and let them handle load balancing. If you want more control, it's also possible to host the content in a cloud solution such as Azure or Google Cloud, where you to a lesser extent have to worry about load for getting things from blob storage.
What your rules do
With your rules, you rewrite the destination of the packet, and send them on to a different server. In addition you masquerade them, so that it to the backend servers seems the package came from your frontend. The backend dutyfully answers, sending the reply packet back to your frontend, which looks up in it's table where that connection came from, and sends the packet to the original client. The server - which is really a router, has to touch the packets to rewrite headers, and all packets has to go via that server.
In many cases such a setup can make a lot of sense. It's rather trivial to route lots of traffic, and it's easy and robust to configure. It allows for High Availability, where you drop servers not responding, and for loads that are not stateful, it's extremely easy to increase capacity - as long as your router can handle the amount of traffic.