漢朝與匈奴主要經歷了四次戰役,分別為「平城之戰」、「馬邑之戰」及「燕然山之役」、「烏孫之戰」。
一、平城之戰
漢高祖六年(西元前201年)秋,匈奴發兵圍韓王信於馬邑(今山西朔縣),韓王信恐不敵,遂數度遣使通匈奴以謀和,同時亦求救於漢朝。漢朝一方面發兵解其圍,一方面譴責其與匈奴謀和之舉,韓王信益懼,恐見誅於漢高祖,乃於馬邑降匈奴。
漢高祖遂於七年(西元前200年),親自率漢軍三十萬,破韓王信軍於銅鞮(今山西沁縣西南),此時冒頓單于亦以輕騎馳助韓王信。兩軍甫戰,韓王信及匈奴輕騎皆敗,於是韓王信逃奔匈奴,而冒頓單于乃引兵攻太原郡,至晉陽邊(故城即今山西太原縣治)。
漢高祖率騎兵先到達平城(今山西省大同市以北),於是命令周勃攻打東南的三座城池後再與主力會合,作為後援,後來正如漢高祖所料,是周勃為自己解圍。 最後,漢軍在晉陽邊故城(今山西太原縣)擊敗了匈奴。
此後,漢高祖為了全力對付內部地方割據政權,對匈奴採取了「和親」政策,把宗室女子嫁給匈奴首領。此外,每年送去一定數量的黃金、絹、絮,米、酒,允許漢朝和匈奴雙方人民往來買賣。
二、馬邑之戰
漢武帝元光二年(西元前133年),馬邑縣(山西省朔州市)富商聶壹,上書漢武帝用重大利益誘惑匈奴單于,使匈奴深入漢國境,伏兵攻擊,給他們一個決定性的致命創傷。
同年夏季六月,武帝命令步兵、騎兵、戰車部隊三十餘萬漢軍,在馬邑(山西省州市)附近山谷中埋伏,只等匈奴單于進入馬邑,馬上就要將他們團團圍住。
武帝又派聶壹當間諜,假裝逃亡匈奴,向軍臣單于報告可以殺掉馬邑縣長及縣丞,舉城投降。
軍臣單于聽了之後大為興奮,立刻準備出兵。聶壹處決兩個死囚,把人頭懸掛城上,告訴匈奴單于已斬殺馬邑縣長及縣丞。
軍臣單于收到消息後非常高興,立刻率領十萬騎兵,強行穿過漢長城,直撲武州塞。他將到馬邑一百餘里,看到遍地牛羊,卻看不到人煙,心生疑惑,於是攻擊附近亭堡,生擒該亭堡亭尉,就要處斬。那位亭尉因害怕砍頭而據實報告,並指出漢軍在哪些地方埋伏。
軍臣單于一聽,嚇得魂飛天外,下令迅速撤退。等到出了長城才喘過氣。後來,軍臣單于深信那位亭尉是天上神仙,特下凡通報漢軍消息,封他當「天王」。
軍臣單于出塞後,漢軍才得到消息趕到長城,但計算時間,已不可能追及,只好班師。
自此之後,匈奴單于拒絕和解,更不斷侵擾邊郡關卡,往往深入邊郡,次數不可勝計。
三、燕然山之役
征和三年(西元前90年)三月,李廣利率軍十三萬征匈奴。
匈奴單于知漢朝大軍至的消息,將輜重北徙至郅居水(今蒙古色楞格河),並親自率主力南渡姑且水(今蒙古巴彥洪格爾省南部圖音河)以待漢軍。
李廣利出塞後,擊敗匈奴左大都尉衛律,乘勝追擊至郅居水,匈奴退走。李廣利以二萬騎渡郅居水,擊敗左賢王,殺左大將。
可惜漢軍班師時,單于知李廣利疲憊,以五萬騎兵圍擊漢軍於燕然山(今蒙古杭愛山),十三萬漢軍大敗,李廣利降匈奴。
燕然山之敗後,漢武帝在經濟困難,人民疲憊的情況下,停止對匈奴用兵,並下詔罪己,採取「思富養民」措施,發展生產,恢復國力。
四、烏孫之戰
漢昭帝時,匈奴為緩和與漢敵對關係,把扣留了19年的漢使蘇武釋放,以示善意,但匈奴騎兵仍然不斷在北方邊境出現。西元前73年,匈奴轉攻西域烏孫以索要公主,烏孫向漢求救,漢朝組織十三萬大軍與烏孫聯兵進攻匈奴,可惜大軍未遇上匈奴主力,無功而返,主將田順和田廣明遭問罪被迫自殺。
西元前71年,烏孫昆莫翁歸靡親率五萬騎兵,與漢朝使節常惠自西進攻匈奴右谷蠡王庭,大獲全勝。
同年冬,匈奴出動數萬騎兵擊烏孫以報怨,適逢天降大雨雪,生還者不足十分之一。是時丁零北攻,烏桓入東,烏孫擊西,匈奴元氣大傷,被迫向西遷徙以依靠西域,西域再次成為雙方爭奪重點。就在雙方反覆激烈爭奪車師之際,匈奴內部發生衝突,掌管西域事務的日逐王先賢撣與新任單于屠耆堂爭奪權位。日逐王降漢,匈奴被迫放棄西域。漢完全控制西域,匈奴實力大減,已無力擾漢。



