此時,曹操失去了兗州(治今山東鄆城西北),軍糧已盡,袁紹派人來勸說想讓曹操投靠他,讓曹操舉家遷到鄴縣當人質。曹操本打算答應袁紹,多虧程昱勸阻,曹操才打消這個念頭。
興平二年(195年),曹操整軍再戰呂布,三敗之,破定陶(今山東定陶)、廩丘(今山東鄆城西北)等,平定兗州。呂布逃往徐州投靠劉備。七月,因李傕、郭汜的火拚,漢獻帝從長安東歸,下詔讓各路諸侯勤王。
建安元年(196年)八月,曹操迎漢獻帝。辛亥,漢獻帝封曹操為司隸校尉,錄尚書事。庚申,遷都許昌。十一月丙戌,漢獻帝封曹操為司空,行車騎將軍事,百官總己以聽。
建安二年(197年)正月,曹操討伐張繡,軍隊駐扎在淯水,張繡舉眾投降,旋即複叛,長子曹昂、侄子曹安民、猛將典韋戰死。此後,曹操又兩度攻擊張繡,都沒有徹底擊破。九月,曹操東征袁術,袁術棄軍而逃至淮河,梟袁術留守四將。
建安三年(198年)四月,曹操遣謁者裴茂率中郎將段煨討李傕,夷三族。九月,曹操東征徐州,進攻久與他為敵的呂布。在曹軍攻勢之下,呂布軍上下離心,十二月,呂布部將魏續、宋憲等生擒陳宮歸降曹操。呂布見大勢已去,下城投降。曹操將呂布、陳宮、高順等人處死,收降呂布部將張遼以及泰山豪傑臧霸、孫觀等人,初步控制了徐州。
建安四年(199年),曹操派史渙、曹仁擊破張楊舊部眭固,取得河內郡,把勢力范圍擴張到黃河以北。[21]
官渡之戰
消滅睦固後,為了應對之後與袁紹的戰爭,曹操預作布置,命在青州有潛在影響的臧霸等人攻入青州,佔領齊(治今山東臨淄)、北海(治今山東壽光東南)等地,鞏固右翼;又命大將於禁屯軍黃河南岸,監視袁軍。不久,張繡聽從謀士賈詡之計,投降曹操,曹操大喜,拜張繡為揚武將軍,解除了後顧之憂。
建安四年(199年)十二月,曹操自率軍屯於官渡(今中牟北),準備迎擊袁紹。
劉備在陶謙死後,曾一度出任徐州牧,後徐州被呂布攻佔,劉備投奔曹操。曹操認為劉備是個英雄,先後表他為豫州牧、左將軍。曹操攻佔徐州不久,淮南袁術準備逃往青州往依袁紹,曹操派劉備去截擊,袁術北上不得,嘔血而死。
建安五年(200年)正月,董承等人謀誅曹操事泄,被曹操殺掉。劉備遂襲殺徐州刺史車胄,佔據徐州。
曹操為了免於將來同袁紹作戰時前後受敵,決定先消滅在徐州立足未穩的劉備。當時諸將皆怕袁紹乘機來攻許都,曹操對此胸有成竹,說:“劉備,人傑也,今不擊,必有後患。袁紹雖有大志,而見事遲,必不動也。”遂進軍,以迅雷不及掩耳之勢擊破劉備,劉備逃奔袁紹。
袁紹是當時北方最強大的一股勢力,也是曹操統一北方最強大的敵人。袁氏一門,自袁紹曾祖袁安以下,“四世居三公位”,“門生故吏遍於天下”,勢力本就很大,後袁紹取得冀、並、幽、青四州之地,實力大增,有軍隊數十萬人。袁紹以其長子袁譚、次子袁熙、外甥高乾分守青、幽、並三州,後方穩固,兵精糧足,根本不把曹操放在眼裡。他挑選精兵十萬、戰馬萬匹,志在一舉消滅曹操。
建安五年(200年),袁紹命大將顏良等人進兵白馬(今滑縣),自率大軍進屯黎陽(今浚縣東),
向曹操發動進攻。曹操的實力比袁紹弱得多[23],曹操所佔的大河以南地區,地盤既小,又是四戰之地,殘破不堪,還沒有完全恢復,物資比不上袁紹那樣豐富。曹操的兵力也遠不及袁紹,其總兵力大概不過幾萬人,投入前線的兵力據《武帝紀》說“兵不滿萬,傷者十二三”。裴松之認為此數不準確,曹操的兵力不會如此之少,但曹操兵力遠遜於袁紹卻是毫無疑問的。[24] 袁紹大軍來攻,許都震動。曹操安慰眾將說:“吾知紹之為人,志大而智小,色厲而膽薄,忌克而少威,兵多而分畫不明,將驕而眾令不一,土地雖廣,糧食雖豐,適足以為我奉也。”
二月,袁紹大將顏良等人圍攻白馬,拉開了大戰的序幕。四月,曹操親自率兵北上解白馬之圍,他采納謀士荀攸之計,先進軍延津(今延津北一帶), 做出要渡河襲擊袁軍的態勢,吸引袁軍分兵西向,然後突然轉向迅速趕往白馬。曹操軍突然殺到,袁軍措手不及,顏良被關羽斬首[25],袁軍大敗,白馬之圍遂解。曹操救出白馬軍民,沿黃河西撤。袁紹聞知,立即命文醜、劉備渡河追趕曹操。曹操見追兵漸近,命軍士解鞍放馬,並置輜重於道。袁軍追兵大至,爭搶輜重,陣形混亂。曹操率領僅有的騎兵突然殺出,大破追兵,陣斬文醜。袁軍大震。曹操初戰得勝,主動撤軍,繼續扼守官渡。
八月,袁紹大軍連營而進,東西數十裡,依沙堆為屯,進逼官渡。曹操分兵堅守營壘,伺機而動。袁軍向曹營發動猛攻,先是作高櫓、起土山,由上向曹營中射箭,接著又挖地道,欲從地下襲擊曹營,皆被曹操以設投石機、挖掘溝壑之法破解。兩軍一攻一守,相持近二個月。久戰之下,曹操處境極為困難。
十月,袁紹從河北運來糧草萬余車,派大將淳於瓊等帶萬余人看守,屯於離袁紹大營四十裡的烏巢。這時袁紹謀士許攸因向袁紹獻偷襲許都之計不成,且在河北的家眷犯法被抓,心生悔恨,而來投曹操,獻計讓曹操偷襲烏巢。曹操大喜,跣足出迎,之後親率精銳步騎五千人,軍隊人銜枚,馬勒口,換袁軍軍裝乘夜從小路偷襲烏巢。曹操軍至烏巢,命四面放火,袁軍大亂,淳於瓊拒營死守。袁紹聞知,急忙派兵救援,曹操左右見“賊騎稍近,請分兵拒之。”曹操大怒說:“賊在背後,乃白!”士卒都拚死力戰,因此大破袁軍,斬淳於瓊等,盡燔其糧草。