建安五年一月,袁绍率精兵10万南下。两军对垒于官渡,相持数月。其间曹操因兵疲粮缺,一度欲回守许都(今河南许昌东)。谋士荀彧认为,曹军以弱敌强,此时退军必为所乘;反之,袁军轻敌,内部反面,相持既久势必有变,正可出奇造胜。曹操纳其言,派兵袭烧袁军粮车;又亲率精锐5000奔袭袁军乌巢(今河南境)粮屯,全歼袁军,销毁全数囤粮。动静传来,袁绍所部军心摆荡,纷繁溃散投降。曹操乘机全线出击,歼敌7万余,袁绍父子仅率800余骑北逃。
回到冀州后,袁绍陆续平定了遍地的兵变,不久,袁绍发病,死于建安七年(公元202年)炎天。袁绍往世后,袁绍的第三子袁尚继续了袁绍的官位和爵位,也因而招致长兄袁谭的怨恨,兄弟之间经常干戈相向。
建安九年(204年)二月,曹操乘袁尚收兵攻打袁谭之机,进军围攻邺城(今河北临漳西,河南安阳北)。袁尚率军回救,依滏水(今滏阳河)为营,曹操进军将其营寨包抄。袁尚恐惧,恳求投降,曹操不准。袁尚乘夜逃跑,袁军溃散。袁尚逃奔中山(今河北定县)。曹操命人拿着缴获袁尚的印绶节钺招降邺城守军,城中斗志瓦解。邺城遂被曹操攻破。从那一年起,曹操把本身的据点北迁到了冀州邺城,政令戎行尔后皆从此出,而汉献帝的国都许县则只留些许仕宦。
建安十年(205年)正月,曹操又以误期为名,攻灭袁谭,冀、青二州平定。于是,曹操上表让还兖州牧,改任冀州牧。袁尚兵败后,逃奔幽州刺史袁熙。不久,袁尚、袁熙又逃奔三郡乌桓。同年,黑山军领袖张燕率领其部寡十余万人投降曹操。建安十一年(206年),曹操攻灭高干,平定并州。
建安十二年(207年),曹操为了肃清袁氏残存权力,也为了彻底处理三郡乌桓进塞为害问题,决定远征乌桓。汉末,辽西、辽东、右北平三郡乌桓连系,是为三郡乌桓,其领袖为辽西部的蹋顿。三郡乌桓与袁氏关系不断很好,并屡次侵扰边境,抢劫生齿财物。蒲月,曹操亲率大军抵达无末(今蓟县)。时正雨季,道路积水,“浅欠亨车马,深不载船船”。曹操从无末人田畴之议,改从一条久已隔绝,但“另有微径可觅”的道路进军。在田畴的引导下,曹操大军登徐无山(今河北玉田北),出卢龙塞(今河北喜峰口四周),“堑山堙谷五百余里”,曲指乌桓老巢柳城(今辽宁向阳南)。
八月,曹军进至离柳城不敷二百里时,乌桓才发现,于是蹋顿与袁尚、袁熙等人率数万马队迎击。二军相遇,时曹军辎重在后,“被甲者少,”而乌桓军军势甚盛。曹操登高瞭看,见乌桓军虽多,但步地不整,遂命上将张辽为先锋,乘乌桓军阵稍动之机,向乌桓军策动猛攻。乌桓军大乱,曹军阵斩蹋顿,大获全胜,胡、汉降者二十余万,袁尚等人逃奔割据平州的公孙康。那时,有人劝曹操乘势进击公孙康,曹操说:“吾方使康斩送尚、熙首,不烦兵也。”遂率军还师。不久,公孙康公然斩杀袁尚、袁熙,并将其首级献与曹操。诸将不明所以,曹操说:“彼素畏尚等,吾急之则并力,缓之则自相图,其势然也。”于是,曹操攻破三郡乌桓,也彻底肃清了袁氏权力。
十一月至易水,代郡乌丸行单于普富卢、上郡乌丸行单于那楼将其名王来贺。同年郭嘉因不服水土、天气恶劣、日夜急行劳累过度,在曹操北回前病逝。回程途中,据《曹瞒传》记载:“时冷且旱,二百里无复水,军又乏食,杀马数千匹认为粮,凿地进三十余丈乃得水。既还,科问前谏者,寡莫知其故,人人皆惧。公皆厚赏之,曰:‘孤前行,乘危以徼幸,虽得之,天所佐也,故不成认为常。诸君之谏,万安之计,是以相赏,后勿难言之。