漢獻帝建安十二年(207)八月,曹操大破三郡烏桓於白狼山,平定了烏桓的親袁勢力,徹底消滅袁紹殘餘力量,穩定了東北部,為日後南下攻取荊州解除後顧之憂。200年春,冀州牧袁紹南攻曹操,司空、行車騎將軍事曹操迎敵,雙方展開官渡之戰。十月,曹操大破袁紹於官渡(在今河南中牟縣城東北),袁紹領著八百騎渡河逃回冀州,自此一蹶不振。202年五月,袁紹因憤鬱成疾嘔血病故;親信假稱主公遺囑而擁立其小兒子袁尚嗣位。袁紹長子青州刺史袁譚不服,遂自稱車騎將軍,出兵同小弟袁尚相攻爭位。袁尚兵敗,投奔二哥幽州刺史袁熙。袁氏兄弟鬩牆,同室操戈,便給了曹操各個擊破的良機。
205年正月曹操擊殺袁譚。旋即袁熙又被部將驅逐,無處容身,只好與弟弟袁尚脅迫幽、冀軍民十餘萬投奔遼西烏桓單于蹋頓,欲藉助烏桓力量「復圖冀州」。烏桓亦作烏丸,東胡之一支,西漢時逐步南遷,活動於今西拉木倫河流域及其以北地區。東漢初,朝廷安置其入居塞內,分布於上谷、漁陽、右北平、遼西、遼東屬國及廣陽、代、雁門、太原、朔方等郡。烏桓以遊牧、狩獵為生,故精於騎射,驍勇善戰。入塞而居的十郡烏桓組建了「烏桓突騎」,是一支摧鋒陷陣、戰力強悍的騎兵衝鋒隊,頗享盛名。遼西烏桓居於遼西郡,即今河北遷西、樂亭以東、長城以南,遼寧松嶺山以東、大凌河以西地區。
時遼西烏桓大人(部首領)為蹋頓。蹋頓有武略威望,被三郡推為大首領,總攝遼西、遼東、右北平三郡烏桓,雄踞北邊諸郡,並不斷參與漢族軍閥之間的爭鬥。198年冬,冀州的袁紹攻幽州的公孫瓚,蹋頓出兵助袁紹破滅公孫瓚,袁紹盡得幽州之地,封其為烏桓單于,獎賞並拉攏之,以為外援。故蹋頓與袁氏有老交情。袁熙、袁尚兄弟跑到柳城(今遼寧朝陽市),投奔了遼西烏桓單于蹋頓。蹋頓真挺夠意思,不但熱情收留無家可歸的袁氏兄弟,並且熱心的準備幫助其恢復故地。於是二袁與蹋頓聯手,頻頻侵擾邊塞,攪得東北境不得安寧。曹操為徹底消滅袁氏殘餘勢力,安定其東北境,解除南下西進的後顧之憂,遂決定北徵烏桓。
曹軍諸將對北徵烏桓皆持異議,認為不值得為已不足為患的袁氏兩個喪家犬而勞師遠徵;更擔心荊州牧劉表乘虛進攻許都,導致曹軍腹背受敵,進退維谷。謀士郭嘉則認為,烏桓自恃地處邊遠而無備,出其不意定可奏捷;況且蹋頓與袁氏交厚,雙方聯結其勢必盛,可就不易制服了;劉表多疑寡斷,必不會出兵襲我。曹操甚善郭嘉之言,決意北伐。兵馬未動,糧草先行。謀攻烏桓之初,曹操便於206年先行開鑿了平虜渠、泉州渠兩條渠道,通漕運,以確保糧草軍需供給。207年夏初,曹操率領張遼、徐晃、張郃等將領及謀士郭嘉踏上北伐徵途。大軍北進至易縣,曹操採納郭嘉「兵貴神速」的建議,留下輜重,部隊輕裝疾進。
曹軍抵達無終(今天津市薊縣),兵臨塞口,準備經濱海道捷徑直搗柳城。不巧趕上連綿夏雨,沿海地勢低洼,積水漫衍,大軍被水潦所阻隔,曹軍頓時陷入進退兩難的困境。然吉人天相,率領宗族隱居徐無山(今河北玉田縣東北)的奇士田疇出山相助了。田疇是個「地理通」,引導曹軍上徐無山,經遵化,從間道循灤河河谷出盧龍塞(在今河北遷安市西北喜峰口附近,是從河北平原通向東北的一條交通要道),經白檀縣(今河北灤平縣東北興州河南岸),歷平岡縣(平剛,治今內蒙古寧城縣西南黑城村古城),穿越鮮卑部落與王庭,歷經艱辛,終於接近了攻擊目標。
八月,曹操率領輕騎兵東指柳城。距離柳城不到二百裡時,烏桓方才聞警。二袁和蹋頓及遼西單于樓班、右北平單于能臣抵等,立時率領數萬精騎西進拒戰。曹操登上白狼山(即今遼寧喀左縣東境小凌河源松嶺)觀望,敵軍突至。居高遠眺的曹操發現烏桓軍雖眾,卻陣勢不整,突擊可以得手。曹操趕忙命張遼為先鋒,率領輕騎兵衝擊敵陣。烏桓突騎單兵作戰能力強,但缺乏戰術、戰略配合,而且恃眾輕敵,故而猝遭突擊頓時大亂,蹋頓命喪當場,全軍亦隨之崩潰,胡、漢投降者二十餘萬。袁氏兄弟及樓班等率領數千騎投奔遼東太守公孫康。公孫康殺袁熙、袁尚,首級函獻曹操。
曹操一戰破烏桓,徹底翦除袁氏殘餘勢力,穩定了北方,解除了南攻荊州的後顧之憂。為了增強軍事力量,曹操整編烏桓騎兵,組建了威震天下的烏桓名騎,成為曹操東徵西討的生力軍。