Set the .angles of the camera to the direction you want, and then set the .fixangle of the camera to TRUE. However, this only works in PlayerPreThink.
This must be done in every frame, and due to this it does have some impact on networked games. A solution that doesn't impact network performance would be to use CSQC, but that's beyond my current knowledge at the moment.
And another hint: When setting the camera's position, doing that in PlayerPostThink is better than doing it in PlayerPreThink. PlayerPreThink is run before the player's physics, so any position you set within it will be outdated when the player's physics run.
Another interesting detail is that the whole set of PlayerPreThink

player's physics

player's .think

PlayerPostThink functions is run before any other entities. So, even though setting a camera position in PlayerPostThink will make it follow the player's physics correctly, the player's position can still be changed by any other entity that comes after (e.g. the sliding platform over the first acid pool in E1M1: push the button, and run over the platform while it's still moving to see the camera lagging). Only the physics of the very last entity will be guaranteed to be not unpredictably changed by some other entity after it runs.
Ph'nglui mglw'nafh mankrip Hell's end wgah'nagl fhtagn.
==-=-=-=-=-=-=-=-=-=-==
/ /