In LAN, the setting can successfully bring me to the right server with different domain name. However, it didn’t work if I tried to connect from WAN. I could see the packets coming in NAT but no connection was built by proxy.
There were more much suitable for this task like deploying a port forwarding on a real proxy like haproxy and handle this on L7 so that you can achieved what you want. because port forwarding can only be done once on a specific port.
For illustration purposes only
your external IP is 1.1.1.1 and you map it to port 80 and DNAT to 192.168.88.5:80 for abc.com
1.1.1.1:80 → 192.168.88.5.80 (abc.com)
1.1.1.1:80 → 192.168.88.7.80 (xyz.com) # This will not work because you already mapped it on your previous rule
Solution
1.1.1.1:80 → 192.168.88.4:80 (haproxy = real reverse proxy) handle the application routing/logic here much more versatile and you can even use different operating system behind on the reverse proxy
@loloski is right, reverse proxy is your friend.
Often used proxies are haproxy, nginx, caddy… for containers for example traefik. If you want easy quick start with web UI and build-in ACME, you can use Nginx Proxy Manager