Developer network problems are easy to misdiagnose. A slow Git clone, a Docker image that stalls during a layer download, and an npm install that repeatedly times out may look like the same connection failure, but they can have different causes: the route to the service, DNS resolution, a proxy that covers one application but not another, a package registry limit, or a busy remote server. A VPN can help when the network path is the bottleneck, but it cannot remove limits imposed by GitHub, Docker Hub, npm, pip, or a CI provider.
This guide explains how to route development traffic without disrupting local work, where to configure common command-line tools, and how to isolate connection problems before changing settings. The examples focus on GitHub, Docker Hub, npm, and pip. Exact configuration options vary by operating system, VPN client, shell, and tool version, so treat the commands as patterns and check the documentation for your installed versions.
Map the Traffic Before Changing Settings
Start by identifying which application makes the request and what network path it uses. A browser may follow the operating system proxy, while a terminal program may use its own proxy variables. A Docker client may send requests to a Docker daemon that runs separately, and that daemon may not inherit the terminal’s proxy settings. On some systems, a VPN client’s system-wide tunnel covers all of these processes; in other configurations, only selected applications or destinations use the tunnel.
4
Common developer services
3
Useful checks: route, DNS, and tool
Think of a request as passing through several decision points: the application, the operating system or local proxy, the VPN client’s routing rules, the selected route, and the destination service. A failure at any point can produce a similar timeout message. For example, a successful browser test does not prove that Git uses the same proxy, and a successful Git request does not prove that the Docker daemon can reach a registry.
- GitHub: Git can use HTTPS or SSH. These are different connection methods, and each may be affected by a different proxy or firewall rule.
- Docker Hub: Image pulls are commonly performed by the Docker daemon, not directly by the shell process that runs
docker pull. - npm: The npm client contacts a registry and may also retrieve package archives from separate hosts referenced by package metadata.
- pip: pip contacts the configured package index and may retrieve distributions from a different host or mirror.
Before troubleshooting, record which command fails, whether it fails on the same network without the VPN, and whether it fails in a browser or only in the command-line tool. Avoid changing the VPN mode, DNS settings, tool proxy configuration, and package registry all at once. Changing one variable at a time makes it much easier to identify the cause and restore a known-good setup.
Choose a Routing Mode for Development
For everyday development, rule-based routing is often a practical starting point. It can send selected external services through the VPN while leaving local addresses, development servers, and ordinary regional services on the direct connection. The exact rules depend on the client’s capabilities and configuration format. Avoid assuming that a rule for a website’s main domain also covers every hostname used for downloads, authentication, APIs, or package files.
Global routing sends a broader range of traffic through the selected route. It can be useful as a temporary diagnostic: if a request works in global mode but not in rule mode, the issue may be a missing or conflicting routing rule. It can also help when several related domains are involved and the complete set is not obvious. However, global mode may change access to local network devices, internal development environments, and services that expect a direct connection. Treat it as a test, not an automatic permanent fix.
Direct routing can be appropriate for local services, private package mirrors, or internal company systems that should not be sent through an external route. A split-tunneling rule should be specific enough to avoid sending unrelated traffic the wrong way, but broad enough to cover the actual service endpoints. When a package manager follows redirects or downloads files from a content delivery network, inspect the failing host rather than relying only on the name of the registry.
Keep Local Development Local
Development workflows often depend on loopback addresses such as localhost and 127.0.0.1, private network addresses, local containers, and services exposed by a test environment. These should normally remain reachable according to the local setup. If enabling a VPN breaks access to a local web server or a containerized database, check the client’s LAN bypass, local-address, and DNS rules before changing application configuration.
On laptops, the active network can change when moving between home, office, and mobile connections. A route or DNS response that worked on one network may not work on another. If the problem starts after switching networks, reconnect the VPN and retest the specific command before editing project-level settings. Keep proxy variables temporary when diagnosing so they do not accidentally affect later work in another network environment.
VPN protocols also differ in how they establish and maintain the encrypted connection. WireGuard is a modern VPN protocol; Shadowsocks, VMess, Trojan, and Hysteria2 are used by compatible proxy clients and services, with different transport and configuration characteristics. Protocol choice alone cannot identify the cause of a slow package download. First verify that the client is connected, that the intended route is selected, and that the application is using it.
Configure and Test the Workflow
Use a controlled sequence rather than applying several proxy settings at once. First confirm that the VPN client is connected and that its routing mode is understood. Then test the failing service with the same application and protocol used in normal work. If your client supports a system proxy, TUN mode, or per-application routing, note which one is active: a system proxy and a network-level tunnel are not interchangeable, and command-line tools may behave differently under each.
- Check the connection path. Confirm the selected node and routing mode in the client. If needed, use the site’s IP Check to verify the public exit seen by a web request. Remember that this does not prove that a separate daemon or command-line process follows the same path.
- Test DNS and reachability. Resolve the hostname used by the failing tool, then test the same service from the same machine. Compare results with and without the VPN only if it is safe and permitted on your network. A name-resolution failure points to a different layer than a connection timeout after resolution.
- Check the application’s proxy configuration. Inspect shell variables such as
HTTP_PROXY,HTTPS_PROXY, andNO_PROXY, along with the tool’s own settings. Use the syntax expected by the application, and avoid leaving credentials in shell history or shared logs. - Test one service at a time. Try a Git operation, a Docker image pull, or a package-manager request separately. Record whether the failure is a DNS error, connection timeout, authentication response, rate-limit response, or an error returned by the remote service.
- Revert temporary changes. Remove diagnostic proxy variables and restore the intended routing mode. Confirm that local development services and ordinary browsing still behave as expected.
For Git, determine whether the repository remote uses HTTPS or SSH before troubleshooting. HTTPS requests may use Git’s proxy configuration or the environment inherited by the process. SSH uses a different connection path and may be restricted by a network policy even when HTTPS works. Check the remote with git remote -v, then test the same transport that the project actually uses. Do not switch a team repository’s transport without checking its access policy and credential setup.
For npm and pip, inspect the configured registry or package index before adding a proxy. A project may intentionally use a private registry, and replacing it with a public source can break dependency resolution or expose package names. If a package manager supports a temporary command-line option, use it for diagnosis rather than writing credentials into a committed project file. For persistent settings, follow the tool’s current documentation and keep secrets outside source control.
Docker needs special attention because the daemon may have a separate network environment from the command-line client. If web pages and Git work but docker pull does not, inspect the daemon’s network and proxy configuration for your operating system and installation method. Restarting or reconfiguring the daemon may affect running containers, so plan the change and consult the relevant Docker documentation. Do not assume that exporting a proxy variable in the current terminal configures the daemon.
Separate Network Problems from Service Limits
Messages from a tool provide clues, but they do not always identify the root cause. A DNS lookup failure suggests that the hostname was not resolved. A connection timeout can indicate a route, firewall, proxy, or remote availability problem. A TLS or certificate error may relate to an incorrect system clock, an intercepting proxy, or a certificate chain issue. Authentication errors point toward credentials or access policy, while an explicit rate-limit response is not evidence that the VPN route is slow.
Compare the same request across controlled conditions. If the browser and command line both fail for the same host, investigate the route, DNS, and service status. If the browser works but the tool fails, focus on the tool’s proxy handling, daemon separation, authentication, or registry configuration. If only one package fails while other packages install, check the package metadata, selected version, source host, and package availability before changing the VPN.
Package downloads may involve more than one endpoint. A registry can provide metadata while the actual archive comes from a storage host or content delivery network. A rule that covers the registry’s primary hostname may therefore be incomplete. Inspect verbose output from the package manager, identify the hostname that fails, and add or correct routing only after confirming that the destination belongs to the expected package source.
Remote services can also impose their own limits, return errors during maintenance, or throttle repeated requests. A VPN cannot guarantee a faster response from a busy registry or bypass the service’s access rules. When a service returns an explicit limit or authentication error, follow its documented policies, check account permissions, and avoid repeatedly retrying in a way that could worsen the restriction.
- ✅ Confirm the failing process and hostname before changing the VPN route.
- ✅ Compare browser, terminal, and daemon behavior instead of assuming they share one proxy.
- ✅ Keep private registries, local services, and credentials under the project’s established policies.
- ❌ Do not treat every timeout as proof that a particular node or protocol is faulty.
- ❌ Do not replace a project’s package source just to test whether a download becomes faster.
- ❌ Do not expose proxy credentials, subscription links, or build secrets in logs.
Handle CI Runners and Team Setups
CI networking is a separate environment from a developer laptop. A hosted runner may have its own outbound access rules, DNS behavior, ephemeral filesystem, and proxy policy. A self-hosted runner may sit behind a corporate firewall or use a shared network configuration. Before introducing a VPN into a pipeline, confirm that the runner provider and your organization permit the setup, and determine which job steps need the route.
Prefer narrowly scoped configuration. If only dependency retrieval needs a proxy, do not route unrelated build, deployment, or test traffic through it without a clear reason. Store credentials in the CI platform’s secret-management facility, restrict which jobs can read them, and avoid printing complete environment variables. Do not place private keys, access tokens, or VPN subscription URLs in repository files or container images.
Reproducibility matters as much as connectivity. Keep the package source, lockfiles, and build configuration consistent across local and CI environments. If a build succeeds only when a developer’s personal proxy settings are present, document the required network assumptions and provide a safe team-managed configuration. For a self-hosted runner, distinguish host-level routing from container-level routing: a job container may have different DNS or proxy settings from the machine running the agent.
When diagnosing an intermittent CI failure, compare the failing hostname and error category across runs rather than changing all runner settings. A DNS error, a remote rate-limit response, and an expired credential require different remedies. Preserve enough sanitized output to identify the stage that failed, but remove tokens, internal hostnames when sensitive, and other environment details that should not be shared.