While authorised by Moscow officials, the demonstration was restricted to a southeastern suburb 15 kilometres (9.3 miles) from the city centre, under a heavy security presence.
Russian police, cited by news agency Ria Novosti, said 4,000 had joined the protest, while organisers reached by AFP put the number at 7,000.
Waving Russian flags, the protesters carried placards that read: "Who killed Nemtsov?", a reference to Kremlin critic Boris Nemtsov who was assassinated just steps from the Kremlin in February.
"The people who are here are those who believe in something better," opposition leader Navalny told the crowds.
More From This Section
"We are not fighting against Putin, but against people who do not believe that it is possible to change anything," said Navalny, a prominent blogger. "Change is possible, and we will get there."
Ivan Petrov, a 44-year-old maths professor who came to protest, told AFP: "I'm sick of this vertical power. They are all incompetent because there is no political competition, and smart people are leaving the country in droves."
The protest comes a week after regional elections confirmed the dominance of pro-Kremlin party United Russia. Many opposition candidates were banned from standing and opposition parties have blasted the vote as fraudulent.