再说韩王信,在马邑之城率军投降了匈奴王冒顿之后,率军进攻太原,并逼近晋阳。高祖听闻韩王信已反,大怒,于汉七年(前200年)亲率二十余万大军征讨。高祖的军队在铜鞮(今山西沁县)首先击败了韩王信的军队,并杀死其部将王喜,韩王信带着少量兵马逃往匈奴。韩王信的部下没有逃走的将领白土(地名或族名)人曼丘臣、王黄等人又立赵国后裔赵利为赵王,收编了韩王信的一些败散之卒,形成了一股新的势力。
匈奴冒顿听说王黄拥立了赵利为赵王,派左右贤王(匈奴王下面级别最高的大臣)率领一万多骑兵会合王黄等人的军队,屯驻于广武之南,进兵至晋阳,与汉军发生战斗。汉军战败叛军,追击至离石(今山西吕梁),再次将他们击败。随后,匈奴军队又在楼烦西北集结,汉军以战车和精锐骑兵又大败匈奴军。匈奴军节节败退,汉军乘胜追击,准备直捣冒顿单于所驻守的代谷(今山西繁峙一带)。
高祖那时驻军于晋阳,在攻打冒顿总部代谷之前,也不敢贸然进攻,于是派出使者出使匈奴,名为讲和,实则探听虚实。冒顿也非等闲之辈,深知汉朝使者的来意。他命人把强壮的军士和牛马都隐藏起来,军营中只留下老人、小孩和一些瘦弱的马匹,用以麻痹汉朝使者。汉朝前后派出的十几个使者回来后,把他们看到的情况向高祖如实汇报,并且认为匈奴并不像人们想象的那样可怕:士兵老弱,战马病羸。完全可以发兵去攻打。
高祖还是不放心,就派曾建议他定都关中,戍卒出身的刘敬再次出使匈奴。刘敬因劝高祖建都关中,得到高祖赏识,被赐姓刘(本姓娄),拜为郎中,号为奉春君。奉春君刘敬出使匈奴回来,向高祖建议说:“两国相争,此时按理应该向敌方使者炫耀和夸大自己的优势所在,达到震慑对方的目的。我此次去匈奴,只看到他们兵羸将弱的一面,这就不正常了。这一定是他们故意显露自己的弱势,暗地里埋下奇兵来争胜。愚以为匈奴不可贸然进击呀!”
当时汉军已经越过句注山(又做勾注山,今雁门关),二十多万大军做好了随时出击的准备。高祖急于要灭掉冒顿,加之之前几次战争都打了胜仗,更是求胜心切,哪里听得进刘敬的建议。于是他大怒不已,骂刘敬道:“你这齐地的奴才,凭着能言善辩的口舌获得官位,现在竟敢胡言妄语乱我军心,阻止我军出击。”并下令给刘敬戴上刑具,关押于广武。
时值深冬,天寒雪大,冒顿采用诱敌深入战术,隐藏其精锐部队,让他的那些老弱病残迎战汉军,并佯装失败,引诱汉军往北方逃窜。那一年的冬天也特别寒冷,随着汉军向北的不断深入,气候更加酷寒。被冻伤的汉军士兵不计其数,有百分之二三十的士兵甚至冻掉了手指。汉军大多是步兵,共有三十二万,但是行军较慢。高祖自带骑兵追击冒顿至平成(今山西大同),这时候大部分步兵还没有赶到。不料冒顿见时机成熟,发动精兵四十万,对汉军进行反击,把高祖的军队包围在白登山(今山西大同东北马鋪山),使汉军内外不能相通。
高祖被围在白登山,天气酷寒,又无粮草,军队好几天都没有吃饭,几乎绝望。陈平当时以护军中尉的身份随军,关键时刻建议高祖,让他带着几个人混入敌营,看能否在冒顿身边的亲人或近臣身上打打主意。高祖觉得可以一试,于是派陈平带着几名精干助手,带着大量的金银宝贝,混入匈奴军中,见机行事。
陈平和他的助手混入到匈奴军营中,发扬他长期在敌后工作的优势,很快就联络上冒顿单于的一位很宠幸的阏氏。陈平赠之以厚礼,希望他能在冒顿单于面前替汉朝皇帝说说情,放其一马。这位阏氏得了厚礼,很是高兴,就找了个机会劝冒顿说:“两国君主没有必要互相困逼于绝境,来日方长。退一步而言,单于您就是打下了汉朝的土地,终究还是不能长期占有呀!况且汉王有神仙庇佑,灭了他恐怕得罪了神灵,请单于明察!”。
冒顿很宠爱这位阏氏,又觉得这话在理,已经有些心动了。加上此前与匈奴约定联军击汉的韩王信部将王黄和新立伪赵王赵利没有按约定日期前来参战,冒顿也怕他们已经与汉朝暗中签订了互助协议,于是听从了阏氏的劝告,命令士兵解开包围圈的一角,放汉军逃出。高祖在白登山一共被围了七天,得知冒顿有意放他们出去,便命令手下士兵拉满弓,搭上箭,箭头朝外随时可以射击。这样做是怕冒顿放他们逃跑是假,趁机剿杀是真。还好的是,匈奴军并没有怎么阻拦,高祖冲出包围圈后,与来营救的汉朝大军会合。
不久,冒顿带领匈奴大军回到他们的统治腹地,汉军也罢战收兵。高祖回到广武,斩杀了那些认为匈奴可以攻打的使者,又把刘敬从监狱放出,赦免了他的罪行,后悔地对刘敬说:“我没有采用你的建言,以致于被困在平城呀!”刘敬于是被封为关内侯,食邑二千户,号为建信侯。这里也可以看出高祖知错能改的一面。