India were at 21 for three in their second innings when rain brought an early close to the third day’s play with the tourists having an overall lead of 132 runs.
Captain Virat Kohli (one) and Rohit Sharma (14) were at the crease.
First-innings centurion Cheteshwar Pujara was bowled for a duck by the second ball of the innings from Dhammika Prasad and Lokesh Rahul was again out shouldering arms, this time to Nuwan Pradeep.
Pradeep also dismissed Ajinkya Rahane to leave India tottering at seven for three.
Earlier, bowling an impeccable line and length after India made 312 in their first innings, Ishant put his team in the driving seat for a series-clinching win with the sides level at 1-1.
The tall right-arm paceman extracted enough movement off the pitch with the new ball to run through Sri Lanka’s top order and he picked up two more wickets to give India a lead of 111 runs.
Ishant had Upul Tharanga (four) caught at second slip by Lokesh Rahul, who had earlier dropped the same batsman on zero in the first over of the innings.
Tharanga could consider himself unlucky with replays showing the delivery was perilously close to a no ball but the television umpire ruled Ishant’s delivery was legal.
After opener Kaushal Silva fell to paceman Umesh Yadav for three, Dinesh Chandimal (23) launched a counter-attack.
Chandimal hit five fours in his 27-ball knock, but was given out lbw to seamer Stuart Binny with replays indicating the ball could have gone over the stumps.
Ishant returned to get Sri Lanka captain Angelo Mathews (one) edging behind with his first ball for debutant Indian wicketkeeper Naman Ojha to complete his first test dismissal.
The 26-year-old Ishant had Lahiru Thirimanne caught for a duck by Rahul immediately after lunch, reducing Sri Lanka to 47-6 and in danger of following on.
But Rahul dropped his second catch of the day, putting down debutant wicketkeeper Kusal Perera on nine off Yadav.
The movement off the pitch soon dried up for the Indian bowlers and Perera (55) made full use of the reprieve to complete his maiden half-century, studded with nine fours.
The diminutive left-hander became Ishant’s fourth victim but not until he had taken his team past the follow-on mark with Herath (49), who became Ishant’s fifth wicket of the innings.
Tharindu Kaushal (16) was given out lbw against leg-spinner Amit Mishra although replays suggested he may have found an inside edge.
India added 20 runs in the morning to their overnight score of 292-8 to complete a solid first innings and Pujara carried his bat to finish unbeaten on 145.
Left-arm spinner Herath bowled out tail-enders Ishant and Yadav to finish with three wickets and Prasad completed figures of 4-100.
(Writing by Sudipto Ganguly in Mumbai; Editing by Ed Osmond)