A strong Inter start saw Thibaut Courtois save from Edin Dzeko and Milan Skriniar head over from a corner, before Madrid's first attempt as Casemiro's long-range effort flew wide. Courtois was called into action again to palm away Lautaro Martinez's header, Eder Militao headed a great chance off target, Marcelo Brozovic shot past the post and Dzeko tested Courtois again before half-time.
After the break, Courtois was busy again, clawing Stefan de Vrij's header away, before Dani Carvajal tested Samir Handanovic and David Alaba cut out Denzel Dumfries' dangerous cross. Karim Benzema went closest to scoring for Madrid before subs Camavinga and Rodrygo combined to steal all three points.
Thank goodness for Courtois. Four good saves here avoided this becoming really quite embarrassing for Real Madrid. For some time now, Courtois has been right up there with Benzema, Luka Modric and Casemiro in making up the all-important spine of this Real Madrid team. Here, he was the outstanding player, a wall that Inter just couldn't find their way past.
The impact of Rodrygo and Camavinga off the bench is hugely encouraging, especially that of the latter, whose darting run in behind and first-time assist were a delight. A point away from home against an impressive Inter would have been a pretty good result, but a win -- especially given the balance of play and chances created -- is an outstanding one.
Inter were far, far superior in a first half that saw them create numerous chances, while Real Madrid struggled to gain a foothold, registering not a single shot on target. The Italians were better organised, more energetic and direct as Dzeko, Skriniar, Martinez and Brozovic all went close. Only Courtois and some poor finishing kept the visitors in the game.
Manager rating out of 10
8 -- Carlo Ancelotti sprang a surprise with his team selection by picking Lucas Vazquez ahead of Eden Hazard, citing the need for "energy" in attack. He chose David Alaba at centre-back -- the coach has been clear that is his preferred position for the summer arrival -- and that meant Nacho at left-back.
The first half was desperately poor as Madrid never quite got going. Ancelotti seemed reluctant to make sweeping changes, but when he brought on Rodrygo and Camavinga it was to great -- and match-winning -- effect.
Player ratings (1-10; 10 = best, players introduced after 70 minutes get no rating)
GK Thibaut Courtois, 8 -- Saved early with his feet from Dzeko, then from Martinez's header, and again from Dzeko before the first half was up. Did well again to deny De Vrij in the second.
DF Dani Carvajal, 7 -- It still feels like Carvajal isn't quite at his best since returning from injury, just a little below par in defence and attack. Had a second-half effort saved.
DF Eder Militao, 7 -- Should have scored on 35 minutes with a free header that he put wide.
DF David Alaba, 7 -- Played at centre-back. A mistimed second-half challenge on Dzeko saw him pick up a yellow card. One important clearance after that.
DF Nacho, 7 -- More comfortable in the middle than on the left. Had a tough time in the first half, lucky to escape a yellow card and then caught badly by Brozovic.
MF Federico Valverde, 7 -- Got back brilliantly to cut out one first-half Inter break. Had the opportunity to play a teammate in on goal later but found a defender. Created Madrid's best second-half chance for Benzema, and never stopped running.
MF Casemiro, 7 -- Took a shot from long range early on. Grew into the game.
MF Luka Modric, 6 -- He's never bad, but sometimes here it looked like too much of the midfield creative burden was on him, without regular partner-in-crime Toni Kroos.
FW Lucas Vazquez, 6 -- Had a first-half penalty appeal waved away by the referee and VAR. The first man off as Ancelotti looked for more goal threat from Rodrygo.
FW Karim Benzema, 6 -- Got one unorthodox first-half attempt on goal wrong from a decent position. Looked more of a goal threat after half-time and headed wide with ten minutes left.
FW Vinicius Junior, 7 -- A quiet first half, given the form he's been in, as Inter didn't give him the space he needs. Improved as the game went on.
FW Rodrygo, 8 -- Came on for Lucas Vazquez and grabbed the crucial late winner. There's something about him in the Champions League.
MF Eduardo Camavinga, NR -- Played the last 10 minutes, on for Modric, and created Rodrygo's goal with a clever run and sublime touch.