這時,關中諸將見袁曹將要戰爭,皆中立觀望,曹操便遣使前往關中協助司隸校尉安撫韓遂、馬騰等,使其不致為患。並開始派遣謁者仆射到關中監鹽官,以市鹽錢購買耕牛,供回到生產線上的農民使用,這對於安定關中社會秩序也起了一定的作用。這樣,曹操就把一些不利因素轉變為有利因素。後來曹操從關中獲得一千餘匹軍馬,彌補了一部分騎兵不足的缺陷。
曹操在做了以上部署以後,於建安四年(199年)年底,親自率領大軍進駐重要戰略要地——官渡(今河南中牟北)。就在這時,發生了一件對曹操不利的事,就是劉備在徐州的叛變。劉備自投歸曹操後,曹操給他一個豫州牧的名義,一同駐在許都。這時,淮南軍閥袁術由於屢吃敗仗,力窮勢窘,打算經過徐州北上投奔袁紹,曹操派劉備前往截擊,袁術被阻南歸,劉備占據徐州叛曹,並與袁紹聯合。曹操派將前往攻打劉備,未能取勝。曹操留下部分兵力把守官渡,自己率領精銳騎兵前往攻打劉備。諸將恐袁紹乘機進攻,曹操說,“劉備,人傑也,今不擊,必為後患。袁紹雖有大誌,而見事遲,必不動也。”確定了目標之後,曹操率軍東行,很快就擊潰了劉備的軍隊,迫使劉備連妻子都扔掉,倉皇北上投奔袁紹。劉備手下親信大將關羽,也被曹操俘獲。曹操再回到官渡,前後還不到一個月的工夫。
曹操東征劉備,給袁紹造成的可乘之機,在袁紹集團中,並不是沒有人看到。袁紹的謀臣田豐就曾經勸他抓住這個戰機,襲取許都,但袁紹卻以幼子患病的理由不肯出擊。
田豐急得用手杖擊地說,在這個千載難逢的好機會麵前,我的主公袁紹卻以嬰兒之病放棄這個機會,真是可惜啊!更為奇怪的是,袁紹在曹操進攻劉備時不采取積極的行動,但當曹操打垮了劉備回軍官渡後,他卻召集部屬商議出兵的問題。田豐重申沮授前議,說:“操善用兵,變化無方,眾雖少,未可輕也,不如以久持之。將軍據山河之固,擁四州之眾,外結英雄,內修農戰,然後簡其精銳,分為奇兵,乘虛迭出,以擾河南,救右則擊其左,救左則擊其右,使敵疲於奔命,民不得安業;我未勞而彼已困,不及二年,可坐克也。今釋廟勝之策,而決成敗於一戰,若不如誌,悔無及也。”
袁紹對田豐的意見,不但不聽,反而認為“沮眾”,把他囚禁起來。沮授原來在袁紹幕府中是內為謀主,外監諸將的首要人物,這次也因諫阻出兵,違背了袁紹的意旨,郭圖等人又乘機進讒,說沮授權勢太大,繼續重用下去,會無法控製,引起了袁紹對沮授的懷疑,終於把沮授統率的軍隊分為三部分,讓他和郭圖、淳於瓊各統一軍,這就大大削減了沮授的職權。袁紹集團就在這種意見不一、矛盾重重的情況下,出動大軍南下進攻曹操了。
建安五年(200年)正月,袁紹首先向各州郡發布了一篇討伐曹操的檄文。二月,袁紹親自率領大軍由鄴城南下,進駐黎陽。袁紹向曹操進攻的第一步棋,就是派遣驍將顏良渡過黃河進攻白馬(今河南滑縣東),以便為主力渡河打下前進基地。曹操是要救援白馬的,但所使用的戰略,並不是派軍直奔白馬,而是聲東擊西,分散袁軍兵力。
曹操首先引兵到延津,裝出要渡河抄襲袁軍後路的樣子。袁紹忙分兵西上進行阻擊,曹操則率領輕騎迅速馳往白馬。在曹軍離白馬隻有十幾裏的時候,顏良才發覺,遂倉促應戰。曹操令張遼、關羽為先鋒,關羽望見顏良麾蓋,迅速衝進敵陣,刺死顏良,袁軍失去主將,登時潰散,於是曹軍勝利解救了白馬之圍。
曹操深知白馬孤城在袁紹優勢兵力的壓迫下,終究不能堅守,乃向官渡進行戰略轉移,令白馬居民和輜重一齊跟隨軍隊沿黃河南岸向西撤退。袁紹憑仗兵多勢眾,率領大軍繼續推進,沮授再次向袁紹進諫,勸他不可輕率冒進。袁紹不但不聽,還把沮授僅餘的部分軍隊交由郭圖帶領。
袁軍先頭部隊在離延津不遠的地方,趕上了曹軍。這時,曹操令部隊停止後撤,在南山下紮好營壘,派人登高瞭望。瞭望者報告袁軍大約有五六百騎來到。接著又報敵騎續有增加,步兵多得不可勝數。曹操吩咐不要再報告了,他要騎兵解鞍放馬,休息待命。這時,從白馬撤出的輜重還在路上,諸將擔心敵騎擄掠,建議連人馬帶輜重一齊進入營壘。荀攸認為現在正是利用輜重引誘敵人的時候,怎能移進營內呢!胸有成竹的曹操對荀攸的意見表示讚同。
袁紹騎將文醜和劉備帶領五六千騎先後到來,諸將催請曹操趕緊上馬迎戰。曹操按兵不動,過了一會兒,袁軍騎兵到來,見路上有那樣多的輜重,分外眼紅,爭先恐後地去搶劫,因而隊伍大亂,曹操乘隙下令衝擊,這時曹操身邊騎兵不滿六百人,但他們是以逸擊勞,故能一舉擊殺文醜。文醜和顏良都是袁軍名將,經過兩次戰役便被斬殺,大大提高了曹軍的士氣。