建文元年(1399年)七月,朱棣反书至南京,朱允炆祭告太庙,削朱棣宗室属籍,废为庶人。决定起兵讨燕。在真定(今河北正定)设置平燕布政司。
朱棣初起兵时,燕军只据北平一隅之地,势小力弱,朝廷则在各方面都占压倒性优势。所以战争初期,朝廷拟以优势兵力,分进合击,将燕军围歼于北平。朱棣采取内线作战,以部将郭资戍守北平(今北京),迅速即攻取了北平以北的居庸关、怀来、密云和以东的蓟州、遵化、永平(今河北卢龙)等州县,扫平了北平的外围,排除了后顾之忧,便于从容对付朝廷的问罪之师。经过朱元璋大肆杀戮功臣宿将之后,朝廷也无将可用,朱允炆只好起用年近古稀的幸存老将长兴侯耿炳文为大将军,驸马都尉李坚为左副将军,都督宁忠为右副将军,率军13万伐燕,数路并进,号称百万大军,同时传檄山东、河南、山西三省供给军饷。耿炳文率军在八月十三日到达真定,并分兵于河间、鄚州(河北任丘北约30里)、雄县,为犄角之势。在经过观察后,八月十五日,燕军趁中秋夜敌军不备,偷袭雄县;成功后又利用伏击击败了鄚州的援兵,遂攻克鄚州,收编剩余的部队。
耿炳文部将张保来降,告知朱棣耿炳文的部队分驻滹沱河两岸,于是朱棣让他回去告诉耿炳文“雄县、鄚州大败,燕兵将至”,以打击其士气,并使耿炳文合兵一处,便于一举击溃。耿炳文果然将南岸的兵调过河。八月二十四日,燕军到达无极县。从樵夫和南军被俘士兵处得知敌情,于是燕军发动决战。
建文元年(1399年)八月,南军师至河北滹沱河地区。燕王在中秋夜乘南军饮酒作乐之机,突破雄县,尽克南军的先头部队。继而又于滹沱河北岸大败南军的主力部队。耿炳文率残部不到十万人在真定坚守不出,燕军攻城三天不克。八月二十九日,燕军返回北平。顾成降燕之后,留在北平协助燕世子朱高炽守城。
换帅李景隆
建文帝听到耿炳文军败,根据黄子澄的推荐,任曹国公李文忠之子李景隆为大将军,代替耿炳文对燕军作战。又令辽东江阴侯吴高等领兵围攻永平(今河北昌黎西北)。朱棣留下少量兵将坚守北平,自己亲统大军救援永平。
李景隆本是纨绔子弟,素不知兵,“寡谋而骄,色厉而馁”。建文元年(1399年)九月,李景隆至山东德州,收集耿炳文的溃散兵将,并调各路军马,共计50万,进抵河间驻扎。当朱棣侦知李景隆军中的部署后,笑着说,兵法有五败,李景隆全犯了,其兵必败无疑,这就是政令不修,上下离心;兵将不适北平霜雪气候,粮草不足;不计险易,深入趋利;求胜心切,刚愎自用,但智信不足,仁勇俱无;所部尽是乌合之众,且不团结。为了引诱南军深入,朱棣决计姚广孝协助世子朱高炽留守北平,自己亲率大军去援救被辽东军进攻的永平,并告诫朱高炽说:“李景隆来,只宜坚守,不能出战。”朱棣还撤去了卢沟桥的守兵。
朱棣这一招果然灵验,李景隆听说朱棣率军赴援永平,就率师于建文元年(1399年)十月直趋北平城下。经过卢沟桥时见无守兵,禁不住欢喜,说:“不守此桥,我看朱棣是无能为力了。”这时朱高炽在北平城内严密部署,拼死守卫。李景隆则号令不严,指挥失当,几次攻城,皆被击退。南军都督瞿能曾率千余精骑,杀入张掖门,但后援不至,只好停止进攻。又因李景隆贪功,要瞿能等待大部队一起进攻,错过了时机。燕军则因此得到喘息,连夜往城墙上泼水,天冷结冰,待到次日,南军也无法攀城进攻了。吴高怯懦,不敢应战,退保山海关。朱棣解救永平之后,率师直趋大宁(今内蒙古宁城西)
燕军偷袭大宁
建文元年(1399年)九月初一,江阴侯吴高率辽东兵攻打永平郡,故朱棣趁李景隆踌躇不决之际,九月十九日前往救援。九月二十五日,朱棣击败吴高,并决定趁势偷袭十七弟宁王朱权的藩地大宁(今内蒙古宁城);另一方面利而诱之,将南军引至“空城”北平下。九月二十八日,朱棣率众出师。传信给燕世子朱高炽,令其坚守北平城。
十月初六日,燕军经小路到达大宁城下。朱棣单骑入城(一说击败守将房宽后入城),见宁王朱权,哭诉自己无路可走,向朱权求救,希望能向朝廷上书,谢罪免死。朱权相信并收留了他。在居大宁期间,朱棣令手下吏士入城结交并贿赂大宁的军官等。十月十三日,朱棣提出告辞,朱权在郊外送行;但朱权来到郊外后,伏兵尽起,大宁军纷纷叛变,归附朱棣。于是朱权与宁王妃、宁王世子等一同随朱棣前往北平,而大宁的全部军队都被朱棣收编。大宁成为空城,朱棣实力大增。
听说燕王朱棣率精锐征大宁,李景隆引军攻北平。南军在郑村坝(今大兴以东二十里)扎营,筑垒同攻北平九门。燕王世子朱高炽坚守。朱高炽遣人夜间偷袭南军大营,获得了一定的喘息时间;南军攻城急时,城中妇女也上城头向下投掷瓦石。南军唯一一次获胜的机会是都督瞿能攻张掖门(一说彰义门,据《方舆纪要》,彰义门即广安门;存疑)几乎要攻下时,因被李景隆所忌,只得停止。功败垂成。农历十月北平甚是寒冷,于是燕军守城部队夜里汲水浇于城墙上,次日城墙结冰,南军无法攀登。南军因天寒地冻,战斗力骤降,攻势自此受阻。
郑村坝之战
,
建文元年(1399年)十月十九日,燕军在会州(今河北省平泉县)整编,分立五军(中、前、左、右、后)十月二十一日,燕军入松亭关(今河北宽城县西南)十一月初五日,燕军渡白河(时已结冰,渡河处在今北京顺义区东),并打败李景隆的哨探陈晖部队万余人。当天,与李景隆大军在郑村坝会战。燕军左右冲击,连破南军七营,李景隆大败。当夜,李景隆见战事不利,令郑村坝所有军队轻装撤退。数十万人的辎重全部留给了燕军。但李景隆走得匆忙,没有通知围攻北平城的南军军队,于是燕军轻易击溃北平城下的南军,获得其物资。李景隆率军撤回德州,郑村坝之战结束。此战南军丧师十余万人。
建文元年(1399年)十一月初九日,朱棣回到北平城,因为之前(七月)上书没有回信,再次上书朝廷,陈述齐泰、黄子澄构陷宗藩的罪过。建文帝没有回应。十二月,朱棣用反间计令辽东守将吴高被削爵贬黜,消除东北方向的后顾之忧。
由于李景隆准备等来年(1400年)开春再北上攻燕,朱棣决定攻打山西大同,以使南军疲于奔命。十二月十九日,朱棣出师攻大同。十二月二十四日,燕军抵达广昌,守将杨宗投降。建文二年(1400年)正月初一,燕军抵达蔚州,明军守将王忠、李远投降燕军。二月初二日,燕军攻打大同。由于大同是代王的封地且军事地位极重要,李景隆不得不救援。待李景隆走出紫荆关后,燕军从居庸关返回北平。南军在冰天雪地中白跑一趟,兵力、装备大量损失,士气受到重创。
建文二年(1400年)二月二十八日,李景隆给朱棣写信,请求暂时停战。燕王回信索要齐泰、黄子澄等。一说李景隆自此有二心。除了使南军白跑了一个月外,燕军在本次伐大同时意外遇到了从蒙古来降的军队,收编之。此外,保定府于建文二年(1400年)二月降燕。
激战白沟河
建文二年(1400年)四月,李景隆从山东德州,郭英、吴杰等从真定誓师北伐燕军,目标是白沟河(北拒马河)。兵力增至六十万,燕军亦出。四月二十日,燕军渡过玉马河,驻于苏家桥。四月二十四日,燕军与南军会战(战场在河北省高碑店市新城县南三十里)
南军(李景隆部)先锋平安之前曾跟随朱棣出塞,熟悉朱棣战法,设伏兵。燕军到达之后,平安伏兵起,挺矛冲锋;瞿能父子也一同合击,燕军战斗失利。当时南军郭英部也来到战场,郭英在燕军撤退的必经之路上埋地雷,燕军撤退时损失惨重。朱棣亲自率军殿后,但夜间迷失了道路。朱棣下马趴在地上辨别河流的方向,才分清方向,回到大营。令军士提前用餐,准备次日决战。次日(四月二十五日),燕军与南军再次合战。瞿能、平安绕至燕军后方,攻其后军得手。朱棣见状不好,亲冒矢石,令丘福冲击李景隆中军,不成功;朱棣率军攻打,双方混战,飞矢如雨。朱棣先后换了三匹马,射光了三筒箭,宝剑也砍断,差点被平安、瞿能所伤。无奈之下,朱棣来到河堤上,举起马鞭,假装招呼援兵,李景隆见状果然生疑,攻势减缓;朱高煦此时也来援救,战事暂时缓和。
不久,瞿能再次引众搏战,大呼“灭燕”,形势再次对燕军不利。就在战事危急时,一股旋风刮起,刮断了李景隆的帅旗,南军顿时大乱。朱棣抓住机会,绕到李景隆后方放火。南军大败,瞿能父子被朱高煦阵斩。郭英等向西撤退,李景隆向南撤退,辎重全部扔下,投降十万余人。李景隆撤回德州。
四月二十七日,燕军进攻德州。五月初七,李景隆逃往济南。初九,燕军进入德州,获得大量粮食储备。五月十五,燕军攻济南,李景隆残存十余万兵毫无战斗力,大败。李景隆逃走。燕军遂围济南。十月,朝廷召李景隆回南京。李景隆把六十万大军丢得一干二净,黄子澄、练子宁、叶希贤等上书,请求立斩之,朱允炆不听。对于推荐了李景隆,黄子澄感到十分后悔。
济南之战
李景隆在几个月的时间内一败再败,建文帝撤免了他的大将军职务,建文帝采黄子澄之谋,遣使议和以求缓攻,又任命盛庸为平燕将军,代李景隆统兵。盛庸屯兵德州,以遏燕军南下。
李景隆败退后,燕军围济南。右参政铁铉、盛庸坚守。朱棣射信入城招降,未果。建文二年(1400年)五月十七日,燕军掘开河堤,放水灌城。铁铉见势不妙,决定派千人诈降,诱朱棣进城。次日,朱棣前往济南,走到城门口时,城门预设的铁板落下,但略快了些,只打中了其所乘马的头。朱棣大惊,换马跑回。由于事出意外,断其后路等工作没能成功。朱棣逃回,大怒,围城攻打三个月。
由于济南的军事地位极重要,若取得济南,进可南下攻打,退可画疆自守,故燕军乘新胜之锐气,志在必得。不料攻城不利,朱棣愤怒之下决定使用大炮攻城,城中不支。铁铉见状,在一些木牌上写了“高皇帝神牌”几个字并挂在城头,燕军只得停止炮击。六月,惠帝见济南危急,遣使求和。朱棣不听。七月,平安进军河间,扰乱燕军粮道。朱棣进退不得,八月十六,撤兵回北平。盛庸、铁铉追击,大败燕军,收复德州。济南之战结束。
九月初十,朱允炆升铁铉为山东布政使,参赞军务,不久后升兵部尚书;封盛庸为历城侯,平燕将军,撤换李景隆。都督陈晖、平安为副职。南军重新进到德州、定州(今保定与石家庄之间)、沧州(今河北沧州)
东昌之战