short answer: No, I think.
First, when you say that three IPs are assigned to the cable modem, that means that three IP addresses point to the cable modem. It doesnt mean that three IPs are passed through the modem. When the data gets to the modem, the modem doesnt care about hostnames, it just sends it out to the one device it can connect to: your linux router. With the router you'd have to enable port forwarding and a sort of NAT (Look up IP masquerading). The only thing you could do is have different ports forwarded to different computers. IE:
Box A foo.bar.baz:21 -> your.ip.of.cmodem -> linux router (which port?)^--> 192.168.1.2:21
\-----------------------------------------------------/
Box B foo.bar.gleep:2121 -> your.ip.of.cmodem -> linux router(which port?) ^ --> 192.168.1.3:21
\------------------------------------------------------/
Box C foo.bar.sea:?? -> your.ip.of.cmodem -> linux router(which port?)^ --> 192.168.1.4:??
Notice that the external ports are not dependant on the services, but you must specify the port if your not using the default port for a known service. So if I wanted to access Box A's ftp service I would do "ftp foo.bar.baz" but if I wanted to access Box B's ftp service I would have to do "ftp foo.bar.gleep:2121". ftp foo.bar.baz is the equivalent of ftp foo.bar.baz:21, but since the port of ftp is well established as 21, it is not needed.
Box C will still be able to access box A and B's services, but only through the local ip's. Servers seem to have a problem sending data back to themselves. This can be achieved by adding entries into the hosts file for each computer :
Code:
192.168.1.2 foo.bar.baz
192.168.1.3 foo.bar.gleep
That would be the hosts file for Box C so that you could still use the name to access the service. So in short, the reason that you cannot do the whole dns thing you're trying to do, is because of NAT.