东汉建安五年,袁曹官渡之战后,曹操打败了北方头号军阀袁绍,消灭了袁绍的有生力量,接着乘胜发起统一北方的战争。
袁绍自官渡率残兵败将退回邺城,便因气愤过度患病,于建安七年(202年)五月,呕血而死。袁绍有三子:长子袁谭,次子袁熙,少子袁尚。袁绍后妻喜欢少子袁尚。袁绍生前,她常在袁绍前称赞袁尚,袁绍也想传位袁尚,但因袁尚是少子,上有二兄,传位给他不合礼法,颇感为难,也不好提出来与大臣商议,于是让袁谭出任为青州刺史。部下沮授深知袁绍用意,却反对这种安排,他指出,袁谭是长子,理当继嗣,如今却把他排斥出外,恐怕将来会因此导致大祸。袁绍支吾说:“我是想让诸子分别占据一州,以考察其才能。”
袁绍手下的部将逢纪、审配等人依附袁尚,另外一些部将,如辛评、郭图等人,皆依附袁谭。袁绍死后,许多人以袁谭是长子为理由,提议让他继位。审配等人恐袁谭继位后,辛评、郭图会恃宠加害于自己,便伪造了一份袁绍遗书,拥戴袁尚继位。袁谭奔丧回来,袁尚已成邺城之主,袁谭不满,乃自称车骑将军,屯兵黎阳。为限制袁谭的力量,袁尚只拨给他很少军队,又遣缝纪去监军,袁谭要求再增拨军队,袁尚不给,袁谭大怒,杀了监军的逢纪。袁谭、袁尚兄弟俩的矛盾至此完全公开。这年九月,曹操率军渡过黄河,进攻袁谭,袁谭军力偏弱,不得已向袁尚求援。袁尚留下审配等人镇守邺城,亲自率领大军去帮助袁谭抗击曹操,结果两军交战数次,袁氏兄弟是屡战屡败,只好退兵固守不战。曹操也退兵河南。
这时河东被曹操占领,袁尚想争夺河东,派他任命的河东太守郭援与并州刺州史高于、南匈奴单于分头向河东进攻,并遣使者前赴关中,与马腾等军阀联络,相约共同拒曹。曹操派司隶校尉钟繇攻击袁军,包围了驻扎在平阳的匈奴南单于,郭援闻迅,带兵前来援救。钟繇遣新丰县令张既赶到关中,劝说马腾,使他倒向曹操一边。马腾命子马超率军一万与钟繇连兵,大败郭援军,南匈奴单于顶不住曹军的进攻,投降了曹军。
建安八年(203年)二月,曹操又率大军北攻黎阳,与袁谭、袁尚联军在黎阳城下大战,袁军再度失利,被迫弃城北走,退守邺城。曹军追到邺城,正赶上麦熟,顺便将邺城周围的麦子全部收割完毕。然后还想攻城,谋士郭嘉劝曹操暂缓进攻,待其兄弟间矛盾激化后再攻,更易得手。曹操认为此建议很对,留下部分将士屯守黎阳,自己回到许昌。曹操退兵后,袁氏兄弟的内讧又激烈起来,袁谭心怀怨恨,率部进攻袁尚,反被袁尚击败,引兵退还南皮。八月,袁尚又率军攻打袁谭,获得大胜,袁谭逃到平原郡,凭城坚守,袁尚仍不放松,令其军围攻。袁谭见情势危急,遣辛评之弟辛毗赴许昌向曹操求救。曹操答应了他的请求,率军至黎阳,欲攻袁尚大本营邺城,逼着袁尚从平原撤回邺城,解了袁谭的围。在撒军途中,袁尚部将吕旷、高翔叛降了曹操,袁谭又暗送将军印给吕旷和高翔,企图拉拢他们。曹操得知此事,知袁谭有诈,乃为儿子曹整聘娶袁谭的女儿,以稳住袁谭,然后回师许昌。
第二年春正月,曹军又渡河北上,拦引淇水入白沟,以便再次攻打邺城时运输军粮。二月,衰尚见曹军无大举动,率军复攻袁谭,留下部将审配、苏由守卫邺城。曹操乘机出兵围攻邺城,苏由派人与曹操联系,欲为内应不料事情败露,苏由匆匆逃出邺城,归降了曹操。曹军堆土山,挖地道,猛攻邺城,均不能奏效。曹操击破了屯守毛城的袁尚将领尹楷,切断了上党至邺城的粮道,又占领了邯郸、易、涉等城,邺城还是攻不破。五月,曹操命令围攻邺城的军队毁弃士山和地道,沿城四周挖沟围城,白日挖得很浅,邺城守将审配由城上望见,毫不在意。到了晚上,曹操下令突击挖沟,宽和深俱达二丈,引入漳水灌城。城中与外面交通隔绝,粮食缺乏,从五月到八月,城中饿死者达半以上,审配仍然坚守不降。袁尚得悉邺城危急,率军一万回救。曹操许多部将认为,这批援军必然有决死之志,不如暂且避开。曹操却不同意,坚持等袁尚军赶到再相机而动。袁尚军到距邺城十七里的阳平亭驻扎下来。晚上皆举火通知城中,城中也举火相应。审配出兵城北,想和袁尚里外夹击,曹操分兵迎击,审配败退回城,袁尚军也被击遗,退到曲漳,曹军紧追不舍,袁尚遣使投降,曹操不许,围攻更急。袁尚又逃到祁山,部将马延、张颐等人临阵投降,袁军遗散,袁尚只带了少数人逃到中山。曹操停止追击,将缴获的印绶、节钺及盔甲等陈列在邺城下,城中人心大乱。审配的侄子审荣任东门校尉,夜里打开城门,引曹军入城,审配率军巷战,被曹军俘虏,邺城终于被曹操占领。十月,并州刺史高干也投降了曹操,曹操仍然任命他为并州刺史
就在曹军全力围攻邺城之时,袁谭率众叛曹,攻取甘陵、安平、勃海、河间等地,又向袁尚发起进攻。袁尚退往故安,投靠幽州刺史袁熙。袁谭收编了袁尚残部,驻军龙凑。曹操写信给袁谭,谴责他背信负约,退还他的女儿,与他断绝婚姻,然后发兵进讨。十二月,曹操驻军其门,袁谭退军南皮,临清河屯兵,曹军顺势平定了平原郡诸县。次年正月,曹军大举进攻南皮,袁谭迎战,双方死伤甚多,不分胜负。曹操有心缓攻,议郎曹纯说:““令大军深人,难以持久,如进兵不能克敌,退兵必丧军威。”曹操于是亲自擂鼓指挥进攻,将袁谭击败,攻破南皮。袁谭、郭图等人外逃,被曹军追杀,袁谭所辖诸城全部投降。这时候幽州还在袁熙手里,袁熙部将焦触、张南密谋降曹,率部袭击袁熙。袁熙毫无防备,与袁尚仓皇出逃,投奔辽西乌桓。焦触自号为幽州刺史,召集诸郡县太守、令长,陈兵数万,杀白马而盟,齐降曹操。曹操皆封他们为列侯。
十月,并州刺史高干又举州叛曹,派兵扼守壶关口。河内郡张晟、弘农郡张琰等人也起兵响应,河东郡掾卫固和中郎将范先也暗中与高干交通,扯曹军后腿。曹操闻讯,派大将乐进、李典征讨高干,任杜畿为河东太守,平叛卫固、范先,征马腾等人进攻张晟,张琰。马腾军大败张晟,卫固、张琰等人先后被杀。建安十一年(206年)正月,曹操亲自率军讨伐高干,围攻壶关。三月,壶关守城将士投降。高干逃入匈奴求救,匈奴单于不敢接受,高干又南奔荆州,途中被上洛都尉王琰斩杀,并州完全被曹操平定。袁绍在世时,与北部少数民族乌桓关系很好,皆立其酋豪为单于,还以家人之女与其联姻。在乌桓诸部中,辽西蹋顿部最为强大,蹋顿后为乌桓王,一向为袁绍所厚重,故袁熙、袁尚兄弟俩投奔踢顿。蹋顿数次入寇,企图帮助袁尚收复故地。因此曹操决心远征蹋顿,除掉后患,他先命将士凿开平虏渠和泉州渠,以便远征。建安十二年(207年)春,曹操集结大军征讨蹋顿,诸将都认为不妥,说:如果刘表从南边袭击许昌,后果将不堪设想。唯独郭嘉力主远征蹋顿,理由是不击垮蹋顿,青、冀等州终不能安定。曹操同意郭嘉的意见,令大军轻装疾进,同时请出隐士田畴任莜县县令,率领他的人作大军的向导。这时正值雨季,道路泥泞难行,曹操采用了田畴的建议,一面在大道旁立一大木牌,写上“方今夏暑,道路不通,且俟秋冬,乃复进军”。以迷惑和麻痹乌桓。一面绕道上徐无山穿山越谷五百余里,经过白檀平冈、鲜卑庭,向东直指柳城。离柳城二百里时,乌桓军乃发觉。蹋顿、袁尚、袁熙慌忙与辽西单于楼班、右北平单于能臣抵之等,集合三郡乌桓骑兵来迎战。八月,曹军在白狼山与乌桓骑兵相遇。曹操登高远望,见乌桓骑兵数量虽多,但队伍凌乱,于是令大将张辽为先锋,纵兵击之,乌桓骑兵顿时崩溃,当阵斩杀蹋顿和许多乌桓王,胡汉降者达二十余万。乌桓辽东单于速仆丸与袁尚、袁熙率众数千去投奔辽东太守公孙康,被公孙康设计捕杀,将袁尚、袁熙和速仆丸之首献给曹操,表示归附之意。曹操击败乌桓,彻底消灭袁氏残余势力后,除关西地区尚被马腾、韩遂等人占领外,基本上统一了北方。曹操统一北方,结束了北方地区长期制据、混战的局面,使北部边境得到安宁,为北方社会的进一步发展创造了基本条件。