Inter beat Rubin to reach knockouts
The Italian champions needed a win in their final Group F game to guarantee their passage and although their play was again far from fluent, they did enough to dump the Russians out and finish second.
Evergreen captain Javier Zanetti, filling in at left back for the suspended Cristian Chivu, showed dogged determination when surrounded by defenders in the corner and Balotelli cut the ball back for Eto'o to smash home on the half hour mark.
Balotelli had another frustrating match before blasting in a 35-metre free kick just after the hour to spark a party atmosphere.
Inter coach Jose Mourinho went on the attack from the kickoff by surprisingly including Balotelli in a three-man attack with usual starters Diego Milito and Eto'o.
Lively playmaker Wesley Sneijder, who has never lost in an Inter shirt since his August move from Real Madrid, was fit to return to the starting lineup after thigh trouble.
The hosts made a nervous start as they often do in European ties and Balotelli snatched at an early half chance at a tense, half-full San Siro.
Inter defender Walter Samuel was then carried off injured and soon afterwards Rubin's Gokdeniz Karadeniz had the first of two good opportunities when he forced Julio Cesar into a save.
After Eto'o netted and relieved the pressure, Sneijder fired just over after a fine move and Maicon was unlucky with a fierce drive as the Europa League-bound Russians again lost possession.
The irrepressible Zanetti bombed forward whenever he could and at times the Rubin defence, without the injured Roman Sharonov, struggled to cope.
The visitors, also blunted in attack by the absence Alexander Bukharov with a hand problem, improved after the break and had Inter worried for a prolonged spell before Balotelli struck the second and Sneijder hit a post from distance.