GitHub clone이 느리거나 Docker 이미지와 npm 패키지 다운로드가 자주 끊기면 개발 흐름이 쉽게 중단됩니다. 문제는 단순히 “VPN 속도가 느리다”로 끝나지 않습니다. Git은 별도의 프록시 설정을 사용하고, Docker는 명령을 실행하는 셸이 아니라 Docker 데몬이 네트워크 요청을 처리하며, npm은 자체 레지스트리와 프록시 옵션을 따로 가집니다. 브라우저에서 웹페이지가 열린다는 사실만으로 개발 도구의 다운로드까지 정상이라고 판단할 수 없는 이유입니다.
이 글에서는 GitHub 저장소, Docker Hub 이미지, npm 패키지, 일반 API 요청, CI/CD 실행 환경을 각각 나누어 확인합니다. Windows와 macOS 공식 클라이언트, Linux 환경의 sing-box, Clash Verge와 같은 호환 클라이언트에서 공통으로 적용할 수 있는 원칙을 설명하고, 필요한 경우 HTTPS 프록시와 SOCKS5 프록시를 명시적으로 지정하는 방법도 함께 소개합니다. 목표는 모든 트래픽을 무조건 우회하는 것이 아니라, 개발 도구가 실제로 어떤 경로를 사용하는지 확인하고 필요한 요청에만 일관된 규칙을 적용하는 것입니다.
개발 환경에 맞는 프록시 구조 선택
가장 먼저 결정할 것은 전체 트래픽을 TUN 모드로 처리할지, 애플리케이션별로 프록시를 지정할지입니다. 시스템 프록시는 브라우저와 운영체제 설정을 따르는 프로그램에 간단하게 적용할 수 있지만, 터미널 도구와 백그라운드 서비스가 항상 이를 자동으로 읽는 것은 아닙니다. 반면 TUN 모드는 가상 네트워크 인터페이스를 통해 더 넓은 범위의 트래픽을 처리하지만, 관리자 권한과 DNS 설정, 다른 네트워크 도구와의 충돌을 고려해야 합니다.
90+
국가 범위
200+
회선 수
무제한
동시 기기
5개
지원 플랫폼
| 방식 | 적합한 상황 | 장점 | 주의할 점 |
|---|---|---|---|
| 시스템 프록시 | 브라우저와 간단한 데스크톱 도구 | 설정이 쉽고 필요할 때 빠르게 켜고 끌 수 있음 | Git, Docker 데몬, 일부 IDE가 설정을 자동으로 사용하지 않을 수 있음 |
| 애플리케이션 프록시 | Git, npm처럼 명시적 설정을 지원하는 도구 | 필요한 요청만 제어하고 원래 네트워크를 유지할 수 있음 | 도구별 설정 위치와 환경 변수가 서로 다름 |
| TUN 모드 | 프록시 설정이 없는 앱과 Docker 관련 요청 | 가상 인터페이스를 통해 더 넓은 트래픽을 처리할 수 있음 | DNS, 라우팅, 권한, 다른 VPN과의 충돌을 점검해야 함 |
| 수동 프로토콜 설정 | 서버와 포트, 인증 정보를 직접 관리하는 환경 | Shadowsocks, VMess, Trojan, Hysteria2, WireGuard 등 구성을 세밀하게 조정할 수 있음 | 주소와 포트뿐 아니라 전송 방식과 인증 매개변수도 정확해야 함 |
개발 노트북에서는 먼저 공식 Windows, macOS, Linux 클라이언트 또는 호환 클라이언트에 구독을 가져온 뒤, 브라우저와 터미널에서 기본 연결을 확인하는 순서가 안전합니다. Clash Verge나 sing-box를 사용하는 경우에도 구독을 추가한 뒤 활성 프로필, 프록시 포트, 모드와 규칙을 확인해야 합니다. Shadowrocket은 주로 iOS 환경에서 사용되므로 모바일에서 API나 Git 관련 작업을 할 때는 해당 앱의 전체 라우팅 또는 앱별 규칙이 실제 요청에 적용되는지 확인하세요.
- ✅ 처음에는 클라이언트 하나만 실행하고 시스템 프록시와 TUN 모드 중 필요한 방식만 선택하세요.
- ✅ 구독을 가져온 뒤 활성 노드, 로컬 HTTP 포트, SOCKS5 포트를 확인하세요.
- ✅ Git과 Docker는 운영체제 프록시와 별도로 동작할 수 있다고 가정하세요.
- ❌ 두 VPN 클라이언트의 TUN 모드와 DNS 가로채기를 동시에 켜지 마세요.
GitHub Git clone과 pull 최적화
GitHub 저장소는 HTTPS와 SSH라는 서로 다른 연결 방식을 사용합니다. HTTPS 저장소는 Git의 HTTP 프록시 설정을 직접 적용하기 쉽지만, SSH는 일반적인 HTTP 프록시 항목으로 처리되지 않습니다. SSH를 사용하면서 연결이 불안정하다면 VPN의 TUN 모드로 SSH 트래픽을 포함하거나, 별도의 SSH 프록시 점프 구성을 사용해야 합니다. 단순히 브라우저가 GitHub에 접속된다는 이유로 SSH clone도 같은 경로를 사용한다고 생각하면 안 됩니다.
먼저 현재 Git에 저장된 프록시 설정을 확인합니다. 프록시 주소와 포트는 사용 중인 클라이언트 화면에 표시된 로컬 리스닝 포트로 바꿔야 하며, 아래 값은 그대로 복사하는 고정 서버 정보가 아닙니다.
git config --global --get http.proxy
git config --global --get https.proxy
git config --global --get-regexp 'http\..*proxy'
# HTTPS 프록시를 사용하는 예시
git config --global http.proxy http://127.0.0.1:LOCAL_HTTP_PORT
git config --global https.proxy http://127.0.0.1:LOCAL_HTTP_PORT
# 설정을 제거할 때
git config --global --unset http.proxy
git config --global --unset https.proxy
HTTPS 프록시를 지정한 뒤에는 작은 공개 저장소를 대상으로 clone, fetch, pull을 각각 시험하는 것이 좋습니다. clone만 성공하고 fetch에서 실패한다면 인증, 원격 URL, 프록시 연결 유지 상태를 나누어 확인해야 합니다. 회사 네트워크나 보안 소프트웨어가 TLS 연결을 검사하는 환경에서는 인증서 오류가 발생할 수 있으므로, 문제를 피하려고 http.sslVerify false를 전역으로 적용하지 마세요. 이는 연결 문제를 숨기면서 TLS 검증을 약화할 수 있습니다.
SSH와 HTTPS를 구분하는 방법
원격 주소가 [email protected]:owner/repository.git 형태라면 SSH이고, https://github.com/owner/repository.git 형태라면 HTTPS입니다. SSH 연결은 보통 TCP 기반의 별도 경로를 사용하므로 Git의 HTTP 프록시 설정이 적용되지 않습니다. SSH를 계속 사용해야 한다면 먼저 TUN 모드에서 해당 트래픽이 규칙에 포함되는지 확인하고, 연결 로그에서 대상 호스트와 사용된 규칙을 확인하세요.
저장소가 크거나 여러 브랜치를 동시에 가져오는 경우에는 네트워크 경로뿐 아니라 저장소 구조도 영향을 줍니다. 전체 이력을 꼭 가져올 필요가 없는 자동화 작업이라면 얕은 clone을 검토할 수 있습니다. 다만 이는 VPN 속도를 높이는 설정이 아니라 전송해야 하는 Git 객체의 양을 줄이는 방법이며, 과거 커밋을 조사하거나 전체 이력이 필요한 작업에서는 적합하지 않습니다.
# 최신 상태만 필요한 임시 작업의 예시
git clone --depth 1 https://github.com/owner/repository.git
# 원격 주소와 현재 프록시 설정 확인
git remote -v
git config --global --list
Docker Hub와 컨테이너 레지스트리 설정
Docker에서 가장 흔한 실수는 셸의 HTTP_PROXY 변수를 설정하면 Docker 이미지 다운로드도 자동으로 해결될 것이라고 생각하는 것입니다. docker pull 요청은 일반적으로 Docker CLI가 아니라 Docker 데몬이 처리합니다. 따라서 Docker Desktop을 사용하는 Windows와 macOS에서는 Desktop의 엔진 및 프록시 설정을 확인해야 하고, Linux에서는 systemd로 실행되는 Docker 서비스에 프록시 환경을 전달해야 할 수 있습니다.
먼저 현재 상태를 확인합니다. 이미지 이름을 해석하지 못하는지, 레지스트리 접속이 시간 초과되는지, 인증 단계에서 실패하는지에 따라 원인이 달라집니다.
docker info
docker context ls
docker pull hello-world
Docker Desktop은 설정 화면의 네트워크 또는 프록시 관련 항목에서 수동 프록시를 지원하는지 확인하세요. 사용 중인 클라이언트가 제공하는 HTTP 프록시 주소를 입력할 때는 포트 번호를 정확히 확인해야 합니다. Docker Desktop의 네트워크 모드와 VPN 클라이언트의 TUN 모드를 동시에 변경하면 어느 계층에서 요청이 실패했는지 파악하기 어려워지므로, 한 번에 한 가지 설정만 바꾸고 다시 테스트하는 편이 좋습니다.
Linux의 Docker 엔진은 systemd 서비스에 프록시 환경을 전달하는 방식이 일반적입니다. 배포판과 설치 방식에 따라 경로가 다를 수 있으므로, 무작정 파일을 만들기보다 현재 서비스 이름과 설정 상태를 먼저 확인하세요.
systemctl status docker
systemctl show --property=Environment docker
# drop-in 디렉터리와 서비스 설정을 확인한 뒤 변경
sudo systemctl daemon-reload
sudo systemctl restart docker
# 데몬 재시작 후 확인
docker info
docker pull 이미지이름:태그
Docker Hub 외에 사설 레지스트리나 클라우드 레지스트리를 사용하는 경우에는 대상 도메인마다 규칙이 달라질 수 있습니다. 인증 서버, 이미지 레이어 서버, 토큰 발급 주소가 서로 다른 호스트를 사용할 수도 있으므로, 레지스트리 주소 하나만 허용하는 규칙으로 모든 요청이 해결된다고 단정하지 마세요. 컨테이너 내부에서 실행되는 애플리케이션의 프록시와 이미지를 내려받는 Docker 데몬의 프록시도 별개입니다.
npm 레지스트리와 패키지 다운로드
npm은 레지스트리 주소, HTTPS 프록시, 인증서, 환경 변수의 영향을 함께 받습니다. 먼저 현재 레지스트리와 프록시 값을 확인하세요. 프로젝트별 .npmrc와 사용자 전역 설정이 서로 다른 값을 가질 수 있으므로, 명령이 실행되는 디렉터리의 설정도 확인해야 합니다.
npm config get registry
npm config get proxy
npm config get https-proxy
npm config list
# HTTPS 프록시를 지정하는 예시
npm config set https-proxy http://127.0.0.1:LOCAL_HTTP_PORT
npm config set proxy http://127.0.0.1:LOCAL_HTTP_PORT
# 필요할 때 설정 제거
npm config delete proxy
npm config delete https-proxy
패키지 설치가 중간에 멈출 때는 레지스트리 연결과 패키지의 별도 다운로드를 구분해야 합니다. npm 패키지 메타데이터는 레지스트리에서 받지만, 일부 패키지는 설치 과정에서 별도의 바이너리나 소스 파일을 다운로드합니다. 레지스트리 요청만 프록시를 거쳐도 설치 스크립트가 사용하는 다른 호스트에서 실패할 수 있습니다. 이때는 npm 로그의 실제 요청 대상과 오류 유형을 확인하고, 필요한 도메인만 규칙에 추가하세요.
프로젝트에서 팀원마다 전역 프록시 설정이 달라지면 재현성이 떨어집니다. 개인 장비에서만 사용하는 프록시는 전역 설정으로 관리할 수 있지만, 프로젝트에 공유되는 .npmrc에는 개인 로컬 포트나 인증 정보가 들어가지 않도록 주의해야 합니다. 특히 프록시 사용자 이름과 비밀번호를 명령 기록, 저장소 파일, CI 로그에 남기지 마세요.
패키지 설치 실패를 분리 진단하기
npm config get registry로 예상한 레지스트리를 사용하고 있는지 확인합니다.- 프록시를 잠시 명시적으로 지정하고 동일한 패키지의 메타데이터 요청을 시험합니다.
- 메타데이터는 받아오지만 설치 단계에서 실패하면 패키지의 postinstall 또는 바이너리 다운로드를 별도로 확인합니다.
- 새 터미널을 열어 환경 변수와 npm 설정이 서로 충돌하지 않는지 확인합니다.
- 문제가 해결된 뒤에는 필요하지 않은 전역 프록시 설정을 제거하고 팀 문서에 재현 가능한 절차만 남깁니다.
- ✅ 레지스트리 주소와 프록시 주소를 먼저 출력해 현재 적용값을 확인하세요.
- ✅ npm 로그에서 실패한 호스트가 레지스트리인지 별도 다운로드 서버인지 구분하세요.
- ✅ 인증 정보가 포함된 프록시 URL을 저장소나 셸 기록에 남기지 마세요.
- ❌ 인증서 오류를 해결하려고 TLS 검증을 전역으로 끄지 마세요.
API 요청과 개발 도구 검증
개발 중 사용하는 API 클라이언트, IDE 확장, 언어별 패키지 도구는 시스템 프록시를 따르거나 독자적인 설정을 가질 수 있습니다. curl로 요청이 성공했다고 해서 Node.js, Python, IDE가 같은 프록시를 사용한다고 볼 수 없습니다. 반대로 브라우저에서 실패해도 터미널의 명시적 프록시 요청은 성공할 수 있습니다.
# 환경 변수 없이 명시적 HTTPS 프록시를 사용하는 예시
curl -I -x http://127.0.0.1:LOCAL_HTTP_PORT https://api.example.com
# 현재 셸에서만 적용하는 예시
export HTTPS_PROXY=http://127.0.0.1:LOCAL_HTTP_PORT
export HTTP_PROXY=http://127.0.0.1:LOCAL_HTTP_PORT
# 프록시 제외 대상 예시
export NO_PROXY=localhost,127.0.0.1,.local
Windows PowerShell에서는 환경 변수 문법이 다릅니다. 운영체제와 셸이 바뀌면 같은 이름의 변수가 실제 프로세스에 전달되는지 확인해야 합니다. 또한 localhost, 사설 네트워크, Docker 내부 주소는 프록시를 거치지 않아야 정상인 경우가 많습니다. 이런 주소까지 프록시로 보내면 로컬 개발 서버나 컨테이너 간 통신이 실패할 수 있습니다.
검증할 때는 한 번에 여러 요소를 바꾸지 마세요. 먼저 VPN 클라이언트에서 연결된 노드를 확인하고, 다음으로 로컬 프록시 포트에 연결되는지 확인한 뒤, 마지막으로 애플리케이션의 설정을 적용합니다. 요청 로그에 대상 호스트, 사용된规则 또는 모드, 연결 결과가 표시된다면 그 기록을 보관하세요. 이 과정은 “네트워크 경로 문제”와 “애플리케이션 인증 또는 API 자체 문제”를 구별하는 데 도움이 됩니다.
CI/CD 환경에서 안전하게 적용하기
로컬 컴퓨터에서 성공한 프록시 설정이 CI/CD에서도 자동으로 재현되는 것은 아닙니다. CI 러너는 별도의 네트워크에 있고, Docker-in-Docker 구조나 원격 Docker 데몬을 사용할 수도 있습니다. 이 경우 파이프라인 셸, 빌드 컨테이너, Docker 데몬이 각각 다른 네트워크 계층에 존재합니다. 어느 계층에 프록시를 적용할지 먼저 결정하지 않으면 빌드가 간헐적으로 성공하거나 특정 단계에서만 실패합니다.
CI 변수에는 일반적으로 HTTP_PROXY, HTTPS_PROXY, NO_PROXY와 같은 환경 변수를 사용할 수 있지만, 플랫폼마다 비밀 변수의 저장 방식과 로그 마스킹 정책이 다릅니다. 프록시 인증 정보는 코드에 직접 쓰지 말고 CI 제공자의 보호된 변수 또는 비밀 저장소를 사용하세요. 빌드 로그에 전체 환경 변수를 출력하는 디버그 명령도 제거해야 합니다.
Docker 이미지를 빌드하는 파이프라인에서는 Dockerfile의 RUN npm install과 러너가 실행하는 docker pull이 서로 다른 요청일 수 있습니다. 베이스 이미지를 가져오는 단계는 Docker 데몬이 처리하고, Dockerfile 내부의 패키지 설치는 빌드 컨테이너의 프로세스가 처리합니다. 따라서 데몬 프록시와 빌드 단계의 환경 변수를 각각 설계해야 합니다. 로컬 프록시의 127.0.0.1 주소를 CI 서버에 그대로 넣는 실수도 피하세요. CI에서 그 주소는 대개 러너 자신을 가리키며, 로컬 개발 컴퓨터의 프록시가 아닙니다.
마지막으로 프록시를 적용한 뒤에는 의도한 예외 목록을 점검합니다. 사내 Git 서버, 로컬 레지스트리, 데이터베이스, 컨테이너 네트워크 주소가 NO_PROXY에 포함되지 않으면 내부 통신이 불필요하게 외부 경로로 나갈 수 있습니다. 반대로 외부 레지스트리를 예외로 넣으면 VPN이나 프록시를 거치지 않아 원래 문제가 다시 나타날 수 있습니다.
- ✅ CI 러너, 빌드 컨테이너, Docker 데몬의 네트워크 계층을 분리해서 문서화하세요.
- ✅ 프록시 인증 정보는 보호된 CI 변수로 관리하고 로그에 출력하지 마세요.
- ✅
NO_PROXY에는 로컬 주소와 내부 서비스만 신중하게 추가하세요. - ❌ 개발 컴퓨터의 로컬 프록시 주소를 CI 설정에 그대로 복사하지 마세요.
개발 작업용 VPN은 가장 빠른 회선을 고르는 것보다 요청의 성격에 맞는 경로를 유지하는 일이 중요합니다. GitHub HTTPS는 Git 프록시를, SSH는 TUN 또는 별도 SSH 경로를, Docker는 데몬 설정을, npm은 레지스트리와 패키지 다운로드를 각각 확인해야 합니다. QhVPN은 Windows, macOS, iOS, Android, Linux를 지원하고 구독 링크를 호환 클라이언트에 가져올 수 있으며, 사용 환경에 따라 공식 클라이언트와 Clash Verge 또는 sing-box 같은 도구를 선택할 수 있습니다. 연결 문제가 생겼을 때는 노드 이름을 반복해서 바꾸기보다 설정 계층, 대상 도메인, 로그의 실패 지점을 순서대로 좁혀 보세요.