Going by what you posted it isn’t the router, either.
Time to get packet sniffers going on both machines to check whether traffic is leaving the source machine and arriving at the destination machine as expected. From what you posted all is well - it obviously isn’t, but nothing you have posted gives any indication whatsoever of what the issue could be. Time for you to dive into some deeper troubleshooting.
Also check the router connection tables, and make use of the built in packet sniffer as well as the torch tool to look at the connections are you investigate them on the hosts. Are the packet counters on the NAT rules increasing as you build connections from internal hosts? And so on.
I’m terribly sorry to have misled you. I somehow managed to completely read past the fact that you weren’t destination NATing to 10.0.1.21 based on IP address, but based on in-interface.
FWIW, you can now remove all the other destination NAT rules as well and just keep the last one…it’ll cover both WAN and LAN clients.
That means, in English: look at all traffic destined to an IP address that resides on the router itself as long as that IP isn’t within 10.0.1.0/24, and if it’s TCP traffic to ports 80,3784,21,1500-1510 change the destination IP address to 10.0.1.21.
This works, then, for traffic sourced from the LAN and WAN to the WAN IP of the router. The ‘dst-address-type=local’ is needed so that this is only done for traffic to a router IP address - otherwise, for example, you’d be sending ALL tcp/80 traffic to 10.0.1.21, including a LAN host trying to get to www.google.com.