Dale Steyn ended a bowling drought with a six-wicket haul as South Africa fought back on the second day of the second and final Test against India at Kingsmead on Friday.
Steyn took six for 100 as India slipped from their overnight 181 for one to 334 all out.
South Africa reached 82 for no wicket by the close, with Graeme Smith (35 not out) and Alviro Petersen (46 not out) batting confidently and scoring at better than four runs an over to reduce the deficit to 252.
Fast bowler Steyn had endured the longest period without a wicket in his Test career before he had Cheteshwar Pujara caught behind for 70 in the sixth over of a day's play which started more than three hours late because of rain.
He had bowled 417 balls since his previous wicket when he dismissed Shikhar Dhawan early in the first Test in Johannesburg.
Pujara and Murali Vijay put on 157 for the second wicket.
Vijay followed for 97 in Steyn's next over when he gloved a catch down the leg side to wicketkeeper AB de Villiers.
Rohit Sharma padded up to the next ball and watched in dismay as the ball snaked back and hit his middle stump. Steyn had captured three wickets in ten balls without conceding a run.
Vijay batted for 309 minutes and faced 226 balls before falling three short of what would have been his fourth Test century and his first outside India. He hit 18 boundaries.
With 11 overs remaining to the second new ball, Steyn was rested after one more over.
Kohli and Rahane batted solidly and then saw off the new ball, with Steyn and Vernon Philander unable to make any further breakthroughs.
Rahane was twice struck by bouncers from Steyn, on the helmet and on the upper arm.
It took a spectacular catch by De Villiers to dismiss Kohli, who made a confident 46 before glancing Morne Morkel to leg, with the wicketkeeper flinging himself to his left to take the chance.
Rahane and Dhoni scored quickly after tea until Steyn was brought back and had Dhoni caught at first slip.
Zaheer Khan slashed wildly at a lifting delivery from Steyn and was caught by a leaping De Villiers.
Ravindra Jadeja edged off-spinner JP Duminy to slip where Jacques Kallis dived to become the second man after India's Rahul Dravid to take 200 Test catches.
The innings folded quickly as Ishant Sharma was caught behind off Steyn and Mohammed Shami edged Morkel to first slip. Morkel finished with three for 50.
Rahane, playing in his third Test, was left unbeaten on 51, his maiden half-century. He batted for 190 minutes and faced 121 balls, hitting eight fours.
South Africa got off to a quick start as Smith and Petersen hit two boundaries apiece as 18 runs were scored off the first two overs.
The total was 36 after six overs before Ishant Sharma came on and bowled a testing maiden over, bowling around the wicket to the left-handed Smith with six fielders on the leg side, including three in catching positions.