袁紹見劉備去了不回,大怒,便想發兵討伐。謀士郭圖道:「劉備不足爲慮,曹操才是勁敵,不可不除。江東孫策威鎮三江,主公可以派人聯絡他共同進攻曹操。」袁紹依言修書。
不料袁紹的使者見過孫策後不久,孫策便得病身亡。張昭、周瑜等人輔佐他的弟弟孫權繼承了江東的基業。曹操得到訊息,當即奏封孫權爲將軍,兼領會稽太守。袁紹見曹操又結納了孫權,大怒,便率領冀州、青州、幽州、并州等處人馬七十餘萬,旌旗遍野,刀劍如林,去攻許都。袁紹謀士沮授進諫道:「我軍雖然人數衆多,但勇猛不如曹軍;曹軍雖然精良,但糧草不如我軍。曹軍缺少糧草,利於急戰;我軍糧草充足,利於緩守。若能延長時日,則曹軍會不戰自敗。」袁紹非但不聽,反而大怒,將沮授鎖禁在軍中。
消息傳到許都,上下震動。曹操雖坐鎮許都,挾天子以令諸侯,但以實力而論,此時天下沒有能勝出袁紹者。郭嘉論及曹操與袁紹實力對比,曾提出「十勝」、「十敗」之說,以爲曹操有十處能勝出袁紹,如:袁紹外寬內忌,任人唯親,曹操則外簡內明,任人唯賢;袁紹多謀少斷,曹操則當機立斷;袁紹好聽讒言,曹操則遇事分明;袁紹是非混淆,曹操法紀嚴明;袁紹好虛張聲勢,實則不懂兵法,曹操則能以少勝多,用兵如神……謀士荀攸也以爲袁紹雖然兵多但不足以畏懼,因曹軍都是精銳之士,人人以一當十,但曹軍糧草不足,利在速戰速決。曹操匯集衆議,整頓兵馬,起兵七萬前去迎敵。雙方在官渡相遇。
兩軍對壘,袁紹金盔金甲,錦袍玉帶,帳下張郃、高覽、韓猛等戰將陣容嚴整。曹操帶許褚、張遼、徐晃等出馬,質問袁紹何故反叛。袁紹大怒道:「你名爲漢相,實爲漢賊!罪惡甚於王莽、董卓!」曹操道:「我今奉聖旨前來討伐你!」袁紹也道:「我奉皇上衣帶詔來討賊!」曹操派張遼、許褚出馬,袁紹手下張郃、高覽迎戰,一陣交鋒,袁紹終究人多勢衆,陣上萬箭齊發,曹軍大敗,退至官渡堅守不出。袁軍築土山、挖地道攻營,都被曹軍破去。守了一個多月,曹軍糧草告急,急忙派人到許昌讓荀彧籌集糧草。使者走不到三十里,被袁軍捉住,押來見許攸。許攸忙報告袁紹曹操糧草告急,可以趁機攻之。袁紹知道許攸是曹操的故交,疑心許攸私通曹操來行誘敵之計,反將許攸罵出。許攸見袁紹不信任自己,便偷偷地去投奔曹操。
曹操聽說許攸來了,連鞋子也來不及穿,光著腳就出帳迎接。許攸問曹操營中有多少軍糧,曹操說可支付一年,許攸笑道:「恐怕未必。」曹操又道有半年,許攸拂袖而起道:「我以誠相投,公如此欺騙,真讓我大失所望!」曹操挽留,道軍中糧草只夠三個月了。許攸笑道:「世人都道曹孟德奸雄,果然如此!」曹操也笑道:「豈不聞兵不厭詐!」於是在許攸耳邊悄悄說:「軍中只有本月之糧了。」許攸大聲道:「休要瞞我,糧草已經盡了!」曹操大驚,問許攸如何知道,有何對策。
許攸道:「袁紹的糧草輜重,都堆積在烏巢,由淳于瓊把守。此人好酒,防備鬆懈。你可以派人假扮袁兵前去護糧,乘機放火。這樣,袁軍不出三天,不戰自亂。」曹操大喜。
第二天,曹操便讓荀攸、曹洪等人守大寨,夏侯惇,曹仁則各帶一支人馬埋伏左右,以防不測。曹操親自領張遼、許褚、徐晃、于禁等,率兵五千,打著袁軍旗號,軍士都背著薪柴等引火之物,黃昏時分,向烏巢進發。袁紹謀士沮授此時正被押在營中,推測曹軍會去燒糧草,連夜求見袁紹,讓袁紹派重兵提防。袁紹不聽,怒責沮授。
曹操一路進兵,並無阻礙。到了烏巢,就四下放火。淳于瓊這天夜裡正喝得大醉,來不及抵抗就做了俘虜。一時間,火焰四起,煙霧沖天,袁紹糧草一燒而空。袁紹在大營里見北方火光沖天,知道烏巢有失,忙命張郃、高覽領兵五千去攻曹軍大營,蔣奇領兵一萬,去救烏巢。蔣奇中了埋伏,被張遼斬了。張郃、高覽一進曹營,兩邊伏兵齊出,袁軍大敗。袁紹以爲兩個不肯用力,要抓他們治罪。張郃、高覽無奈,只得降了曹操。
袁軍失了糧草,人心惶惶。當夜,曹操便分兵三路前往劫寨,袁軍損失大半。曹操又散布謠言,騙袁紹調動兵馬,乘亂衝殺一陣。袁軍全無鬥志,四散逃跑。袁紹只帶著八百騎兵,渡河逃命。袁紹回到冀州,重新整頓兵馬。大兒子袁譚、二兒子袁熙、外甥高幹,分別從青州、幽州、并州帶領人馬前來相助。袁紹便又聚集了二三十萬大軍,來戰曹操。兩軍在隊。左軍:一隊夏侯惇,二隊張遼,三隊李典,四隊樂進,五隊夏侯淵。右軍:一隊曹洪,二隊張郃,三隊徐晃,四隊于禁,五隊高覽。中軍許褚爲先鋒。十隊人馬先去埋伏停當。到半夜,許褚假裝劫寨,袁紹全軍出擊。許褚一直退到黃河邊上。此時,曹軍已無退路。曹操大叫一聲:「前面已無去路,大家拼死一戰吧!」許褚掉轉馬頭,飛馬當先,連斬數將。士兵們也奮勇爭先,袁軍大亂,急忙後退。這時,左右曹軍伏兵齊出,袁紹心驚膽戰狼狽不堪,袁軍屍橫遍野死傷無數。袁紹與三子一甥拼死殺出重圍,兵馬死傷殆盡。袁紹抱住三子大哭一場,不覺昏倒在地。衆人急救,袁紹口吐鮮血不止,嘆息道:「我經歷大戰數十次,想不到今日如此狼狽!此天喪我也……」
袁紹率殘部逃回冀州。不久,袁紹吐血而死,三個兒子爲了爭權自相殘殺,被曹操乘機一一剿滅。