突厥不单单援助刘黑闼反唐,同时亦出兵与马邑军阀刘武周的残部苑君璋出兵进攻雁门,定襄王李大恩部将王孝基拒战,结果全军覆没。李大恩众寡不敌只能据城死守,突厥围城月余之后继续南下,唐将尉迟敬德、窦琮、桑显和、杨师道等分率大军救援,苦战逾月终于将突厥人击退。俗话说“墙倒众人推”一见有机可趁,原先投诚的军阀如高开道、徐圆朗等人亦响应刘黑闼而纷纷起兵,勾结突厥入侵内地,一时间关东大地烽火处处。
刘黑闼势大难制之下,唐朝只能再次祭出百试百灵的终极武器,于武德四年(公元621年)十二月十五日以秦王李世民为主帅,齐王李元吉为副帅,麾军讨伐刘黑闼。刘黑闼闻李世民前来,立刻收缩兵力,放弃相州,退守其老巢洺州。李世民顺势攻取相州,兵锋直指刘黑闼老巢洺州,大军攻至肥乡,在洺水(今河北省南部之洺河。源出武安县西太行山,东经监洺关北,自此以下,河道屡改,今则东流经永年县北折,汇入滏阳河。)岸上扎营与刘黑闼对峙。而幽州总管李艺也重整旗鼓,再次领本部兵马会同秦王李世民讨伐刘黑闼,刘黑闼闻讯之后,于武德五年(公元622年)正月二十七日留下一万兵力,命范愿守洺州,自己率军攻击李艺。夜晚,刘黑闼在沙河县宿营,唐将程名振携带六十面大鼓,潜至洺州城西二里处的河堤上猛擂,鼓声喧天,洺州城中地动屋摇。这招声东击西让范愿惊慌失措,以唐大军将要攻城,急派飞骑报告刘黑闼,刘黑闼闻报害怕都城有失急忙返回。派他的弟弟刘十善和行台张君立率领一万兵马在鼓城(今河北晋州)攻打李艺,正月三十日双方战于徐河(今河北保定东北),刘十善、张君立大败,损失八千人。
在唐军的威压之下刘黑闼所占据的城池也感受到了莫大的压力,对刘黑闼心怀不满的洺水城(今河北周曲东南)李去惑占据城池后降唐,李世民于是派彭公王君廓率一千五百名骑兵入城与李去惑共同守城。洺水城是洺州的战略要地,位在肥乡以北,洺州城以东,洺水与漳水交界之处。此时李艺在北,李世民在南,已经是两面夹击的包围态势,而刘黑闼所能控制的地区全数在东面,唐军得到了洺水城不但等于控制了漳水的东岸,而且掐断了刘黑闼军通往东面各州的联系,因此绝不容有失。因此刘黑闼闻讯之后立即率兵猛攻洺水城,二月二十一日前锋行至列人县后却被秦琼给拦了下来,两军混战,秦琼勇猛无敌,刘黑闼前军因此败退。之后李世民乘胜收复邢州(治龙冈,今河北井陉西北)、井州。李艺亦夺取了定(治安喜,今河北定县)、栾(治今河北隆尧东)、廉(治今河北藁城)、赵(治平棘,今河北赵县)四州,抓获黑闼尚书刘希道,与唐军主力会师于洺州。
秦琼虽然小胜一场但是依然未能阻止刘黑闼收复洺水的决心,其主力突破唐军封锁,将洺水城团团包围。该城虽然城防很差,但是地势险要、四面环水,水宽五十余步,深三、四丈,于是刘黑闼在城东北修建两甬道(这甬道本来的意思是庭院或墓地中砖石铺的路,在这里个人认为其实是浮桥。)准备攻城。李世民率兵三次增援,而刘黑闼军顽强阻击,将唐军挡在了洺水城之外,此时洺水已成孤城一座。刘黑闼军战斗力很强,眼看甬道即将修成,李世民认为以王君廓的能力决守不住洺水。此时大将李世绩亦进言道:“甬道修成之日,便是洺水城陷之时。”但是洺水乃兵家必争之地,绝不能失,此时在洛阳战役中大出风头的猛将罗士信自告奋勇请求入洺水代替王君廓守城。因此李世民登上城南高坟,用旗语令王君廓突围。于是唐军里应外合,王君廓率兵向外突围,而罗士信则率人向内冲,代其坚守城池。
刘黑闼军一开始被唐军打了个措手不及,但是很快便反应过来,再度将突破口堵死,罗士信手下能突入城中的仅二百余人。甬道修成后,刘黑闼猛攻洺水城,罗士信不愧猛将之名,在十几倍敌军围攻之下死守八昼夜,可是天公不作美,此时天降大雪,唐军增援不上,洺水城最终于二十五日陷落,罗士信被俘。刘黑闼极为欣赏罗士信的勇猛,想要招降于他,但罗士信威武不屈,最终被杀,年仅二十。(关于罗士信的年龄目前还有疑问,新唐书载享年二十八,而旧唐书与资治通鉴均记载为二十,但是按照通鉴所说,其在大业九年也就是公元613年是十四岁,那武德五年去世的话应该是二十四岁,这与两种记载均相差四岁之多,实在不知何故。)四天后天终于放晴,李世民率大军奋战,而刘黑闼军亦因为罗士信的坚守而打得精疲力尽,洺水城再次易手。就这次洺水城攻防战来说,唐军虽然完成了封锁刘黑闼的战略目标,但是为此城损一大将,实在是得不偿失,以罗士信之武勇,如果能活到贞观年间,那大唐征伐四方的辉煌战绩中必定有他的一份,只可惜“壮志未酬身先死”,这也是身为武人的一种悲哀吧。
攻下了洺水城之后,刘黑闼已如困兽,被唐军死死封锁在了洺州城方圆极小的一个地域内,已无战略回旋余地。唐军控制洺水城之后刘黑闼与东边各州的粮道亦被掐断。刘黑闼因此率军向唐军多次挑战,但李世民算准了刘黑闼军缺粮,急于求战的心理,坚守不出。刘黑闼没奈何,于是想了一个法子,于三月十一日在军中大摆宴席,向唐军示威,表示己方并不缺粮,李世绩趁机袭营,刘黑闼军就是怕唐军不出击,于是唐军不但没能袭营成功,反而被人追杀。刘黑闼手下左大将高雅贤当时也是喝高了,单枪匹马红着眼睛追杀李世绩,不知不觉中与大部队拉开了距离,结果冷不防被李世绩部将潘毛刺于马下,等高雅贤部下继后赶到,扶高雅贤回营之时,高雅贤却已一命呜呼。可是唐军并没有吸取教训,两日后再次袭营,结果被刘黑闼手下右大将王小胡生擒潘毛,算是为高雅贤报了仇。
由是唐军继续坚守不出,刘黑闼在后勤压力之下不得已冒险从东边的冀、贝、沧、瀛等州水陆运粮,结果不出意外地被唐将程名振率军所拦截,舟、车,皆被沉焚。唐军袭营启发了刘黑闼,刘黑闼也照葫芦画瓢发动了一次突袭,所谓来而不往非礼也,这次刘黑闼瞄准的也是李世绩的大营。李世民亲率兵马自后掩杀,哪知刘黑闼早有防备,结果不但没能解围,自己和其后亦是名将之一的略阳公李道宗一同深陷重围险遭不测。结果还是尉迟敬德神勇无敌,亲自率敢死队冒死陷阵,终于将李世民与李道宗救出。在阅读这段历史的时候,也许有人会觉得非常奇怪,李世绩被后人与李靖并称为初唐二李,战功赫赫,为啥在对阵刘黑闼的时候表现却如此不济?其实这里面有一段内情,话说刘黑闼原本并不是窦建德手下的将军,天下大乱之后他先是跟随郝孝德,后来李密掌握瓦岗义军之后便在李密手下当裨将。
此时李世绩也是瓦岗寨的重要人物之一,他们二人可以说还是同一个战壕的战友。李密被王世充击败投降唐朝之后他又跟了王世充。而此时窦建德联合突厥人大举攻唐,李世绩不能敌,与李渊的妹妹同安长公主及淮安王李神通俱被俘虏。窦建德抓了李世绩的老爹,李世绩无奈之下只能为他卖命。李世绩想归唐,但是窦建德又看得紧,不好行动,必须干出一点功绩来让窦建德放松戒备。这时候王世充派了刘黑闼防守新乡,实在是撞到了李世绩的枪口上,于是李世绩率军进攻新乡,把刘黑闼给抓了当作投名状献给窦建德。可是没想到的是刘黑闼与窦建德是从小玩到大的好朋友,于是干脆就跟了窦建德,而李世绩在窦建德放松警惕之后连老爹也不要就逃回了唐朝。因此李世绩与刘黑闼之间既是熟识又有极大的过节,刘黑闼打李世绩自然能发挥出百分之一百二的战力来,李世绩总是吃鳖也就变成了一件顺理成章的事。
唐军坚守至六十日,刘黑闼军中终于粮尽,于是倾巢而出,率步骑两万与唐军决战。而这边唐军早已在洺水上游拦堤筑坝,堵截水流。李世民与上游士卒约定,两军交战之时,伺机决堤放水。唐军此时再也不高挂免战牌,亦是全军出动,李世民以轻骑为先锋,与刘黑闼军骑兵混战,李世民自率精骑于后掩杀,刘黑闼均骑兵不是对手,向后败退。李世民趁势率骑兵冲击,马踏刘黑闼的步兵大阵。刘黑闼军亦是骁勇善战,以步卒对抗骑兵依然阵势不乱,殊死反击。两军从正午战至黄昏,刘黑闼军虽死战不退,但是终究不敌,渐渐显出败像。右大将王小胡长对刘黑闼长叹:“智力尽矣,宜早亡去。”于是与刘黑闼先行撤退。而手下士兵并不知情,依然奋勇战斗。此时唐军早已在上游挖开大坝,洪水汹涌而至,瞬间平地成为泽国,水深丈余。背水一战的刘黑闼军猝不及防,终于溃败,被斩首万余,溺死数千人。刘黑闼见事不可为,只得率两百余骑逃奔突厥。
就在李世民与刘黑闼生死鏖战之际,唐朝为了不被两线攻击,因此再次向突厥表达了改善关系的愿望,派使者带了大批金银珠宝贿赂突厥颉利可汗,并且答应进行和亲。突厥人收了财物之后倒是放了之前抓的人质,当然唐朝亦将突厥方的人质放归。眼见唐突两国关系就要转为谐和之际,没想到突厥人翻脸比翻书还要快,又率兵与高开道、苑君璋进攻雁门。守将并州总管刘世让死守月余,终于顶住了这次突袭。唐军此时正处于平刘黑闼之战的关键时刻,因此只能隐忍不发。
等刘黑闼被李世民打跑之后,唐代州总管定襄王李大恩探得突厥发生饥荒,因此可以趁机攻取苑君璋所占据的马邑,于是计划李大恩与殿内少监独孤晟一同进攻马邑,约定于二月在马邑汇合。本来计划是不错,可惜计划赶不上变化,独孤晟居然失期不至,李大恩面对敌人优势兵力势单力孤,只能驻扎新城。这时候刘黑闼正好逃到了突厥,他的勇武让突厥人非常欣赏,于是突厥颉利可汗派数万骑兵和刘黑闼一起讨伐唐军,突厥军将李大恩团团包围在新城(在今山西朔县西南)。唐高祖急派右骁卫大将军李高迁往救,唐军还未能赶到,李大恩军却已粮尽,只能趁黑夜仓促突围,刘黑闼与突厥乘机掩杀,大败唐军,唐军死者数千人,李大恩殁于阵。之前刘黑闼因为缺粮被李世民打得一败涂地,这次斩杀李大恩也算是小小地报了一回仇。