Lewis Hamilton raced to his third win of this season in Bahrain while Kimi Raikkonen won a thrilling fight for second.
While Hamilton had an easy run in the desert on Sunday night, only ever relinquishing the lead while the pit stops played out, Ferrari and Nico Rosberg had a great battle.
Rosberg first had to overtake Raikkonen, who got ahead of him at the start, lunging up the inside to take P3 off the Finn. Laps later he pulled a carbon copy to take second off Vettel.
That sparked - literally - a thrilling battle between the two for second place as Rosberg had the better pace but kept losing the position in the pit stops, both of which saw Vettel stop first.
Each time, though, the Mercedes driver fought back with their tussle ending on lap 35 when Vettel ran very wide at Turn 14 and allowed Rosberg a free pass.
The Ferrari driver reported damage to his front wing and headed into the pits for a third stop and a new front wing, which dropped him out of podium contention.
Hamilton, despite a brake-by-wire concern in the final lap which saw Mercedes tell him to be "cautious on the brakes", raced to his third win of this season, extending his points tally to 93, while Rosberg threw away second on the penultimate lap.
Caught by the flying Raikkonen, who went for a soft-medium-soft strategy which included a long middle stint, Rosberg ran wide at Turn 1 and lost the position to the Finn. He tried to fight back at Turn 4 but the Ferrari driver held on to finish second, his first podium since 2013. Rosberg was third.
Valtteri Bottas was fourth for Williams as, even though Vettel was right on his rear wing for the final ten laps, the Ferrari driver just wasn't able to find a way through. A mistake or two as the laps counted down didn't help his cause.
Daniel Ricciardo equalled his best finish of the season with a P6 even though his engine blew as he crossed the line while Romain Grosjean was seventh ahead of Sergio Perez.
Daniil Kvyat was ninths while Felipe Massa, whose Williams failed to leave the grid for the formation lap and therefore had to start from the pit lane, completed the top ten.
Fernando Alonso just missed out his first points upon his McLaren return as he was P11. His team-mate Jenson Button did not start at all as an electrical problem when McLaren fired up his car meant the team did not send him out to the grid.
He was joined on the sidelines by Carlos Sainz, who pulled off the circuit on lap 32. He reported "I feel something break on the car." Five laps later his team-mate Max Verstappen pulled into the pits to retain his STR10.
01 Lewis Hamilton Mercedes 1:35:05.809
02 Kimi Raikkonen Ferrari 3.3
03 Nico Rosberg Mercedes 6.0
04 Valtteri Bottas Williams 42.9
05 Sebastian Vettel Ferrari 43.9
06 Daniel Ricciardo Red Bull 61.7
07 Romain Grosjean Lotus 84.7
08 Sergio Perez Force India 1 LAP
09 Daniil Kvyat Red Bull 1 LAP
10 Felipe Massa Williams 1 LAP
11 Fernando Alonso McLaren 1 LAP
12 Felipe Nasr Sauber 1 LAP
13 Nico Hulkenberg Force India 1 LAP
14 Marcus Ericsson Sauber 1 LAP
15 Pastor Maldonado Lotus 1 LAP
16 Will Stevens Manor 2 LAPS
17 Roberto Merhi Manor 3 LAPS
Did Not Finish
Max Verstappen Toro Rosso 23 LAPS
Carlos Sainz Toro Rosso 28 LAPS
Jenson Button McLaren Did not start