Unmanned surface vehicle (USV) can navigate autonomously via the global navigation satellite system (GNSS). However, the traditional GNSS scalar tracking loop easily loses lock in low carrier-to-noise ratio (CNR) situations, such as signal occlusion and weak signals. Meanwhile, an increase in the carrier/code phase error leads to an increase in the measurement error of the navigation filter, which decreases the accuracy of the position estimation. To solve this problem, this paper proposes a carrier and code tracking structure based on a forward and backward Kalman filter to dynamically adjust the gain of the vector tracking loop. The carrier and code phase errors calculated by the loop discriminators were linearly transformed into pseudo-range rate and pseudo-range errors after filtering and smoothing, which were used as the measurements of the navigation filter. The signal CNR was used to adaptively adjust the measurement noise covariance matrix of the loop filters. The field tests used a commercial receiver’s navigation solution as the reference. In the stationary test, the proposed structure reduced the localization error by 44.3% compared with the traditional methods. In kinematic experiments, the proposed structure reduced the carrier and code phase errors in a harsh signal environment and improved the positioning accuracy at the source. The test results demonstrate that the proposed GNSS tracking method can provide a possible solution for the development of navigation systems for USV.