八月,袁紹雄師連營而進,東西數十裡,依沙堆為屯,進逼官渡。曹操分兵死守堡壘,乘機而動。袁軍向曹營策動猛攻,先是作高櫓、起土山,由上向曹營中射箭,接著又挖隧道,欲從地下攻擊曹營,皆被曹操以設投石機、發掘溝壑之法破解。兩軍一攻一守,相持近二個月。久戰之下,曹操處境極其困難。
建安十四年(公元209年),周瑜攻取南郡,孫權借南郡予劉備,孫劉聯盟進一步獲得穩固。為防備孫權,曹操強迫內遷淮南的公眾,激發江淮十餘萬戶百姓惶恐,使其儘皆渡江歸附孫權。同時,為穩定內部,曹操命令“死者家無基業不能自存者,縣官勿絕廩,長吏存恤撫循”。同年還親臨合肥,設置了揚州郡縣的長吏,修治芍陂屯田。年底回到譙。[]
劉備在陶謙身後,曾一度出任徐州牧,後徐州被呂布攻占,劉備投奔曹操。曹操以為劉備是個豪傑,前後表他為豫州牧、左將軍。曹操攻占徐州不久,淮南袁術籌辦逃往青州往依袁紹,曹操派劉備去截擊,袁術北上不得,嘔血而死。[] 劉備達到下邳後,襲殺徐州刺史車胄,占有徐州,本身屯於小沛。曹操令劉岱、王忠率兵征討,被劉備擊敗。[]
這時,官渡之戰後投奔劉表的劉備屯駐於樊城(今湖北襄樊),傳聞劉琮投降,便率軍向江陵(今屬湖北)撤退。江陵為荊州重鎮,存有大量軍用物質。曹操傳聞,怕江陵落入劉備之手,遂親率五千馬隊從襄陽(今湖北襄樊)奔馳三百裡,在當陽長阪(今湖北當陽東北)將劉備追上,大破其軍,隨掉隊占江陵。
建安八年(公元203年)三月,曹操大破黎陽,袁譚、袁尚逃回鄴城。四月,曹操進軍鄴城。蒲月,曹操引軍退還,留賈信守黎陽。[] 不久後,曹操引兵向南,征討劉表,袁譚、袁尚反目成仇,相互進犯,袁譚不敵袁尚,敗走平原,遣辛毗向曹操乞降求救。當時諸將都思疑有詐,隻要荀攸勸曹操承諾袁譚,曹操說:“我攻打呂布之時,劉表冇有侵犯我方;官渡之戰時,他又不肯幫忙袁紹。這隻是個自守的賊子,應當比及今後再來對於他。而袁譚、袁尚奸刁,我正應當趁北方混亂時策動進犯。就算袁譚挾詐,不肯至心屈就我軍,但我擊破袁尚,篡奪他的地盤,對我軍也更加無益。”因而再次北上,袁尚聞訊也退回鄴城。當時,袁尚部將呂曠、呂翔叛變袁尚,率眾投降曹操,曹操封兩報酬列侯。[] 袁譚擅自刻將軍印綬,交給呂曠兩人,呂曠把將軍印送給曹操,曹操說:“我天然曉得袁譚會耍些小聰明。他想讓我進犯袁尚,然後趁機略民聚眾,自發得破袁尚後,氣力足以自強,可趁我軍疲敝來與我對抗。但擊破袁尚後,我的權勢更加強大,哪能夠會疲敝,讓他有機可乘呢?”[305] 曹操為了讓袁譚臨時放心,還和袁譚攀親,讓本身的兒子曹整娶袁譚的女兒。
建安六年(公元201年)四月,曹操揚兵於黃河邊,擊破袁紹在倉亭的駐軍。袁紹在官渡之敗後,收合軍隊,安定了背叛的諸郡縣。玄月,曹操回到許縣。又南征在汝南的劉備、龔都,劉備投奔劉表,龔都等人皆逃散。
曹操為了清除袁氏殘存權勢,也為了完整處理三郡烏桓入塞為害題目,決定遠征烏桓。漢末,遼西、遼東、右北平三郡烏桓連絡,是為三郡烏桓,其首級為遼西部的蹋頓。三郡烏桓與袁氏乾係一向很好,並多次擾亂邊疆,擄掠人丁財物。