Dortmund were unchanged from the win over Wolfsburg, with Haaland leading the attack, supported by the front trio of Jadon Sancho, Marco Reus and Giovanni Reyna while Leipzig recalled striker Yussuf Poulsen.
There were very few chances in the opening exchanges and the first opportunity fell to Leipzig in the 25th minute after Poulsen powered a header from Angelino's cross that was saved by shot-stopper Roman Burki.
The visitors had an injury blow on the half-hour mark after Axel Witsel went down injured and he was replaced by Emre Can in the heart of midfield.
Reus had a good chance to break the deadlock for Edin Terzic's charges just before half-time after an inviting cross inside the box but he guided his header over the bar and the sides went to the break without goals.
BVB were on the front foot coming from the break and Sancho finally broke the ice ten minutes inside the second stanza with a low strike inside the box after a through ball by Reus.
The game was coming to life as Haaland came very close to doubling the lead for the visitors in the 65th minute after bursting inside the box and smashed a strike into the crossbar.
Dani Olmo also dribbled his way past a couple of defenders for Leipzig two minutes later and unleashed a strike that rattled the post.
Erling Haaland eventually gave Dortmund a two-goal cushion in the last 19 minutes with a close range header after a cross by Sancho.
The Norwegian striker sealed the three points for BVB six minutes before time with the third goal and got his brace with a clever chip over goalkeeper Peter Gulacsi from a one-on-one situation.
Alexander Sorloth got the consolation goal for Julian Nagelsmann's troops in the last minute with a strike from a rebound inside the box but it was too little too late, as Dortmund clinched a 3-1 win that took them to within three points of second-placed Leipzig in fourth spot on the log.