Hamilton was untroubled as he secured a second straight win, fifth of the season and 67th overall.
But Mercedes missed out on a 1-2 as Valtteri Bottas was overtaken by Vettel and Kimi Raikkonen with five laps to go.
Bottas and Vettel touched during the overtaking move, with some debris flying off the Mercedes.
“I got a hit from behind. I wasn’t sure what was going on,” Vettel said.
“Lucky that the car wasn’t broken and we could carry on.”
In a dramatic finish, Bottas lost control of his car as he bumped Daniel Ricciardo’s Red Bull off the track as he was about to be overtaken.
Bottas was told on team radio to give the position back to Ricciardo, who finished a commendable fourth after starting 12th. Bottas risked further penalty after being summoned to speak to stewards over the incident.
Ricciardo’s teammate, Max Verstappen, launched a series of expletives after engine failure curtailed his race after eight laps.
It is the fourth time Verstappen has failed to finish this season. Red Bull team principal Christian Horner blamed the Renault engine as being substandard. Red Bull is splitting with Renault and working with Honda next season.
Hamilton now leads Vettel by 24 points after 12 of 21 races. They will continue their battle for a fifth F1 title when the championship resumes at the Belgian GP on Aug. 26.
Vettel and Raikkonen drove well considering both endured a botched pit stop because of a slow tire change.
Ferrari team strategy meant Raikkonen pitted twice for new tires and — on a scorching hot day — Ferrari bafflingly forgot to properly attach his drinks supply.
Hamilton secured pole with a brilliant last lap in the rain on Saturday, while Vettel started a modest fourth behind Raikkonen and Bottas.
The long straight up to Turn 1 was Ferrari’s best and — ultimately — only chance of overtaking Hamilton. But he comfortably held position while Vettel jumped ahead of Raikkonen and almost caught Bottas.
By JEROME PUGMIRE ,Associated Press