본관은 진주(晉州). 자는 망여(望如), 호는 월주(月洲). 소건(蘇建)의 증손으로, 할아버지는 소억선(蘇億善)이고, 아버지는 동지중추부사(同知中樞府事) 소동명(蘇東鳴)이다. 송시열(宋時烈)의 문인이다.
1652년(효종 3) 사마시에 합격하여 진사가 되고, 1660년(현종 1) 식년 문과에 장원, 성균관전적(成均館典籍)을 거쳐 1663년 사간원정언·사헌부지평이 되었다. 직언 때문에 권신의 비위에 거슬려 외직으로 전전하였다. 1672년 나주목사로 있을 때 진휼책을 잘한 공로로 수상하였다.
1675년(숙종 1) 제주목사, 1681년에 강릉부사·의주부윤·함경북도병마절도사·동래부사·공홍도관찰사(公洪道觀察使)·공홍도수군절도사 등을 거쳐 1688년 평안도병마절도사가 되었다. 이듬해 기사환국으로 서인이 실각되고 남인이 정권을 장악하자 벼슬을 버리고 낙향, 울분 끝에 병사하였다.
중요 외직(外職)을 역임할 때마다 남인들로부터 “권신들에 부탁하여 여러 번 고을을 다스리며 탐학(貪虐)을 자행하였다.”는 탄핵을 받아 파직되었다.
서인집권하에서도 대간으로부터 처신이 근신하지 못하여 공의(公議)에 버림받았고, 향촌에 있을 때는 무단(武斷), 수령 재임 때에는 탐관오리라는 비난을 받았다. 시문은 『월주집(月洲集)』에 수록되어 전하고 있다.