Keith Kinkaid made his second start of the season, stopping 33 shots for the Devils (5-3-3). It was the first road win of the season for New Jersey, after starting 0-3-2.
Eddie Lack made 17 saves for the Hurricanes (3-5-3).
Cammalleri's first goal of the season gave New Jersey a 1-0 lead at 4:31 of the second period. He one-timed Travis Zajac's pass across the faceoff circles. Beau Bennett got the secondary assist.
"Beau Bennett makes a good second and third effort to keep that play alive, and Travis, he's been playing so well," Cammalleri said. "He takes his time, makes plays, and beats people -- and finds me on the back side."
WATCH: All Devils vs. Hurricanes highlights
New Jersey made it 2-0 at 7:56 of the second. Jacob Josefson, in the lineup after being scratched the past six games, carried the puck along the right-side boards before feeding Cammalleri for a low shot to the far post.
The Devils took three minor penalties in the second period, but held Carolina to five shots.
"If you start getting frustrated and you start thinking it's going to be easy, it's not," Hurricanes coach Bill Peters said. "Penalty killers are hard-working people. Especially in the National Hockey League, lots of guys make their living doing that. So if you're going to have a good power play, you have to exceed their work ethic and you have to execute."
Cammalleri pushed the lead to 3-0 at 8:30 of the third period after Bennett left a perfect drop that his linemate sent over Lack's glove.
Andrej Nestrasil cut the lead to 3-1 at 13:01 of the third. He gathered the rebound of Noah Hanifin's wide shot and pounded it in at the left post. Jordan Staal, playing in his 700th NHL game, had the secondary assist.