173 senators voted in favour, 71 against and none abstained.
The bill will now pass to the Chamber of Deputies, but a final vote there, expected within two months, is seen as a formality.
It was watered down after a controversial provision that would have allowed gay people to adopt their partner's biological child was scrapped amid staunch opposition.
Prime Minister Matteo Renzi, who made civil unions a cornerstone of his mandate, simply tweeted "Love wins", before linking to a statement on his Facebook page.
He wrote on Facebook that today "will remain in the history of this legislature and of our country".
"By requesting a confidence vote, we bound the government's very survival to a civil rights battle," he added. "It hadn't happened before, and it wasn't easy now. But it was the right thing to do."
But the bill's author, Monica Cirinnà, was less enthused, describing the vote as “a hollow victory”.
“It's a first step, a victory with a hollow heart,” she was quoted by Ansa as saying.
"This is a very important measure but I am also thinking of the children of so many friends."
Renzi's Democratic Party failed to push through a more robust version of the bill last week, after the Five Star Movement (M5S) withdrew its support at the last minute.
Italy is the last major country in western Europe not to offer gay civil unions, with close ties to the Vatican sinking all previous attempts.