Spain international David Silva hit the opener for City after 43 minutes. But United were gifted an equaliser in first-half stoppage time when City defender Fabian Delph fluffed a clearance and Marcus Rashford pounced to slot past City goalkeeper Ederson.
Ten minutes after the pause, City were in front. Silva's free-kick should have been cleared by Romelu Lukaku, but instead the Belgian slammed the ball into the back of teammate Chris Smalling and it looped towards Nicolas Otamendi, who stretched to fire home.
Despite claims for a late penalty, City held off United to inflict a first home defeat on Jose Mourinho's men in 41 games in all competitions.
After the defeat, Mourinho conceded the title was City's to lose. "Probably, yes,” said the Portuguese. “The advantage is a very good one."
Pep Guardiola’s men have 46 points from 16 games and remain unbeaten. On Wednesday they travel to second from bottom Swansea City who should, on paper, be lambs to the slaughter.
But Guardiola refused to get carried away and urged his players to retain their focus. "This win means a lot in the way we played for our confidence but in three days we go to Swansea in the winter time," he said.
"We are going to face a lot of difficulties. In December it's impossible to be champions but it's good for us."