Bangladesh, who were in a must-win situation after losing the first two games of the five-match series, restricted Zimbabwe to 204 after scoring a challenging 244-9 on Wednesday.
Opener Rajin Saleh top-scored for Bangladesh with a solid 77.
Zimbabwe could never seriously threaten Bangladesh's total on a slow pitch despite a second successive half-century from opener Barney Rogers (51) and a defiant 46 from skipper Tatenda Taibu.
The tourists found runs hard to come by against man-of-the-match Rana, who kept a tidy line and length during his 10 overs to complete a maiden four-wicket haul.
Seamers Mashrafe Mortaza, Nazmal Hossain and Khaled Mahmud each finished with two wickets.
Rogers, who scored 66 in the previous match here on Monday, put on 45 for the opening wicket with Stuart Matsikenyeri but his team failed to build on the good start.
Zimbabwe's hopes of surpassing their opponents' total receded sharply after the dismissal of Rogers, who was trapped leg-before by Mahmud.
Taibu and Elton Chigumbura were involved in a battling 44-run stand for the sixth wicket, but the asking-rate kept climbing as Zimbabwe needed 91 to win in the last 10 overs with five wickets in hand.
Rana then removed Chigumbura (27) and Prosper Utseya (one) in quick succession to ensure his team's victory.
Earlier, Bangladesh rode on Saleh's half-century to post a competitive total after electing to bat.
Saleh put on 58 for the opening wicket with Nafis Iqbal (24) and 89 for the second with Aftab Ahmed (38) to keep the pressure on the Zimbabwean bowlers and fielders.
He hit one six and six fours in his fifth half-century in 30 matches before being caught by Dion Ebrahim off paceman Chigumbura.
Zimbabwe struck back after Saleh's dismissal, grabbing four wickets in the space of 31 runs to reduce the hosts to 178-5.
Skipper Habibul Bashar (26) and Mortaza (21) then made useful contributions in the closing overs.
Spinners Utseya and Brendan Taylor, and paceman Tinashe Panyangara took two wickets apiece for Zimbabwe.