Buffalo also got a short-handed goal from Kyle Okposo and won for the third time in 13 games. Victor Olofsson and Jeff Skinner each had two assists. Dustin Tokarski made 25 saves.
Josh Anderson scored for the Canadiens, and Sam Montembeault stopped 35 shots. Montreal has lost six of seven and fell to 1-9-1 on the road.
The Sabres took control in the second period, outshooting the Canadiens 14-2 and scoring twice.
Okposo's short-handed goal gave Buffalo a 3-1 lead late in the second. The Sabres had killed over three minutes of a double-minor high-sticking penalty on Brett Murray when Eakin created a 2-on-1 on the forecheck, and Okposo backhanded the rebound of his own shot past Montembeault.
Eakin scored on a slick backhand pass from Vinnie Hinostroza, putting the Sabres in front midway through the second.
Thompson added his team-leading 10th goal 3 1/2 minutes into the third period. The fifth-year forward surpassed his previous career high of eight goals in 38 games last season.
Olofsson and Skinner set up both Thompson goals. The first was a one-timer from the high slot that gave Buffalo the lead in the opening minutes of the game.
Anderson responded for the Canadiens later in the first after he stripped the puck from Skinner in front of the Buffalo net.
Canadiens: D Joel Edmundson (undisclosed injury) is "trending in the right direction," said coach Dominique Ducharme, and "getting a lot closer," to making his season debut.
Sabres: Placed F Drake Caggiula (upper body) on injured reserve and called up Brett Murray from the minors. Caggiula's status is week-to-week.
Canadiens: Dressed 11 forwards and seven defencemen, drawing in D Mattias Norlinder and scratching F Cedric Paquette.
Canadiens: Conclude three-game trip at Pittsburgh Penguins on Saturday night.
Sabres: At Detroit Red Wings on Saturday night.