Netmap seems to work like a charm for this if you are performing multiple port forwards from a single public subnet to several private networks based on port.
We bound each public IP to the WAN card and setup netmap rules as follows in Winbox.
rule#1
General Tab
chain: dstnat
Dst address : 123.123.123.0/24
Protocol :TCP
Dst Port : 25
Action tab
Action : netmap
To Addresses : 192.168.1.0/24
To ports : 25
rule#2
General Tab
chain: dstnat
Dst address : 123.123.123.0/24
Protocol :TCP
Dst Port : 80
Action tab
Action : netmap
To Addresses : 192.168.1.0/24
To ports : 80
We handled incoming netmap exceptions (public IPs within the netmap range that actually as bound to external servers) by unbinding the public ip from the WAN port and adding an “accept” rule above our netmap rules.
General Tab
chain: dstnat
Dst address : 123.123.123.15
Action tab
Action : accept
We also used netmap to map outbound traffic from each private subnet back to a common public subnet.
rule#1
General Tab
chain: srcnat
Src address : 192.168.1.0/24
Action tab
Action : netmap
To Addresses : 123.123.123.0/24
To Ports : 0-65535
rule#2
General Tab
chain: srcnat
Src address : 192.168.2.0/24
Action tab
Action : netmap
To Addresses : 123.123.123.0/24
To Ports : 0-65535
We ran into an interesting behavior with outbound traffic if we netmapped an arbitrary range (123.123.123.10-123.123.123.20 > 192.168.1.10-192.168.1.20) instead of an entire subnet (123.123.123.0/24 > 192.168.1.0/24).
When using an artibtrary range, netmap did a round robin mapping (1st outbound connection from 192.168.1.10-192.168.1.20 mapped to .10, 2nd outbound connection mapped to .11, etc)
When using a subnet to subnet mapping, netmap used a true one to one mapping (192.168.1.10 always mapped to 123.123.123.10, 192.168.1.11 always maps to 123.123.123.11)
Thanks Mikrotik!! Our 2.9.x configuration is several hundred lines shorter then our old 2.8.x configuration because of netmap 