Add src-address=10.0.0.0/8 to masquerade rule. You need hairpin NAT only for connections originating from same LAN, but currently your rule applies to connections with any source address.
Maybe I misunderstood what you want? I assumed it was a typo and you meant “… server log shows the incorrect localnet ip addresses.” Because that’s exactly what your srcnat rule would do. Split in parts, it says to:
action=masquerade - change packet’s source address to router’s address
dst-address=10.0.0.100 - when the destination is this
out-interface=LAN - and it goes out via this interface
protocol=tcp - and it’s tcp
It does not say anything about packet’s source, so any tcp packet to 10.0.0.100 will have its source address changed to 10.0.0.10, unless you limit the rule by other conditions.
I think the only real solution if you want to log the actual IP of local users is split DNS. Where outside users get the external IP and internal users get the local IP for the same DNS name. Otherwise, that’s what a Hairpin will do.
And you don’t see any problem with that? That’s your answer, of course it can’t work without default gateway. It worked previously because your original broad srcnat rule made all connections look like they come from 10.0.0.10 and server knew where to find that. But when you added src-address, connections kept their source addresses and server had no idea where to send replies.
The main problem is that server does not have default gateway. You need to set it to router’s address, i.e. 10.0.0.10. Then use the config with masquerade rule having src-address specified and it will work.
Unless of course it’s part of some larger complicated setup you didn’t provide any details about…
You have again the original rule that masquerades packets with any source. Since now you should have already fixed server’s routing problem by giving it default gateway, it’s the right time to limit the rule using src-address=10.0.0.0/8.