Luke Chambers headed the winning goal in the second half to end a four-match losing run on the road for Billy Davies’ side and give them a first victory on their travels in nine attempts.
A Kris Boyd tap-in and a penalty from the on-loan Middlesbrough forward sent the Reds into half-time in control.
But Marvin Elliott halved City’s arrears soon after the restart and Jon Stead headed them level on the hour mark.
Chambers had the last word, though, with his fifth goal of the season.
City boss Keith Millen made five changes following the defeat to Sheffield United two days ago.
Three were enforced, with Nicky Maynard beginning a three-match suspension after his red card at Bramall Lane and Damion Stewart and Kalifa Cisse missing out through injury. Brett Pitman and Martyn Woolford dropped to the bench.
David Clarkson, Stead, Cole Skuse, Jamal Campbell-Ryce and Louis Carey were recalled.
Boyd came back into the Forest side along with on-loan left-back Paul Konchesky. Marcus Tudgay and Chris Gunter made way.
There was an early scare for City when David James fumbled Lewis McGugan’s free-kick, but the former England goalkeeper smothered the ball at the second attempt.
McGugan was involved again shortly afterwards when he crossed from the right for Boyd to sweep the ball past James after four minutes.
Stead had two half-chances to equalise, first shooting just wide and then almost benefiting when Konchesky’s header back to Lee Camp did not quite reach the Forest keeper.
Campbell-Ryce also went close but dragged his shot past the post.
It was somewhat against the run of play when Forest extended their lead. McGugan fell over Carey’s dangling leg and Boyd blasted the resulting penalty into the roof of the net.
A superb passing move involving four City players saw Campbell-Ryce get free down the left and cross for Elliott to sneak his far-post header beyond Camp to make it 2-1 four minutes into the second half.
Albert Adomah’s 20-yard shot went narrowly wide soon afterwards.
Stead then headed City level on the hour mark, guiding Jordan Spence’s centre back across Camp who got a hand to the ball but could not keep it out.
It looked like neither side would find a winner, until Chambers’ looping header from McGugan’s cross in the 72nd minute.
City thought they had salvaged a draw in injury time when Marlon Jackson scored but the substitute put the ball in the net with his hand and was booked by referee Roger East.