Here is my approach:
pts = {{0, 0}, {2, 1}, {4, 3}, {6, 1}};
paras = FoldList[Plus, 0, Normalize[(Norm /@ Differences[pts]), Total]] // N
mat = Outer[BernsteinBasis[3, #1, #2] &, Range[0, 3], paras] // Transpose;
ctrlpts = LinearSolve[mat, pts]
(* {{0., 0.}, {2.71043, -0.262717}, {3.94236, 6.32778}, {6., 1.}} *)
Graphics[{BezierCurve[ctrlpts], PointSize[Medium], Red, Point[pts]}]

Comparison with Interpolation[]
To show that the results of the Bézier curve interpolant and the built-in Interpolation[] are vastly different, I will use the following data:
pts1 = {{-1, 0}, {2, 1}, {4, 4}, {6, -3}};
mat1 = Outer[BernsteinBasis[3, #1, #2] &, Range[0, 3],
FoldList[Plus, 0.0,
Normalize[(Norm /@ Differences[pts1]), Total]]] // Transpose;
f = Interpolation[pts1];
Show[Plot[f[x], {x, -1, 6}],
Graphics[{BezierCurve[LinearSolve[mat1, pts1]],
PointSize[Medium], Red, Point[pts1]}],
PlotRange -> {Automatic, {-3, 6}}]

BezierCurveinstead ofInterpolation? – Szabolcs Sep 05 '16 at 10:53BezierCurve[pts]doesn't go through these four points. – Feyre Sep 05 '16 at 11:06