PSG had the chance to go top of the league with a victory at the Stade de Gerland, but were instead frustrated by the leaders in an enthralling game.
Following early dominance from the defending champions, Lyon took the lead in the 31st minute as Clinton N'Jie controlled a Jordan Ferri cross and played a neat one-two with Nabil Fekir before lashing home from closing range.
A string of Anthony Lopes saves kept Lyon ahead until the 69th minute when Lindsay Rose conceded a penalty for a foul on Marco Verratti.
Ibrahimovic saw his first effort from 12 yards kept out a diving Lopes save but was handed a second chance by referee Clement Turpin, with replays indicating that the goalkeeper was off his line and several players had encroached into the area.
And the Swede made no mistake on the second attempt as he powered into the top-left corner to keep PSG within two points of Lyon and level with second-placed Marseille.
Earlier Monaco missed the opportunity to gain ground on the top three, slumping to a 1-0 loss at 10-man Guingamp.
Guingamp beat Monaco on their way to the Coupe de France crown last season and repeated the feat at the Stade du Roudourou despite seeing Mustapha Diallo sent off in the 22nd minute for a rash challenge on Jeremy Toulalan.
Dorian Leveque settled the encounter in the 51st minute by tapping home Claudio Beauvue's far-post cross, ending a unbeaten run of eight league matches for Monaco.
Elsewhere, Nice and Nantes played out a 0-0 draw.
Thank you for reading 5 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1