光绪十年,应越南阮氏王朝请求,清政府派军驻扎越南。七月法军向清军进行武装挑衅,清朝政府决定正式向法国宣战,中法战争爆发。
光绪十一年一月,法军在中越边境发动大规模的进攻,并占领了广西门户、西南重镇镇南关(今友谊关),打算以此为突破口,进一步占领中国南部。
为了打击侵略者的嚣张气焰,冯子材率领军民在镇南关内十里关前隘修筑防御工事,积极备战。关前隘形势十分险要,两边是崇山峻岭,中间是一条狭窄的通道,关口易守难攻,战略地位极为显著。
冯子材率领军民在隘口前抢修了一道三丈多长的长墙,把东西两岭围在墙内,墙外挖了深壕,山岭险要处构筑炮台,居高临下,威势无比,使敌人不敢接近。
同时又进行了周密的军事部署:王孝祺、苏元春、王德榜等将领分别率军驻守山口周围各处,交战时相互接应。自己率军守卫长墙和山岭要地。在组织军民同心抗敌外,还同关外中越人民取得联系,以求共同抗战歼灭敌人。
法军统帅尼格里从文渊城调集军队分两路趁天降大雾之机向关前隘扑来。一路进攻东岭炮台,一路直奔长墙。在大炮的掩护下,法军攻占了东岭炮台,然后在东岭炮台用大炮轰塌了长墙,关前隘法军持枪冲将过来。战士们英勇奋战。正在危急关头,王孝祺率军从小路绕到敌人侧面攻打法军。
此时,苏元春率领军队赶到,冒着枪林弹雨登上东岭,攻占了部分炮台,向法军开炮轰击。驻守关东的王德榜听到大炮轰鸣声,按冯子材事先部署,率兵去围攻文渊城,截断法军后路。法军派出的运送食品弹药的车队多次被王德榜的军队击退,断了补给的法军军心大乱。
垂死挣扎的法军向长墙又一次发动了疯狂的进攻。冯子材杀向敌群,与法军展开短兵相接的肉搏战。攻打长墙的侵略军顿时阵势大乱,很快便全线崩溃。但是,占据东岭炮台的法军仍不甘心,企图负隅顽抗。冯子材指挥军队发动了七次攻坚战,都未能拿下。
不久,王孝祺率军绕到东岭边,与冯子材前后夹击法军,最终将东岭夺回。
东岭、长墙溃败后,中越人民援军赶到,法军仓惶向文渊城逃去。
冯子材决定不给敌人以任何喘息时机,率领军民乘胜追击,很快收复了被侵略军强占的文渊、凉山、谷松、屯梅,直指北宁。北宁的两万多的越南人民组成“忠义”团,打起“冯”字旗号,抗击法军。在中越军民的沉重打击下,法军狼狈逃窜到船头、郎甲一带。至此,镇南关战役大获全胜。