Over 200 passengers and crew were plucked to safety after the Mercraft 3 keeled over in heavy seas en route to a remote island, officials said.
“The wind suddenly picked up and the boat was forced to stop when the bow started taking in water. Passengers ran to the side just before it tipped over,” student Donel Mendiola told DZMM radio.
“Some of us swam, but I saw some old people who were apparently already dead,” Mendiola said.
Two men and two women were killed, while the search for those still missing has been suspended for the night, Ron Crisostomo, a civil defence official in Infanta town near Real told AFP.
“It was rainy and the wind was up. It was no longer safe for the rescuers, but they will continue tomorrow,” Crisostomo said.
Janet Balili, a local council member, told ABS-CBN television 11 people remain missing.
The station aired footage of rescuers taking injured survivors to a hospital. Four body bags were also seen being laid out on the floor.
The boat tipped over between the remote island of Polillo and Real town, about 70 kilometres (45 miles) east of Manila, shortly before noon (0400 GMT), the coastguard said.
It said the ferry was carrying 251 passengers and crew when it left the port of Real for Polillo, a 2.5-hour trip.
“We believe the weather was a big factor” in the accident, coastguard spokesman Armand Balilo told a news conference in Manila.
The ferry sailed as Tropical Storm Tembin loomed over the southern Philippines, nearly a thousand kilometres away.
The vessel, which is licensed to carry up to 286 people, was allowed to sail as there were no storm warnings at or around Real or Polillo, Balilo said.
The government had advised Filipinos planning to return to their home provinces for Christmas to do so earlier than usual to avoid heavy weather forecast to hit ahead of the holidays.
Another storm killed more than 40 people in the central Philippines last weekend.
The Philippines, an archipelago of more than 7,000 islands, is plagued by poor sea transport, with its badly regulated boats and ships prone to overcrowding and accidents.
The latest incident occurred 30 years after another Philippine ferry, the Dona Paz, collided with an oil tanker in a pre-Christmas accident that claimed more than 4,000 lives in the world’s worst peacetime disaster at sea.
More recently, the Kim Nirvana ferry capsized shortly after departure off the city of Ormoc in the central Philippines in 2015, killing 61 people. The accident was thought to have been due to overcrowding.