A second ferry ran aground nearby, but all its passengers were said to be safe.
Indonesian ferry accidents have killed hundreds of people in recent years. Boats are often overcrowded, and safety regulations are poorly enforced. The vast country spans more than 17,000 islands, and boats are a popular and relatively cheap form of transportation.
The Dumai Express 10 sank in stormy weather 90 minutes into an inter-island trip from Batam to Dumai in Riau, a province off Sumatra island in western Indonesia. The area is about 600 miles (900 kilometers) northwest of Jakarta.
The ship sank about 30 minutes after huge waves damaged its bow and water started seeping in, according to a report from the ship's captain, said Lt. Col. Edwin, the local navy chief.
A survivor, who only gave his name as Riki, said he escaped from the ship by breaking a window and was rescued by fishermen, the official news agency Antara reported.
"It was too fast ... and the ship crew did not tell us about the situation at all," he said. "We only managed to get out after I broke the glass window on the right side. That was the only way because there were many people jostling for the doors."
He said he saw some passengers jump into the sea without life jackets. Passing boats picked up dozens and took them to nearby islands for medical treatment.
Local television news showed two survivors, wearing life jackets, floating on the water.
High waves made the rescue operation difficult. At its peak, there were at least nine ships and several fishing boats searching the choppy sea.
Rescue teams found 29 bodies, including those of two children, according to the latest reports, said Rustam Pakaya, the head of the Health Ministry's crisis center. He said at least 17 others were believed to be missing. Some 245 survivors were rescued.
Authorities called off search and rescue operations after nightfall, said Yasin Kosasih, a local police chief coordinating the rescue mission.
"Considering the weather conditions and the dark, we ... will resume the search tomorrow morning," Kosasih said.
There was some uncertainty about how many people were on board the ferry when it sank.
Police and navy officials said the ferry manifest listed 228 passengers, including 15 children, and in addition, there were 13 crew, but the number of people accounted for has already surpassed that.
The ship had a capacity of 273, but it is not uncommon for ferries to be overloaded.
In a separate accident Sunday, a second ferry, the Dumai Express 15, with 278 people on board ran aground on its way from Batam to Moro island in Sumatra. No one was hurt, said local police chief Yasin Kosasih. All were evacuated to a nearby island.
Indonesia has suffered several major ferry accidents in recent years.
In December 2006, a crowded ferry broke apart and sank in the Java Sea during a violent storm, killing more than 400 people.