Сыновья Тараса Бульбы вернулись домой после учебы в Киевской духовной академии. Тарас решил, что его детям необходимо стать более зрелыми, участвуя в боях, и, не дав жене попрощаться с сыновьями, направился с ними в Запорожскую Сечь.
По пути Тарас погружался в воспоминания о своей юности и старых друзьях, в то время как его сыновья размышляли о дне, проведенном в Киеве. Тарас отправил Остапа и Андрия в академию, когда им исполнилось по двенадцать лет. Старший сын, Остап, часто убегал из учебного заведения и начал учиться только после того, как отец грозно наказал его.
Сравнительно с ним, Андрий учился легче и с большим энтузиазмом.
Через несколько дней путешествия Тарас с сыновьями достиг Запорожской Сечи — ключевого укрепления казаков, расположенного на острове посреди Днепра, почти не охранявшегося. Сечь окружала предместье, где жили мастера и торговцы.
За неделю Остап и Андрий освоились в Запорожской Сечи. Хотя они почти не занимались военными упражнениями, молодёжь училась воевать в боевых условиях. Приходить в Сечь мог любой православный. Казачье войско делилось на курени, которыми командовали куренные атаманы, а главой всей Сечи был кошевой атаман. Законы в Сечи были немногочисленными, строго наказывались лишь воровство, неуплата долгов и убийства.
Тарас испытывал недовольство по поводу мирной жизни и стремился к тому, чтобы его сыновья проявили себя в битвах. Однако кошевой атаман подписал перемирие с турецким султаном и отказался его нарушать. Тогда Тарас уговорил казаков сменить атамана, и новым руководителем стал его старый друг.
Новый кошевой нашел способ обойти мирный договор с Турцией: вместо того чтобы вести в атаку всю Сечь, он решил незаметно отпустить молодёжь. Как раз в это время в Сечь прибыли казаки с Западной Украины, которые сообщили о бунте в регионе, подавленном польскими панами. Они рассказали, что православные церкви отданы еврейским арендаторам, а католические священники командуют православными христианами. Возмущенные казаки начали погром среди евреев. Тарас, вспомнив о Яэнкеле, который когда-то выкупал его брата из турецкого плена, вмешался и спас его.
После погрома запорожцы собрались в поход против Польши. Войско Запорожской Сечи, двигаясь по юго-западной территории Польши, оставляло за собой опустошение и дикие избиения. Остап стал решительным и хладнокровным воином, тогда как Андрий проявил безрассудную смелость. Тарас радовался, что его сыновья стали зрелыми. Он полагал, что Остап будет «хорошим полковником», а Андрия считал «хорошим воином», хоть и немного хуже старшего.
Казачье войско вскоре подошло к городу Дубно и начало его осаду. Однажды ночью Андрия разбудила изможденная женщина. Он узнал в ней татарку, служанку панночки, которая выбралась из города по подземному ходу. Она рассказала, что в Дубно царит ужасный голод: семья воеводы не ела уже два дня, и панночка, заметив Андрия на стене, отправила служанку с просьбой о помощи.
Не раздумывая, Андрий отправился за татаркой в осажденный город. Проходя мимо отца, он заметил, что Тарас проснулся и, увидев рядом с сыном женщину, произнес: «Не доведут тебя бабы к добру!». Андрий испугался, но Тарас снова заснул.
Увидев панночку, которая превратилась в красавицу, Андрий влюбился ещё сильнее. Охваченный страстью, он решил принять католическую веру и остаться с любимой. Панночка сомневалась в его намерениях и считала, что он не способен отказаться от всего ради неё, ведь он был запорожцем — её врагом. Тем не менее, красота юного казака произвела на неё впечатление. Влюбленные обменялись поцелуем в тот самый момент, когда польское войско подошло к Дубно.
Когда поляки захватили Дубно, казаки, охранявшие ворота, были пьяны в стельку и спали, не выставив часовых. В итоге поляки захватили весь курень вместе с атаманом. Кошевой, осознав, что запасов, привезённых поляками, надолго не хватит, распорядился готовиться к борьбе.
Тарас стал искать Андрия, опасаясь, что тот мог попасть в плен. Янкель, побывавший в Дубно, сообщил Тарасу, что Андрий отрекся от Родины, собирается жениться на дочери воеводы и будет сражаться на стороне поляков. Сначала Тарас не верил Янкелю, но вскоре вспомнил, как легко Андрий поддаётся влиянию женщин.
Скоро началась битва. Остап быстро проявил себя, и его выбрали куренным атаманом вместо убитого. Он сразу повёл курень в бой, который длился до вечера.
На утро пришла новость о том, что татары ограбили Сечь и увели оставшихся казаков. Кошевой предложил отправиться на выручку товарищам, но Тарас возразил, напомнив о пленниках в Дубно, которые также нуждаются в помощи. В результате войско запорожцев разделилось: одна часть отправилась преследовать татар, а другая осталась под Дубно.
Командиром оставшегося войска выбрали Тараса. Видя, что казаки унывают после расставания с товарищами, он раскупорил бочки со старым вином и предложил выпить за православную веру, за Сечь и за славу, которую они оставят в наследие потомкам. Когда чаши опустели, казаки задумались о своей судьбе, предвкушая возможную гибель.
В Дубно выяснили, что казацкое войско сократилось вдвое, и решили вступить в бой. Тарас подготовился к сражению и произнес вдохновляющую речь о казацком братстве — Запорожской Сечи.
Бой начался, и на этот раз казакам было нелегко. Благодаря скрытым в засаде свежим силам запорожцы почти одержали победу, но тут из городских ворот вырвался конный полк. Во главе с Андрием, который напрямик ринулся в бой, думая лишь о том, как впечатлить панночку. Тарас издал приказ заманить его в лес, где и застрелил своего сына. Андрий не осмелился поднять руку на отца, и перед смертью его мысли были о прекрасной девушке.
Поляки начали наступление, окружив казаков. Остапа взяли в плен, а Тарас получил тяжелое ранение. Его верный друг вытащил его из сражения. За его голову поляки назначили значительное вознаграждение, и друг с трудом довёз его до Сечи в живом состоянии.
Тарас выздоровел, но теперь его больше не интересовали походы в Турцию — он чувствовал глубокую тоску по Остапу. Тарас нашёл Янкеля, напомнил о том, что спас ему жизнь, и потребовал отвезти его в Варшаву, где содержали Остапа. Еврею удалось договориться за большую сумму.
Янкель вёз Тараса в Варшаву, укрывая его под кучей кирпичей. Вместе с соотечественниками он попытался подкупить стражника в тюрьме, чтобы Тарас смог встретиться с сыном или, возможно, вызволить его. Однако план провалился: подкупленный стражник не вышел на смену. Тарас, переодетый в заморского графа, пришёл в тюрьму, но во время спора со стражником выдал себя и едва избежал ареста. К сожалению, сына он так и не увидел.
Тогда Тарас отправился на площадь, где собирались казнить всех пленных казаков, и смешался с толпой горожан. Остап перенёс все пытки без единого стона, и лишь в момент последней, смертной пытки, он позвал отца.
Он не хотел слышать рыданий и скорби слабой матери или безумных воплей жены; ему хотелось увидеть крепкого мужчину, который бы утешил его разумным словом в последний час. Тарас откликнулся из толпы, но его начали искать и не смогли найти.
Казнь пленных казаков возмутила казаков, и на Польшу двинулось многотысячное войско. Однако вскоре поляки заключили мир с запорожцами. Тарас не поверил обещаниям польских властей и вместе с полком продолжил мстить полякам за обоих своих сыновей.
Польскому гетману было поручено поймать Тараса, и он настиг казаков на берегу Днестра. После четырёхдневного сражения силы казаков истощились, и Тарас решил, что пришло время уходить. Ему почти удалось это сделать, но он выронил свою любимую трубку и, нагнувшись, чтобы поднять её, был схвачен. Гетман велел сжечь его живьём.
Тарас не думал о смерти, а о своих казаках. Он заметил у берега лодки и закричал, чтобы запорожцы захватили их. Его товарищи услышали призыв, добрались до лодок и отплыли вниз по Днестру. Перед смертью Тарас успел порадоваться удаче своих соратников.