Digging around google a bit more I came up with different rules, and fingers crossed, they seem to work!
SUBSYSTEM=="net", SYSFS{address}=="00:1b:21:4d:c3:e8", NAME="eth0" # pro/1000gt SUBSYSTEM=="net", SYSFS{address}=="00:e0:81:b5:7a:30", NAME="eth1" # internal 1 SUBSYSTEM=="net", SYSFS{address}=="00:e0:81:b5:7a:31", NAME="eth2" # internal 2
It turns out it was just a fluke the server booted up with the correct order. Another reboot and the nic's are all screwed up again, the built in and external card sharing eth0, the second built in as eth1.
On the second server, things are the same even with the new rules, nic drvier order is seemingly chosen at random with each boot.
Do you have anything else in 60-net.rules other than these three rules?
Try prepending "KERNEL=="eth*, "" and/or "ACTION=="add, "".