朝廷很快觉察了燕王的谋反活动,密令谢贵、张昺、张信设计捉拿燕王。谁料张信偷偷向燕王告了密。8月4日,燕王设了个“鸿门宴”,将谢贵、张爵擒杀,北平城官军成了没头苍蝇。燕王乘机攻取九门,控制了全城。随即援引《祖训》“清君侧”的条款,指齐泰、黄子澄为奸臣,誓师举兵,称自己的部队为“靖难”。然后攻取北平周围的怀来、密云、遵化、永平(河北卢龙)等府县,20天之间,“靖难”的部队发展到4万人。
9月初,朝廷派长兴侯耿炳文为平燕大将军,率30万军队北上平叛。10日,主力抵达真定(今河北正定),先头部队进驻雄县、鄚州(今河北任丘北)。
燕王听说官军北上,即率师南下。中秋节,燕军渡过白沟河(在雄县北),夜袭雄县成功。又在城外伏击鄚州援军,活捉官军主帅。然后直捣鄚州,尽获官军人马辎重。第二天,回师白沟河北,谋划对付耿炳文。当时官军人多但纪律不好,燕军人少,而且大宁未破,还有后顾之忧,但燕军骁勇善战,人心齐,利速战不利持久。燕王得知耿炳文军分屯滹沱河两岸,便派前来投诚的官军回去报信,说燕王击败官军先头部队,马上进抵真定,燕王随后进军。23日,抵达真定城北20里的地方,发现官军正在渡河,于是发起迅猛冲锋,打得官军猝不及防,斩首3万级,俘虏驸马李坚、都督宁忠、颐诚。耿炳文退入城中固守。燕军攻城两天,没有结果,担心老巢被抄,便回北平去了。
建文帝得知耿炳文吃了败仗,很吃惊。黄子澄推荐花花公子曹国公李景隆率军50万直捣北平,齐泰极力反对,建文帝不听。
燕王得知李景隆领50万兵马北伐的消息,不禁大笑,对诸将说:“汉高祖只能将兵十万,李景隆是什么人,能将五十万,他是给我们送战士和物资来了。”他觉得李景隆容易对付,便让世子固守北平城,自己领主力去解永平之围。围攻永平的官军将领江阴侯吴高和都督杨文,见燕王亲领大军来到,吓得赶忙退守山海关。燕王随即挥师直趋大宁。
大宁是辽东和宣府(河北宣化)间的一片广大地区,明朝在这里设有大宁都司,封宁王朱权镇守。它的地理位置重要,兵马强壮,就像一把利剑从北面指向北平的背后。当时大宁的主力在松亭关(长城上的一个关口),内部空虚,宁王又对朝廷心怀不满,真是夺取它的好时机。
燕王避开松亭关官军,从刘家口秘密出关,疾驰至大宁,用计谋挟持宁王,降服了朵颜三卫的骑兵和大宁军马,随后南下。燕王派松亭关官军将领陈亨的家奴和士兵家属到松亭关报信。士兵听说家属平安无事,都不想与燕王打仗。陈亨是燕王的旧将,便在夜里发动兵变,赶走另一将领刘真,带部队投降。燕王得了大宁兵马,实力大增,于是正式设立五军,任命正副统帅,浩浩荡荡回攻李景隆。
李景隆得知燕王征大宁,果然带兵包围了北平,在九门筑垒攻城,燕世子坚守不出战。骁将瞿能快要攻破丽正门,李景隆担心破城功让他独得了,命令停止进攻,结果功败垂成。李景隆料想燕王回师必经通州(今通县),便在通州到郑村坝之间联结九营,亲自督阵。
燕王南下,先在白河(通县东)击溃都督陈晖的1万骑兵,然后以劲骑直冲李景隆的营地,一连破七营,李景隆大败,连夜拔营逃往德州。燕军直抵北平城下,城内守军也奋勇出击,围城官军四散逃命。
建文帝见李景隆也吃了败仗,心中惧怕,便罢了齐泰、黄子澄的官,把他们偷偷留在南京,以为可以取消燕王起兵的借口,下诏让他罢兵。燕王当然没有理睬。
李景隆打了败仗,建文帝也没有怪罪他,反而赐给他黄钺弓矢,赋予杀戮不听命令部下的大权。1400年(建文二年)5月,李景隆在休整后,率领60万官军再次北伐,在白沟河两岸与燕王展开了大战。开始,官军占有优势,燕军打得很吃力,燕王的帅旗攒满了官军的箭镞,就像刺猬身上的刺一样。燕王的坐骑被射伤,连换了三次,身边的箭也射完了,挥剑砍杀,剑也折了,差一点让官军骁将瞿能和平安刺中,幸亏二儿子朱高煦及时赶到,才脱了险。到晚上收兵回营,燕王带三个骑士殿后,竟然迷了路,下马趴在河边观看流水的方向,才弄清东南西北,回到营地。第二天再战,燕王领劲骑绕到官军背后,奋勇击杀,很是艰苦。战斗持续到傍晚,旋风骤起,刮折了李景隆的帅旗,官军阵乱。燕军乘机猛攻,斩杀瞿能父子,官军大败。李景隆逃到德州,又逃到济南。在济南城外,燕王再败李景隆,李景隆单骑狂奔南逃。参政铁铉和都督盛庸固守济南城,都督平安也在单家桥(河北献县南)重新集结20万官军,准备进攻德州,切断燕军饷道。燕军围攻济南3个月,师劳无功,又面临与后方失去联系,便撤围回到了北平。盛庸、铁铉乘机光复德州。
10月,建文帝任命盛庸为平燕大将军,铁铉参赞军务,都督陈晖、平安为副将军,重新集结大军准备北进。他们在德州、沧州和定州(今河北定县)形成犄角攻防阵势。
11月上旬,燕王主动出击。他选择城防薄弱的沧州作为突破口。开始,他摆出了进兵辽东的架势,麻痹沧州守军。接着回师南下,日夜兼程,一举袭破沧州。接着沿运河疾下,放弃德州不攻,直趋山东南部,前锋抵达济宁,企图切断官军的补给线。
这时,盛庸移军出德州,进驻东昌(今山东聊城),先锋孙霖带兵5千驻滑口镇(今山东阿南)。12月21日,燕师袭破孙霖营,1401年1月9日,进抵东昌。盛庸在城外严阵以待。燕王亲帅精锐冲击盛军左翼,不动,又冲中军,盛庸开阵故纵其入,随即合围。燕军大队见主帅跃入敌阵,纷纷向前,盛军火器齐发,燕军死伤惨重。这时,平安又率军赶到,将燕王重重包围。燕王大将张玉战死,自己在朱能等人拼死奋击的护卫下,才从官军力量较弱的西南角上杀出。官军紧追不舍,朱高煦重整人马前来接应,燕王才摆脱了追兵,向北撤去。燕王一路遭官军拦击,苦不堪言,到元宵节后才回到北平。
东昌大捷,盛庸军声大振,建文帝为此祭告太庙,并将齐泰、黄子澄官复原职。
燕王回到北平后,检讨了东昌的失误,在1401年(建文三年)3月下旬再次挥师南下,4月上旬,在夹河(在今河北武强县南)与盛庸军大战。这回,燕王吸取上次教训,没有贸然用骑兵冲阵,而是先用步兵与盛军接触,待敌阵动摇,火器不便施放,再投入骑兵。战役进行了两天,燕军失猛将谭渊,盛军失骁将庄得、皂旗张。第二天下午,燕军阵东北,盛军阵西南,两军再战。战酣之际,突然东北风骤起,飞沙走石,燕军顺风猛冲,盛军逆风不利,大败,退回德州。
4月23日,燕军在藁城击败平安、吴杰统率的官军。平安、吴杰退守真定。
建文帝得知盛庸夹河之败,再次宣布放逐齐泰、黄子澄,暗中派他们到外地募兵。
燕军打败官军后,南下大名,转掠彰德(今河南安阳),谕降林县,前锋抵沛县,焚毁官军粮舟。
平安估计北平空虚,率万骑从真定进攻北平。燕王派刘江领劲旅驰援,击败平安。
德州官军的补给线被切断,河北师疲无功,朝廷很忧虑。文学博士方孝孺向建文帝提议,利用燕世子朱高炽与弟弟高煦的矛盾进行离间,让燕王势力内乱。于是派千户张安带玺书到北平赐给燕世子。世子很聪明,将信原封不动连同张安一起,派人送到燕王军中。这时,盛庸传令大同守将房昭南下紫荆关,袭击保定。房昭南下据易州(河北易县)西水寨,集结力量,平安从真定运饷接济。房昭据易州,南可进保定,北可攻北平,给燕王造成重大威胁。9月,燕王回师围易州。11月,击溃真定援军,破西水寨,返回北平。又遣将领击溃围攻永平的辽东官军。
当时,燕王起兵已经三年,他亲战阵,冒矢石,身先士卒,虽然经常乘胜逐北,但也屡屡濒临危险的境地;攻克的城邑,部队撤走,旋即又被官军占领,仅据有北平、保定、永平三府,形势并不乐观。道衍劝燕王说:“县官的重兵都布置在河北,京师必定空虚。殿下率精锐,不要攻占城邑,直趋京师,可一举破城。”这时,被建文帝罢黜的宦官纷纷投奔北平,给燕军提供了南京防守空虚的具体情况,燕王大为振奋:“多年用兵,何时得了,应当一往无前,临江决一死战!”
1402年1月15日,燕王再次誓师南征。
同月,建文帝任命驸马梅殷为总兵官,率军屯驻淮安,屏蔽京师。
燕王率师在藁城、衡水击溃来自德州和真定的拦截官军,飞驰南下。2月13日,从馆陶(今山东馆陶北)渡过卫河,连拔东阿、东平、汶上、兖州、沛县,如入无人之境。3月3日,驻师徐州城外。4月,都督何福、陈晖、平安率官军尾随燕军,驻济宁,离燕军主力有300里地。盛庸率官军越过燕军,到淮河边布阵防守。
燕王设计诱使徐州守军出战,给以重创,守军不敢再出战。4月3日,燕王率师过宿州(今安徽宿县),10日,驻师蒙城,屯兵涡河(淮河支流)岸边。谍报平安率4万马步官军紧随燕军后边,燕王亲自带两万骑兵北返到便于疑惑敌人的淝河(北肥水)南边埋伏。平安军果然开了过来,与燕军前哨遭遇,击斩燕将王真,燕兵败退。平安紧追不舍,燕王伏起,平安败退小河(濉水)两岸。燕兵夺得宿州。
5月15日,燕王率军至小河,架浮桥,将人马辎重运过河后,留千余人守桥。埋伏在岸边的平安乘机从北岸发起猛攻,击斩燕将陈文,夺桥而南,切断燕军与后续部队的联系。两军隔河相持了好几天,燕军带的干粮快吃完了,燕王便在晚上借着夜色的掩护,仅留千余人守桥,率大队沿小河东下30里,渡河而南,绕到平安军后。天亮,平安才发现燕王转移了阵地,赶忙东进。这时,魏国公徐辉祖也率领援军赶到,与燕军大战齐眉山(安徽灵璧西南),互有损伤,战斗处于胶着状态。
当时燕军连失两员大将,将士们对淮北初夏的暑热也不适应,粮饷又接应不上,诸将请撤军退到小河以北休整。大将朱能说:“汉高祖十战九败,终有天下。我们起兵以来连连得胜,遭到一点小挫折就要回去,怎么能成就伟大的功业呢?”燕王也威吓说:“随你们的便好了!”诸将不敢再提撤兵的事。
燕军未撤,建文帝却误听了燕军北返的消息,将徐辉祖(燕王的大舅哥)的援军召回南京,削弱了官军的力量。
26日,都督何福移营入灵璧城,企图凭借坚城围困燕军。燕王领兵切断灵璧的补给线。平安率兵护饷接济何福。28日,燕军劲骑将平安军分割成两段。何福出城救援,被朱高煦打了回去。夜晚,官军诸将商定联合移营淮河就粮,以放炮三响作为行动信号。第二天,燕军攻击官军营地,发三炮,官军误以为是移营信号,从城中蜂拥而出,将城门挤得水泄不通,队伍大乱,燕军乘机猛攻,官军大败,平安和都督陈晖等37位将领被俘,何福单骑逃脱。平安是滁州人,小时候做过朱元璋的养子,骁勇善战,后来多次跟随燕王出塞,对燕王的用兵方法很了解,自从与燕军对阵以来,斩杀燕军骁将多人,是燕军的劲敌。俘虏了平安,燕军将士高兴得大喊:“我们从此得平安了!”
6月7日,燕兵拔泗州,9日,击溃盛庸军,渡过淮河,克盱眙,也不管淮安与凤阳的守军,直下拔扬州,驻军江北。
建文帝诏天下“勤王”(支援皇帝),派大臣分道征兵,召齐泰、黄子澄还京,并派庆成郡主到燕王营中议割地求和,以延续时间,燕王当然不听。
7月1日,江防都督佥事陈瑄率水师叛投燕王。3日,燕师从瓜洲(大运河北入长江处)渡过长江,击败盛庸统率的水军。6日,燕师进驻镇江,然后水陆并进,8日至龙潭镇(在镇江与南京之间)。建文帝派诸王分守南京,又派李景隆和诸王前去燕王军营议和。皇帝的宝座伸手可得,燕王当然不会同意割地议和,继续向南京挺进。13日,李景隆和谷王朱橞打开金川门(南京北门),让燕王率军浩浩荡荡进入京师,南京陷落。李景隆在白沟河打了大败仗后,建文帝没有怪罪他,将他召回南京,黄子澄痛心自己荐人误国,请把李景隆处死,惩罚他丧师危国的罪过,建文帝不听。燕师直趋南京,方孝孺建议处死李景隆,建文帝还是不听,让他到燕王军中议和,不成,又让他守金川门,最终把自己的生命给了这位纨绔子弟。
京师陷落,宫城中发生大火。大火扑灭后,发现几具烧焦的尸体,据说是建文帝和他的皇后马氏以及7岁的皇太子朱文奎。但建文帝的真正下落仍然是个谜。有人说他从地道中跑了,隐姓埋名当了和尚。1440年(正统五年),有个叫杨竹梓的90多岁的和尚自称是建文帝,被抓进监狱囚死。建文帝的第二个儿子,也是最小的儿子,在南京陷落时才两岁,被囚禁在凤阳的广安宫。直到1457年(天顺元年)57岁时,才被仁慈的英宗(朱祁镇)释放,不久去世。