34-летний футболист выступал за грозненский «Ахмат» на позиции полузащитника с 2012 года. Олег Иванов провел 243 игры, отметившись 17 забитыми мячами и 30 передачами.
Олег Иванов с 2006 по 2007 год выступал за «Кубань», в составе которой провёл 57 матчей, в которых забил 9 голов в лиге. С января 2008 года — игрок футбольного клуба «Крылья Советов». С самарским клубом был подписан 4-летний контракт.
С 2011 — игрок «Ростова». После прихода в клуб Юрия Белоуса и Сергея Балахнина был, вместе с ещё шестью игроками, сначала выслан в дубль, а затем отлучён от тренировок команды. Ему перестали выплачивать заработную плату. Иванов был вынужден обратиться в суд.
24 декабря 2011 года стал игроком «Терека». Начиная с сезона 2012/13 являлся игроком основы и вице-капитаном. Осенью 2014 года согласился перейти в ЦСКА, но трансфер в итоге сорвался, а зимой 2014 года к нему проявляло интерес московское «Динамо».
14 мая 2008 года Олег Иванов получил свой первый вызов в национальную сборную: он был включён в список 25 футболистов, приглашённых главным тренером сборной России Гусом Хиддинком для подготовки к Евро-2008.
В окончательную заявку из 23 игроков Иванов, как и Александр Павленко, включён не был из-за перенасыщения средней линии, однако по согласованию с тренерским штабом «Крыльев Советов» остался в расположении сборной для участия в тренировочном процессе.
7 июня, в день начала турнира, Олег Иванов всё-таки был заявлен на Евро-2008 вместо основного нападающего сборной Павла Погребняка, получившего травму колена 28 мая в товарищеском матче с Сербией. На триумфальном для сборной России Евро Иванов не провел на поле ни минуты, но получил бронзовую медаль.
7 июня 2015 Иванов дебютировал в сборной в товарищеском матче против Белоруссии, выйдя на замену в начале второго тайма вместо Алана Дзагоева. В ноябре 2015 года в Москве основал футбольную академию для детей 4-12 лет.