Leclerc led the opening phase of the race from pole position but fell behind Vettel after Ferrari pit the second-placed car first, which Vettel converted into a first win of the season to end a drought stretching back to the 2018 Belgian Grand Prix.
After being told to save his engine 15 laps from the finish, Leclerc’s response to Ferrari included: “I just don’t think it is fair, but I won’t do anything stupid.”
Max Verstappen completed the podium for Red Bull, after early second-place runner Lewis Hamilton slipped to fourth after the longest opening stint of any of the frontrunners.
Hamilton led the pursuit of Leclerc in the opening stages, but Leclerc was managing his pace and backed up the front group.
That prevented any of the drivers from the big three teams from attempting an undercut until lap 19, as the midfield package remained too close to the frontrunners.
However, once those in the midfield started to pit, a gap emerged – and Verstappen looked set to be the first to utilise that as he complained of fading rear tyres.
At the same time, Ferrari brought in third-placed Vettel, which also gave him the chance to use fresh tyres to get ahead of Hamilton.
Leclerc stopped one later, but Vettel’s pace advantage was sufficient to leapfrog his teammate – vexing Leclerc but moving Ferrari from first and third into a provisional, net one-two.
Mercedes opted to extend Hamilton’s stint out front by six laps compared to Leclerc and his pace faded considerably on ageing softs.
Hamilton’s pace was so poor that Mercedes even ordered Valtteri Bottas, who had already stopped from fifth place, to back off the lap before Hamilton’s pitstop.
This was to prevent Hamilton losing track position to both Bottas and the second Red Bull of Alex Albon, thus protecting fourth and fifth for Mercedes.
Once behind, Leclerc started to pressure Vettel but lost ground to his teammate as they worked their way through the midfield cars running long.
Vettel’s progress to the front included an aggressive move on Pierre Gasly’s Toro Rosso, and when he got there he had to manage three safety-car periods.
The first of those came when Romain Grosjean and George Russell collided and the Williams was turned into the wall exiting Turn 8 on lap 36.
Vettel faced no threat at the restart on lap 41 but the safety car emerged again three laps later, after the Racing Point of Sergio Perez stopped on the straight between Turns 10 and 11 with an unknown problem.
That took three laps to clear, during which Leclerc requested “everything” for the restart but was told by Ferrari to manage the engine and “bring the car home”.
“Yeah, I won’t do anything stupid – it’s not my goal,” Leclerc responded. “I want us to finish one-two, I just think it’s not fair. This won’t change, I won’t be stupid.”
One final safety car period stood between Vettel and victory, thanks to Daniil Kvyat lunging Kimi Raikkonen at the first corner on lap 50, breaking the Alfa Romeo’s front left wheel and putting Raikkonen out on the spot.
A one-lap safety car appearance followed, after which the race continued without interruption as Vettel won by 1.6s.
Verstappen fended off Hamilton to complete the top three at a race Red Bull and Honda had hoped to challenge for victory, but a return to the podium was reward for the team’s decision to stop in parallel with Vettel while running fourth early on.
Bottas finished fifth, missing out on fastest lap late on after dropping away from Hamilton to get clear air, with Albon in sixth place.
Hulkenberg dived inside Sainz at the fast Turn 4 right-hander, clobbering the right-rear of the McLaren and forcing Sainz to limp back to the pits.
Norris moved ahead of Hulkenberg when the German was forced into the pits at the end of the lap with damage, and serenely controlled the best-of-the-rest contest thereafter.
Pierre Gasly battled to eighth with a strong drive aided by a long first stint and a gutsy outside pass on Kevin Magnussen after a safety car restart.
Hulkenberg recovered to ninth ahead of Antonio Giovinazzi, who led briefly as Alfa committed him to a long first stint but dropped right back at one stage after being hit by Daniel Ricciardo.