Controlling a geared motor
You can use a potentiometer, but this will give you greatly reduced torque at lower speeds, and you'll probably need a pot with a high power rating.

You'll have much better results using PWM, increasing the duty cycle will increase the speed. The best implementation of this would be to use a microcontroller with a pot on an analogue input, and a MOSFET to power the motor via an output pin. Program the microcontroller to change the duty cycle depending on the value of the voltage divided by the pot.

You can use a switch to control the direction if you're controlling it manually, but if you want your microcontroller to automatically control direction then you'll need an H bridge.