Limo, running for the first time in London after recording wins in Rotterdam, Berlin and Chicago, came home two seconds ahead of Lel, with Ramaala 14 seconds adrift in third place.
Lel said: "I had a really good race. I'm not disappointed with second as that sort of thing is part of the race."
The leading men's contenders, including four-times world 10,000m champion Gebrselassie, remained tightly bunched on a cool, wet morning until the 30km mark when Kenyan Evans Rutto accelerated to the front.
Rutto was unable to shake off the pack and the next break came at 38km when Kenyan Rogers Rop and Lel moved away.
Ramaala responded before Limo and Lel made their final move.
Ramaala said: "With not long to race I wanted to push on, but I felt a slight twinge in my hamstring."
Marathon debutant Peter Riley was the first Briton home, in 12th place.
Riley said: "It was a new experience for me - I've only ever been over 10k three times before.
"I was surprised by the early pace as I've never run so slow before. I began to feel some muscle pain at about 18 miles but I had loads of energy."
Men's London Marathon:
1. Felix Limo (Kenya) 2 hours 6 minutes 39 seconds
2. Martin Lel (Kenya) 2:06:41
3. Hendrick Ramaala (South Africa) 2:06:55
4. Khalid Khannouchi (United States) 2:07:04
5. Stefano Baldini (Italy) 2:07:22
6. Rogers Rop (Kenya) 2:07:34
7. Hicham Chatt (Morocco) 2:07:59
8. Jaouad Gharib (Morocco) 2:08:45
9. Haile Gebrselassie (Ethiopia) 2:09:05
10. Evans Rutto (Kenya) 2:09:35