建安四年(199年)十二月,曹操自率軍屯於官渡(今中牟北),準備迎擊袁紹。
官渡之戰
官渡之戰 [22]
劉備在陶謙死後,曾一度出任徐州牧,後徐州被呂布攻佔,劉備投奔曹操。曹操認爲劉備是個英雄,先後表他爲豫州牧、左將軍。曹操攻佔徐州不久,淮南袁術準備逃往青州往依袁紹,曹操派劉備去截擊,袁術北上不得,嘔血而死。
建安五年(200年)正月,董承等人謀誅曹操事泄,被曹操殺掉。劉備於是襲殺徐州刺史車胄,佔據徐州。
“劉備以徐州叛 [23]”。因此,曹操決定東征劉備。 [23]諸將皆說:“與公爭天下者,袁紹也。今紹方來而棄之東,紹乘人後,若何?”。曹操說:“劉備,人傑也,今不擊,必有後患。袁紹雖有大志,而見事遲,必不動也。”遂進軍,以迅雷不及掩耳之勢擊破劉備,劉備逃奔袁紹。
袁紹是當時北方最強大的一股勢力,也是曹操統一北方最強大的敵人。袁氏一門,自袁紹曾祖袁安以下,“四世居三公位”,“門生故吏遍於天下”,勢力本就很大,後袁紹取得冀、並、幽、青四州之地,實力大增,有軍隊數十萬人。袁紹以其長子袁譚、次子袁熙、外甥高幹分守青、幽、並三州,後方穩固,兵精糧足,根本不把曹操放在眼裏。他挑選精兵十萬、戰馬萬匹,志在一舉消滅曹操。
建安五年(200年),袁紹命大將顏良等人進兵白馬(今滑縣),自率大軍進屯黎陽(今浚縣東),向曹操發動進攻。曹操的實力比袁紹弱得多 [24],曹操所佔的大河以南地區,地盤既小,又是四戰之地,殘破不堪,還沒有完全恢復,物資比不上袁紹那樣豐富。曹操的兵力也遠不及袁紹,其總兵力大概不過幾萬人,投入前線的兵力據《武帝紀》說“兵不滿萬,傷者十二三”。裴松之認爲此數不準確,曹操的兵力不會如此之少,但曹操兵力遠遜於袁紹卻是毫無疑問的。 [25]
袁紹大軍來攻,許都震動。曹操安慰衆將說:“吾知紹之爲人,志大而智小,色厲而膽薄,忌克而少威,兵多而分畫不明,將驕而衆令不一,土地雖廣,糧食雖豐,適足以爲我奉也。”
二月,袁紹大將顏良等人圍攻白馬,拉開了大戰的序幕。四月,曹操親自率兵北上解白馬之圍,他採納謀士荀攸之計,先進軍延津(今延津北一帶),做出要渡河襲擊袁軍的態勢,吸引袁軍分兵西向,然後突然轉向迅速趕往白馬。曹操軍突然殺到,袁軍措手不及,顏良被關羽斬首 [26],袁軍大敗,白馬之圍遂解。曹操救出白馬軍民,沿黃河西撤。袁紹聞知,立即命文丑、劉備渡河追趕曹操。曹操見追兵漸近,命軍士解鞍放馬,並置輜重於道。袁軍追兵大至,爭搶輜重,陣形混亂。曹操率領僅有的騎兵突然殺出,大破追兵,陣斬文丑。袁軍大震。曹操初戰得勝,主動撤軍,繼續扼守官渡。
八月,袁紹大軍連營而進,東西數十里,依沙堆爲屯,進逼官渡。曹操分兵堅守營壘,伺機而動。袁軍向曹營發動猛攻,先是作高櫓、起土山,由上向曹營中射箭,接着又挖地道,欲從地下襲擊曹營,皆被曹操以設投石機、挖掘溝壑之法破解。兩軍一攻一守,相持近二個月。久戰之下,曹操處境極爲困難。
客觀條件上,曹操處於劣勢,但由於他能正確分析客觀條件,善於聽取別人的正確意見,所以能揚長避短,採用正確的戰略戰術,使戰爭向有利於自己的方面轉化,經過自己主觀上的努力,終於贏得了勝利。官渡之戰,曹操擊潰了最大的敵人袁紹,由他統一北方已是大勢所趨。官渡之戰也是中國戰爭史上以少勝多、以弱勝強的著名戰例。
遠征烏桓
建安七年(202年),袁紹病死,袁紹的兩個兒子袁譚、袁尚不和,發生火拼。袁譚不敵袁尚,向曹操乞降。
建安九年(204年)二月,曹操乘袁尚出兵攻打袁譚之機,進軍圍攻鄴城(今河北邯鄲臨漳西一帶)。袁尚率軍回救,依滏水(今滏陽河)爲營,曹操進軍將其營寨包圍。袁尚害怕,請求投降,曹操不許。袁尚乘夜逃跑,袁軍潰散。袁尚逃奔中山(今河北定縣)。曹操命人拿着繳獲袁尚的印綬節鉞招降鄴城守軍,城中鬥志崩潰。鄴城遂被曹操攻破。從這一年起,曹操把自己的據點北遷到了冀州鄴城 [28],政令軍隊此後皆從此出,而漢獻帝的都城許縣則只留些許官吏。
建安十年(205年)正月,曹操又以負約爲名,攻滅袁譚,冀、青二州平定。於是,曹操上表讓還兗州牧,改任冀州牧。袁尚兵敗後,逃奔幽州刺史袁熙。不久,袁尚、袁熙又逃奔三郡烏桓。同年,黑山軍首領張燕率領其部衆十餘萬人投降曹操。 [29]
建安十一年(206年),曹操攻滅高幹,平定幷州。
建安十二年(207年),曹操爲了肅清袁氏殘餘勢力,也爲了徹底解決三郡烏桓入塞爲害問題,決定遠征烏桓。漢末,遼西、遼東、右北平三郡烏桓結合,是爲三郡烏桓,其首領爲遼西部的蹋頓。三郡烏桓與袁氏關係一直很好,並屢次侵擾邊境,擄掠人口財物。