I found it really depends on how you setup the rules (zentyal 2.2). You have to look from the clients view of how the traffic flows and create new services for that.
Take example FTP (port 21) You want to control download rate
Your client connects from some random port to port 21 on some other system. The internal interface of zentyal sees traffic flowing from some location (port 21) to client (random port). You will need to create a service (ex. FTP download) which says destination port any and source port 21.
Now if you want to control upload
Your service will need to be (ex. FTP upload) which says source port 21 and destination port any. You would add this service to the external interface, which would see traffic flowing from source port 21 to some destination on any port.
I have setup rules like this for subsonic, plex, ftp, http and some other services running on both zentyal and on other servers in my network. From what I can see everything is working properly. Setting up the rules was the tricky part.