Dortmund's Robert Lewandowski missed a penalty and Bayern Munich's Rafinha was sent off at the Westfalenstadion.
Both teams rested key players with their May 25 meeting at Wembley in mind, but there was certainly no sense of taking things easy, with Dortmund coach Jurgen Klopp having to be separated from Bayern director of sport Matthias Sammer as tempers flared late on.
Dortmund, without the injured Mario Gotze, rested the likes of Mats Hummels and Lukasz Piszczek, and Marco Reus came on late on, while Bayern were without Philipp Lahm, Bastian Schweinsteiger and Javi Martinez, Thomas Muller coming off the bench.
Dortmund went ahead through Kevin Grosskreutz after 11 minutes, only for Mario Gomez to level after 23 minutes.
Lewandowski, who has been strongly linked with a move to Bayern in the summer, saw his 60th-minute penalty saved low down to his left by Manuel Neuer, perhaps an important psychological victory for the goalkeeper ahead of the final.
Rafinha was dismissed four minutes later after picking up two yellow cards in the space of three minutes.
Elsewhere, Stefan Kiessling scored against his former employers to break a new club goalscoring record and take Bayer Leverkusen into the Champions League next season with a 2-0 win at Nurnberg.
Omer Toprak's first Bundesliga goal opened the scoring to help Sami Hyypia and Sascha Lewandowski's men clinch at least third place in the Bundesliga.
Kiessling then netted a 62nd-minute penalty to bring up his 23rd goal of the season, making him Leverkusen's record goalscorer for a single season.
Two goals from Alexander Meier and a Srdjan Lakic strike helped Eintracht Frankfurt beat Fortuna Dusseldorf 3-1 and remain on course for a a place in the Europa League next season.
Dani Schahin pulled a goal back for Fortuna, but they left with a defeat which could see them drop into the bottom three this weekend.
They are ahead of 16th-place Augsburg only on goal difference with the Bavarians in action at Freiburg on Sunday.
Hoffenheim fought back from two goals down to keep their survival hopes alive in dramatic fashion with a 2-2 draw at fellow strugglers Werder Bremen.
An Aaron Hunt penalty in the first minute and a Kevin de Bruyne effort in the 24th appeared to have put Bremen on the way to three points, which would have been a decisive step towards safety.
However, two goals in the last five minutes from Sven Schipplock earned Hoffenheim a point and took them to within two of safety, leaving their opponents just three above the relegation zone.
Hannover and Mainz drew 2-2 at the AWD-Arena as both sides' slim hopes of European football next season all but disappeared.
Nicolai Muller scored the first and the last goal of the game for Mainz with Artur Sobiech and Mame Diouf turning things around in between.
Hannover ended the game with 10 men following a red card for Christian Schulz.
Relegated Greuther Furth stunned Stuttgart 2-0 to clinch only their fourth league win of the season.
An own goal from Sakai and Ilir Azemi's late strike earned Frank Kramer's men a fine away victory.