全部人馬,退回官渡。
袁軍接連打了兩次敗仗,士氣低落,但是袁紹仍然自恃兵多,盲目冒進。七月,袁紹把大軍集結到官渡北面的陽武,準備繼續發動進攻。沮授勸他不要輕易進行決戰,可用持久戰來消耗曹軍力量,最後戰勝曹操。袁紹不聽,命令主力部隊直逼官渡。官渡離曹操當時的政治中心許昌不到二百里,是南北交通的咽喉。如果官渡失守,許昌就失去了屏障。因此曹操竭盡全力固守官渡陣地,和袁軍形成對峙局面。
雙方在官渡相持了三個多月。曹操方面軍隊人數少,軍糧又很缺乏,戰爭如果曠日持久地僵持下去,將對曹軍不利,曹操統治區內有些郡縣就已經叛變了。面對這種情況,曹操曾一度打算退守許昌。曹操的謀士荀彧(yu 鬱)向他詳細分析了戰爭的前途,鼓勵他在關鍵時刻,一定要堅持下去,以便爭取戰爭的最後勝利。曹操接受了荀彧的意見,堅定了同袁紹周旋到底的決心。他一面命令部隊繼續固守官渡,一面密切注視袁軍的動態,尋找有利戰機,進行最後決戰。
一天,曹軍的探子偵察到:有幾千輛袁軍糧車,正在往官渡運送途中,押運官韓猛是個有勇無謀的人,打起仗來輕敵少備。曹操聞報,立刻派部將徐晃、史渙前往劫糧,在半路上打跑了韓猛,燒掉了他押送的全部糧車和軍用物資。到了十月,袁紹又派人從河北運來一萬多車軍糧,囤積在大營以北四十里的故市、烏巢(都在今河南延津境內),還特派大將淳于瓊帶領一萬人駐在那裡保護。由於上次糧車被燒,一度造成袁軍給養困難;這次沮授特別提醒袁紹,要他另派蔣奇率領一部分軍隊駐防在淳于瓊的外側,以防曹軍偷襲。袁紹又沒有采納。謀士許攸認為曹軍主力集中官渡,後方必定空虛,他建議袁紹派遣輕騎抄襲曹軍後方,星夜襲佔許昌。袁紹驕傲地說:“不必,我一定可以在這裡擒住曹操!”許攸感到袁紹這樣驕傲輕敵,最後必然要敗給曹操,不免對袁紹失去信心。正在這時,許攸的家族有人犯了法,被留守鄴城的審配拘留起來。許攸一氣之下,背棄袁紹,去投奔曹操。
曹操聽說許攸來投靠,高興得連鞋子都沒有來得及穿,就跑出去迎接。曹操拍手說:“子遠(許攸的字)遠道而來,我的大事一定可以成功了。”許攸坐下來。開口就問曹操:“袁紹軍勢很盛,您打算怎樣對付他?目前還有多少軍糧?”曹操說:“可以支援一年。”許攸知道這是假話,就說:“沒有這麼多吧!”曹操又說:“可以支援半年。”許攸直截了當地說:“您不想打敗袁紹嗎?為什麼不說實話呢:”曹操知道瞞不過許攸,才說:“其實軍糧只夠維持一個月了,你看該怎麼辦呢?”許攸見曹操說了實話,這才把袁紹在烏巢堆積軍糧的情況完全告訴了他,並且說:“袁軍糧囤沒有特別防守,如果您率領輕兵前往偷襲,把袁紹的糧草和輜重全部燒掉,不出三天,袁軍將會不戰自潰。”
許攸的獻策,使曹操喜出望外。當天夜裡,萬籟俱寂,星光滿天,曹操留下曹洪、荀攸防守官渡大營,親自率領精銳步騎兵五千人,打著袁軍旗號,每人手持一束乾柴,口裡銜著橫枚,把所有的馬嘴都綁紮起來,從小路奔向烏巢。枚是一根象筷子樣的小木棍兒,古代夜間行軍或偷襲敵營,往往讓軍士每人口中銜枚一個,以免說話或出聲,被敵人發覺。枚的兩頭還有繩子拴在脖子上。在行軍途中,曹軍忽然遇到一隊袁軍,盤問他們是何處兵馬。曹操讓士兵回答說:“袁將軍恐怕曹操偷襲烏巢糧囤,特地派我們前去增援。”就這樣,曹軍順利地透過了袁軍的防線。天還沒亮,他們就摸進了烏巢,把袁軍的糧囤團團圍住,放起火來。在黑夜裡,只見糧囤周圍濃煙四起,火光沖天。袁軍從夢中驚醒,慌作一團,不知如何是好。袁軍守將淳于瓊倉促應戰,經過曹軍一陣猛攻,只得退守營門。
袁紹聽說曹操進攻烏巢糧囤,仍舊沒有引起足夠的重視,反而盲目地認為這是攻下官渡、殲滅曹軍主力的好機會。他對長子袁譚說:“即使曹操攻破淳于瓊,只要我們攻下曹操的大營,他就沒有退路了!”於是命令大將張郃(he合)、高覽率兵去攻打曹操官渡大營。張郃認為曹操親領精兵圍攻烏巢,恐怕淳于瓊支援不住。如果烏巢有失,大事也就完了。因此,他一再請求袁紹先派兵去救淳于瓊。可是,袁紹在謀士郭圖的迎合下,仍然堅持以主力去進攻曹操官渡大營,只派少數騎兵去救烏巢。由於曹軍官渡陣地堅固,戰士死守,袁軍攻打不下,主力部隊反而被吸引住,這就給曹操攻下烏巢創造了有利條件。當袁紹的增援騎兵臨近烏巢的時候,曹操的部下慌忙報告說:“敵人援軍就要到了,我