The Swede slammed home a fifth minute penalty to score the only goal of a pulsating Derby della Madonnina which also saw Milan defender Ignazio Abate sent off in a highly competitive second half.
The 274th Milan derby began at break-neck pace with Milan taking hold of the game from the very first whistle.
Clarence Seedorf should have given the Rossoneri a third minute lead but he headed Abate’s cross over the crossbar from seven yards.
However, Milan did not have long to wait for the opening goal as Ibrahimovic fired a spot-kick past Inter stand in Luca Castellazzi two minutes later after Marco Materazzi had tripped the Swede inside the box.
Ibrahimovic was really tormenting his former side at this stage and fired a Van Basten-like volley inches over the crossbar, and then side-footed a pass across the face of goal for Mathieu Flamini, but Ivan Cordoba made a desperate lunging challenge to deny the Frenchman.
Milan were threatening to extend their lead and had the ball in the net again in the 22nd minute after Ibrahimovic accepted an Abate pass and quickly slipped Robinho through on goal with a delicious flick. The Brazilian calmly slotted the ball into the net but had made his run a half second too early and the strike was disallowed.
For their part, the home side gradually began to force their way into the game in the final 10 minutes of the first half.
Substitute Philippe Coutinho replaced the injured Joel Obi in the 36th minute and rifled a low shot wide of the upright less than sixty seconds later after neat link up play between Samuel Eto’o and Wesley Sneijder.
The Interisti thought their side had restored parity four minutes before the interval, but Sneijder’s free-kick had only crashed into the side-netting and thereby ensured that the visitors would take a one-goal lead into the second half.
Both sides made half-time changes with Massimiliano Allegri taking the opportunity to replace Gennaro Gattuso, who was walking a tightrope after an early booking, with Andrea Pirlo, while Rafael Benitez threw on Goran Pandev in place of the ineffectual Diego Milito.
The Nerazzurri continued where they left off in the first half, with Sneijder firing in a couple of testing long range drives in the first ten minutes of the second 45.
Sneijder went closer still in the 56th minute with a powerful 35-yard free-kick which Christian Abbiati did well to bat away with a strong double-handed save.
Although Inter were dominating the early stages of the second half, the match totally turned in their favour on the hour mark when Abate was dismissed for a second yellow card after an unnecessary tussle with Pandev, who was also cautioned for his part in the incident.
Inter seized the initiative but struggled to find a way past Milan’s stubborn resistance.
Sneijder had yet another strike from distance saved by Abbiati, while Dejan Stankovic failed to hit the target with a similar effort six minutes later.
With Inter throwing everything into attack, Milan almost added to their lead with a rapid counter in the 68th minute, but Seedorf’s snap shot finished inches wide of the upright.
The remainder of the match saw the Nerazzurri camped in the Milan half of the field but for all their possession, they lacked the necessary imagination and invention in the final third and the visitors held out for an impressive victory, which is made all the sweeter by the fact it has ended their rivals’ long held unbeaten home record.
Next Saturday, Milan welcome Fiorentina to the Giuseppe Meazza and will be confident of securing all three points against an underachieving Viola side, while Inter travel east to meet Chievo in Verona, and they too will be looking for a victory to get themselves back in the title race.