公元200年,曹操又赶走新据徐州的刘备,控制了黄河以南和长江以北大片地区,开始与占据黄河以北的袁绍争锋,爆发了历史上有名的官渡之战。
在曹操迎接汉献帝到许以前,曹操和袁绍分别在黄河南北发展自己的势力,双方还一直保持着友好的关系。但随着双方势力的扩张,利害冲突也跟踪而来。曹操打着“天子”招牌,纵封赏大权,自为大将军,以袁绍为太尉。袁绍素来骄贵,声望和地位一向在曹操之上,这时,绍耻位在曹操下,不肯接受太尉官职。由于袁绍势力很大,曹操不得不把大将军让给他,而自为司空、行车骑将军。
建安三年曹操擒*吕布,取得徐州,次年三月,袁绍消灭公孙瓒,兼并幽州,于是袁、曹两大势力之间的对立显得更加突出,便不能不以战争相见了。
公元200年二月,袁绍命沮授为监军,亲率10万大军,从邺城出发,进攻曹操的都城许昌。袁绍大军开进黎阳,安营扎寨,将这里作为指挥部,派大将郭图、颜良进攻白马。当时驻守白马的是曹操的东郡太守刘延,守军死伤惨重。而曹操集结在官渡的军队也只不过三四万人。对敌力量悬殊,白马告急。
四月,曹操北上解白马之围,用荀攸计,屯兵延津伪装渡河,好像要攻击袁绍的后方,迷惑袁绍大军渡河,使其分兵西向。目的达到后,曹操自引轻骑,集中徐晃、张辽、关羽等骁将,出其不意奔袭白马。关羽斩颜良,袁军溃败。曹操拔白马之军,迁徙白马百姓沿黄河撤退,丢弃辎重军械,诱袁绍大军渡河来追。
五至六月,袁军渡河至延津。袁绍大将文丑与刘备追击曹军,在延津南白马山中计被斩。颜良、文丑为河北名将,连战皆输,绍军夺气。
与延津之战同时,于禁、乐进又率步骑5000,从延津西渡河奇袭袁军后方,至汲、获嘉二县,焚其堡聚20余屯。
七至九月。袁绍虽然连战皆北,仍凭其兵力优势,密集推进,与曹操相持于官渡。八月,袁军逼近曹寨,依沙为屯,东西数十里,曹军亦分营对垒相持。
袁绍逼近官渡的同时,于七月派刘备迂回曹军后方,与汝南黄巾军联合开辟第二战线。袁军派出的劫粮之军也连连得手。九月,袁曹两军在官渡展开阵地战,曹军寡不敌众,还营坚守。袁军起土山地道强攻,激战异常。两军“相持百余日河南人疲困,多畔应绍”。当时曹军粮少,曹操致书荀彧,打算撤军。荀彧回信曹操,以楚汉相争为喻劝曹操坐持战斗,谋士贾诩支持荀彧的意见,于是曹操派曹仁率领徐晃、史涣等攻破刘备在汝南的策应,还消灭了袁绍断粮道的游击军,使其运输畅通。曹操又用荀攸计,派徐晃等扰乱袁绍后方,烧了袁绍运粮车及其辎重,*其将韩猛。
十月,两军主力决战。袁绍再次派出淳于琼等带兵万余人押运粮车,屯放在袁绍大营北40里的乌巢。沮授与许攸向袁绍建议保护粮草之计,不被袁绍采纳。
许攸见他的计谋不被采纳,心中很是不平。正在这时,留守邺城的审配收捕了许攸家属。许攸一怒之下,投奔曹操,告知袁军储粮虚实,劝曹操轻骑烧粮。当时曹军只有一个月的军粮,为打破僵局,曹操决定出奇制胜。他亲率5000骑兵,冒用袁军旗号,月夜偷袭乌巢。天亮时,曹操抵达淳于琼粮营。淳于琼见曹操兵少,欲邀功利,不护粮草,出营迎战。曹军殊死战,淳于琼战败,粮草被焚。
袁绍闻听乌巢军粮被烧,他不派兵援救淳于琼,反而自作主张认为曹操偷袭乌巢,将计就计,袭击曹操的大本营,以断曹操的归路,遂命大将张郃、高览前去攻打曹军大营。张郃认为这样做是在冒险,建议袁绍不可如此。袁绍不听,张郃等只好攻打官渡曹营。袁军到达官渡,前面遇到曹洪大军的顽强抵抗,后面又受到从乌巢得胜回来的曹操的猛攻,腹背受敌。张郃见袁绍成不了大事,便与高览率军投降了曹操。
粮草被烧,张郃等大军投降,袁军不打自乱,曹军乘胜全面出击。消灭袁军7万多人,袁绍慌忙带着儿子袁谭和800骑兵,渡过黄河北逃。曹操消灭北方最大军阀袁绍的主力,取得了官渡之战的绝对胜利。袁绍从此一蹶不振,建安七年(202年),袁绍在邺城病死。