朱棣起兵后不久,迅速扫清了北平的外围。他先是拔除了居庸关,攻占了怀来,捉拿了宋忠,接着控制了密云,攻克了遵化,最终降服了永平。这一系列举动,无不显示出他雄心勃勃的姿态。彼时,经过朱元璋大肆清洗功臣之后,朝廷已没有合适的将领可供调遣。于是,朱允炆只得从幸存的老将中挑选了耿炳文,任命他为大将军,率领十三万大军进攻燕地。
建文元年(1399年)八月,朱允炆的军队行至真定,结果在滹沱河遭遇燕军的迎头痛击。耿炳文指挥的队伍在此役中遭到惨败,不得不退守真定,并坚守阵地不出。燕王朱棣见状,心知这位老将并非易于征服,于是决定暂时撤退,三天后,燕军才解围而返。朱允炆得知耿炳文军队败退的消息后,依照黄子澄的建议,决定任命李景隆接替耿炳文的位置,成为新的大将军。 九月,李景隆率军抵达德州,开始集结耿炳文溃败后的士兵,并调动了各路军马,共计五十万,进驻河间。为了诱使李景隆深入,朱棣则策划了一番部署。姚广孝协助世子朱高炽稳守北平,而朱棣本人则率领大军驰援永平。攻围永平的江阴侯吴高看到局势不妙,决定退守山海关。此时,朱棣带领自己的队伍直指大宁,宁王的封地。大宁所属的朵颜诸卫,主要是蒙古骑兵,勇猛善战,而朱棣早已盯上了这一支强大的部队,企图将其吞并,来壮大自己的军力。朱允炆自然也担心宁王和朱棣会联合起来,因此他下令削弱宁王府的三护卫。朱棣察觉到这一变化,认为这是攻占大宁的良机,便决定从刘家口出发,直指大宁。十月,他成功并吞了大宁宁王的部队以及朵颜三卫的军队,并迅速回师救援北平。 李景隆得知朱棣进攻大宁,便决定率兵渡过卢沟桥,直逼北平城下。然而,几次对城的攻打均未成功,燕军的防线固若金汤,李景隆的部队在持续的攻势中疲惫不堪。最终,李景隆只得在郑坝村驻扎,围困北平。到了十一月,朱棣带领大军回师至北平郊外,开始对李景隆的营地展开进攻。城内的燕军也同时发起了突击,内外夹攻之下,李景隆的部队无法再坚持。某个夜晚,李景隆在混乱中悄然逃走,第二天,士兵们得知主帅已经逃亡,不得不丢弃兵器粮草,仓皇南逃。李景隆的残部一路逃至德州。 李景隆军败的消息很快传到了南京,朱允炆闻讯后,焦急地询问黄子澄:外间传来军情不利,是否属实?黄子澄知道真相,却选择隐瞒事实,轻描淡写地回答:听说交战中我方已有数次胜利,然因天气寒冷,士兵疲惫,暂时退回德州,待春暖后再行出征。黄子澄还特别指派人手告诉李景隆:切勿奏报败事,尽量掩盖失利。在这些谎言的掩护下,朱允炆深信不疑,甚至给了李景隆升任太子太师的职位,并奖励他。 建文二年(1400年)四月,李景隆再次集结了大军,联合武定侯郭英和安陆侯吴杰等,号召六十万大军,气吞万里,进攻至白沟河,并任命都督平安率万骑为前锋。燕军方面,朱棣则派出张玉指挥中军,朱能指挥左军,陈亨指挥右军,其他先锋则有丘福等。两军在白沟河展开激烈会战,前锋部队平安和都督瞿能父子屡次击败燕军,右军主将陈亨甚至被平安斩杀。朱棣的坐骑多次受创,最终不得不换马继续指挥。 尽管南军兵力远远超过燕军,但由于将领的指挥分散、军令不统一,导致本应胜利的局势反倒没有转化为优势,反而在战败时未能有效组织反击。在瞿能父子阵亡、平安的部队被朱能击败后,南军阵营大乱,四散奔逃,声势如雷。战场上,郭英、李景隆等人纷纷溃逃,弃械丢粮,尸体横陈,战死的竟然超过十万。李景隆单骑逃往德州,燕军紧追不舍。五月,李景隆从德州逃至济南,然而燕军再度逼近,围困济南城。经过三个月的围城,燕军才撤退回北平。此时,朱允炆终于意识到李景隆的无能,决定更换指挥,任命盛庸接替李景隆为大将军,提升铁铉为兵部尚书,负责军事事务。