冒頓佔領了馬邑後,繼續向南進攻,圍住晉陽,劉邦親自趕去迎戰。
公元前200年的冬天,天降大雪,中原的兵士沒碰到過這樣冷的天氣,有的人甚至都凍掉了手指。
但是,漢朝的軍隊和匈奴兵一接觸,匈奴兵就敗走。劉邦派兵偵察,回來的人都說:「冒頓的部下全是一些老弱殘兵,馬匹都瘦得皮包骨。如果趁勢打過去,準能打勝仗。」劉邦怕這些兵士的偵察不可靠,派大臣婁敬到匈奴營地去刺探。婁敬回來說:「我們看到的匈奴人馬的確都是些老弱殘兵,但我認為冒頓一定是把精兵埋伏起來了,陛下千萬不能上這個當。」劉邦大怒,說:「你膽敢胡說八道,想阻攔我進軍。」接著把婁敬關押起來。
劉邦率領一隊人馬來到平城(今山西大同東北),突然四下裡擁出無數匈奴兵來,個個人強馬壯,原來的老弱殘兵全不見了。劉邦拼命殺出一條血路,然後退到平城東面的白登山。
冒頓單于派精兵把白登山團團圍住,劉邦被困在山上整整7天,無法突圍。
陳平一直守在劉邦身邊,他見援兵也無法攻入,便派使者帶著黃金、珠寶去見冒頓的寧胡閼氏(匈奴王后),請她在單于面前說些好話。閼氏一見這麼多的禮物,非常高興,便對冒頓說:「我們雖然佔領了漢朝地方,卻沒法長期住下來,再說,漢朝皇帝也有人會來救他。咱們不如早點撤兵回去吧,免得吃虧。」
冒頓聽了閼氏的話,第二天一早,就下令將包圍網撤開一角,放漢兵出去。劉邦一口氣逃到廣武,趕快把婁敬放了出來,說:「我沒聽你的話,弄得在白登山被匈奴圍了起來,差點兒不能和你見面了。」
逃出虎口後,劉邦知道自己還沒有力量徵服匈奴,只好先返回長安。匈奴卻是志氣大長,時不時就來侵擾一下,大肆掠奪後即返回草原。
劉邦於是問婁敬該怎麼辦。婁敬說:「最好採用『和親』的辦法,大家講和,結為親戚,彼此可以和和平平地過日子。我們把公主嫁給他,嫁妝一定要豐富,用不著搶掠就可得到這麼多金銀財寶,他就不會來燒殺了。將來公主生下兒子,繼任單于,就是我朝的外甥,外甥和舅父怎麼能夠打仗呢?」
劉邦覺得很有道理,於是派婁敬到匈奴去說親,冒頓也同意了。劉邦大喜,立刻下令將他的獨生女兒魯元公主遠嫁匈奴。
但皇后呂雉哭鬧不休,極力阻撓,劉邦只得選了一個宮女,將她封為大公主,送到匈奴去和親。