Manchester United skipper Roy Keane was sent off as Benni McCarthy's superb brace gave Porto a deserved win. United snatched an early lead when Quinton Fortune seized on Vitor Baia's fumble after Paul Scholes' free-kick.
Porto drew level in the first-half through McCarthy, who volleyed Dmitri Alenichev's cross past Tim Howard.
McCarthy's second was even better as he sent a towering header over Howard and United's misery was complete with Keane's dismissal for stamping on Baia.
United manager Sir Alex Ferguson dropped John O'Shea, preferring to partner Gary Neville with Wes Brown in central defence.
McCarthy got in between that defensive duo for both his goals, but United's problems stemmed from the Portuguese champions' relentless probing of the visitors' left flank, where Fortune was protected by Ryan Giggs.
Making light of their defensive frailities, United got off to the perfect start with their first real attack providing the opening to the goal.
After Jorge Costa fouled Giggs just outside the Porto box, the United winger rolled the ball to Scholes, whose powerful, rising free-kick was spilled by Baia allowing Fortune to strike the rebound home.
The Brazilian Carlos Alberto almost immediately equalised for Porto, but his curling shot went just over.
 | KEY MOMENTS 14 mins: Fortune gives Man Utd the lead 29 mins: McCarthy equalises for Porto as United concede their first goal in five Champions League games 78 mins: McCarthy gives Porto the lead 87 mins: Keane is sent off for the 11th time in his career |
Dmitri Alenichev should have equalised after turning inside Brown and Phil Neville only to then delay his shot allowing Gary Neville time to get in a crucial block.
After United survived another scare when Fortune deflected Ricardo Carvalho's shot away from danger, Porto drew level.
Their remorseless probing of the United right flank finally paid off when Alenichev crossed and McCarthy swivelled to volley an impressive equaliser.
McCarthy was then quick to seize upon a deflection off Phil Neville, but the South African was foiled by Howard.
After the restart Porto continued to make life difficult for United, as Alenichev, Carlos Alberto and Deco combined with their imaginative approach play.
In particular Carlos Alberto, playing only his fifth first-team appearance, caused United's defence all sorts of problems with his dribbling ability, notably when he set up a shot for Deco.
Amid this Porto barrage, United struggled to carve out chances as both Ruud van Nistelrooy and Louis Saha had to contend with a frustrating lack of possession.
With the game seemingly heading for a draw, McCarthy managed to embarrass Gary Neville and Brown for a second time with a prodigious leap to meet Nuno Valente's cross from the left.
Keane then suffered a rush of blood stamping on Baia as United went in search of an equaliser, and left Ferguson's side with a difficult task in the second leg.
FC Porto: Vitor Baia, Paulo Ferreira, Jorge Costa, Ricardo Carvalho, Nuno Valente, Pedro Mendes, Maniche, Deco, Alenitchev (Jankauskas 63), Carlos Alberto (Ricardo Fernandes 75), McCarthy (Bruno Moraes 83).
Subs Not Used: Nuno, Pedro Emanuel, Ricardo Costa, Bosingwa.
Man Utd: Howard, Phil Neville (O'Shea 70), Gary Neville, Brown, Fortune, Keane, Butt, Scholes, Saha (Ronaldo 76), Giggs, van Nistelrooy.
Subs Not Used: Carroll, Bellion, Kleberson, Djemba-Djemba, Forlan.
Sent Off: Keane (87).
Booked: Fortune, Butt.
Attendance: 49,977.
Referee: Herbert Fandel (Germany).