The basic technique involves two PPU registers. During vblank, after you've updated VRAM, write the X and Y positions of the upper left corner of the visible area to PPUSCROLL ($2005), and write the starting page (high order bit of X and Y) to bits 0 and 1 of PPUCTRL ($2000). This allows movement within a usually two-screen area, with horizontal and vertical wraparound if the camera goes out of bounds.
To scroll over a larger area than the two screens that are already in VRAM, you figure out what column or row of the nametable is just coming into view, and you write that to VRAM before you set the scroll.
EDIT: Beginner-level info added to
wiki page.