
1925年下半年,国民军在苏联军事人员的协助下,于南口构筑了近百里的防线。退出北京后,除去驻防甘肃的刘郁芬两个师及马家军,国民军总兵力约十六万人,其中包含国民军一军十二个师、七个旅,国民军二军弓富魁、胡德辅等部,国民军三军孙岳残部,以及新改编的国民军五军方振武部。国民军确立了“守南口,防多伦,攻晋北”的整体战略:约三个师部署于南口防线,刘汝明第十师守正面,佟麟阁第十一师布防左翼,右翼由陈希圣旅驻守;鹿钟麟以总指挥身份驻节怀来调度,宋哲元、孙连仲部在多伦一线抵御奉军,韩复榘、石友三部则向晋北的阎锡山部发起进攻。
彼时奉、直、晋联军总兵力超过五十万,他们虽以“讨赤”为旗号暂时联合,放言对国民军要“犁庭扫穴,痛饮黄龙”;但实际各怀私心——都想着保存自身实力,借机争抢地盘,内部矛盾重重,无法形成协同一致的进攻合力。

1926年4月下旬,张宗昌率领直鲁联军率先对国民军的南口阵地发起猛烈进攻,直系将领靳云鹗所部因与国民军存有旧关系,作战中并未尽力配合,导致这次进攻收效甚微,没能取得实质性进展。5月23日,国民军集结约八万人兵分六路,主动向晋北大同方向发起进攻,阎锡山所部难以招架,接连向吴佩孚、张作霖发急电求援。
6月初,吴佩孚以贻误战机为由解除靳云鹗的职务,随后重新调整部署,分三路大举向国民军发动进攻。田维勤任东路指挥,从昌平方向进攻怀来;王为蔚、王维城攻中路,自涞源向东推进;原奉系郭松龄残部魏益三投靠吴佩孚后担任西路指挥,率军从涞源出击蔚县。

6月中旬,奉军及张宗昌的直鲁联军,将主力集中在京东密云、京西昌平一线,对国民军南口主阵地发起新一轮猛攻。为分散国民军兵力,奉军吴俊升率部进攻多伦与围场,阚朝玺部向朝阳、承德方向推进,试图从北路包抄国民军后路。国民军依托提前构筑的百里防御工事沉着应战,层层阻击,奉鲁联军的多路进攻都被成功击退,战场再次陷入僵持。
7月8日,奉军不甘失败,再次组织力量向南口发起强攻,直鲁联军以白俄雇佣兵驾驶装甲火车作为前驱,猛扑南口正面阵地;张学良、韩麟春、汤玉麟、万福麟等部同时进攻南口左右两翼,试图三面夹击突破防线。但国民军炮兵与步兵密切配合,凭借坚固工事顽强反击,再次重创了来犯之敌,奉鲁联军的第二轮进攻同样以惨败告终。此时南方北伐大军已经进军湖南,吴佩孚的后方日渐空虚,北洋联军的进攻节奏也被这场旷日持久的消耗战拖得愈发艰难。

经过数月连续苦战,国民军已经陷入严重困境。奉军凭借绝对的火炮优势,将南口大部分工事摧毁,再加上恰逢雨季,阵地积水最深没过腰部,恶劣环境导致军中疫病大面积流行;国民军本就缺乏雄厚的物资支撑,长期作战消耗后,弹药、给养全部供应不足,处境十分艰难。但冯玉祥平日治军严格,麾下部队训练有素,即便身处绝境,广大官兵依旧保持着高昂士气与旺盛战斗力。
7月10日,直军内部意外生变,田维勤部的陈鼎甲旅,加上第三十九、第四十旅下属的数个团,在共产党员许权中等人的组织领导下发动兵变,集体投向国民军。这场兵变直接打乱了直军的进攻部署,导致直军整条战线军心浮动,原本紧逼的攻势彻底陷入停滞,也给了绝境中的国民军短暂喘息的空间。

7月底,奉军调整作战部署,吴佩孚也限令五日内攻克南口;到8月初,奉直联军集结十二万兵力,对南口发起总攻。国民军南口守军与后方的联系多次被切断,一些前沿阵地反复易手,双方拼杀惨烈,战场争夺陷入胶着。
彼时国民军虽处于一定劣势,但仍有坚持下去的可能。然而,国民军总指挥张之江属于温和派,又缺乏统御全军的威望与指挥大兵团作战的能力,因而面对强攻惊慌失措。另外,国民军将领对列强的间谍活动毫无防范,张之江住所隔壁便住着一个精通汉语的美国传教士,张家口还曾截获敌方两部秘密电台,日本特务松室孝良也长期在华北活动。因而,奉直联军得以通过列强间谍持续获取国民军的布防与调动情报,最终抓住漏洞攻破南口。
8月中旬,多伦被奉军攻占,国民军战线动摇。张之江等人仓促下令全线撤退。8月15日,国民军从南口向张家口、绥远方向退却,这场历时四个半月的南口大战正式落下帷幕。