도커&쿠버네티스

[Docker] 도커 VPN 컨테이너로 다른 컨테이너 트래픽 라우팅하기 ( feat.NordVPN )

초보 & 뉴비 2025. 5. 30. 22:52

배경

이런저런 정보를 수집해서 텔레그램으로 노티를 쏴 주는 크롤러 + 봇이 있는데, 이 중 외국 사이트에서 수집하는 정보가 몇개 있었다.
갑자기 모니터링쪽에서 알람이 오지게 오길래 내용을 봤는데 알람 내용은 응답 속도가 꽤 느려졌다는 것..

이런 저런 시도를 해보니 컨트릭 락이 걸린 듯 하였다.
즉, 자기네 국가 IP가 아닌 외국에서 접속하면 속도 제한이 걸린다는 뜻

이런 저런 시도를 해보다가 크롬 익스텐션 무료 VPN을 통해 해당 국가로 연결하면 속도가 원래 속도까지는 아니지만 그래도 꽤 빨라진걸 체감할 수 있었다.

 

[ 여기서 고민 ]

-  정보 수집용 컨테이너는 여러개다

- 컨테이너 여러개에 대해 일일이 VPN을 연결하는건 크게 2가지 문제가 있다.

  1. 노가다 ( 컨테이너 n개면 n개만큼 세팅 )

  2. 접속 제한 ( 대부분의 VPN 서비스는 동시 접속 가능한 단말 수가 제한되어 있음 )

 

생각한 해결책은 다음과 같다.

- VPN 컨테이너를 하나 만든다.

-- 이 컨테이는 항상 외국과 연결되어 있다.

- 나머지 정보 수집용 컨테이너의 모든 트래픽을 위에서 만든 VPN 컨테이너로 라우팅 한다.

-- 그러면 마치 모든 컨테이너들이 해당 국가 IP를 사용하는 효과를 얻게 된다.

 

VPN을 무료 vs 유료 쓸지 고민하던 중 안전성이 중요했기에 비용을 투자하더라도 유료를 골랐고, 후기가 많고 평이 좋은 NordVPN 으로 결정했다.

 


NordVPN 토큰 발급

요새 대부분의 서비스들은 "ID:PW" 방식은 웹 페이지 로그인할 때만 사용하고 외부에서 해당 서비스를 이용할 때는 API나 토큰을 발급하는데 이는 NordVPN도 마찬가지였다.

 

https://my.nordaccount.com/dashboard/nordvpn

접속 후 하단의 Get Access token 클릭

이메일 인증 후 발급되는 토큰 기록

 

 

VPN 컨테이너 빌드 및 실행

Dockerfile

FROM ubuntu:24.04

RUN apt-get update && \
apt-get install -y --no-install-recommends wget apt-transport-https ca-certificates && \
    apt-get install -y --no-install-recommends wget apt-transport-https ca-certificates && \ 
    wget -qO /etc/apt/trusted.gpg.d/nordvpn_public.asc https://repo.nordvpn.com/gpg/nordvpn_public.asc && \
    echo "deb https://repo.nordvpn.com/deb/nordvpn/debian stable main" > /etc/apt/sources.list.d/nordvpn.list && \
    apt-get update && \
    apt-get install -y --no-install-recommends nordvpn && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ENTRYPOINT /etc/init.d/nordvpn start && sleep 5 && /bin/bash -c "$@"
CMD bash

빌드

docker build -t nord_vpn:latest .

 실행

docker run -it --hostname nord_bridge \
--sysctl net.ipv6.conf.all.disable_ipv6=0 \
--privileged \
--name nord_bridge nord_vpn:latest

방화벽 설정

- '실행' 단계에서 실행 된 컨테이너 내부에서 실행해야 한다.

- 컨테이너 실행 후 초기에는 방화벽 정책에 의해 그 어떠한 서버와도 통신할 수 없다.

-- 다시 말하면 NordVPN 로그인 조차 불가능하다는 뜻

-- 따라서 최소한의 NordVPN과 통신할 수 있는 정책은 필요하다.

update-alternatives --set iptables /usr/sbin/iptables-legacy
iptables -A OUTPUT -d api.nordvpn.com -j ACCEPT && iptables -A OUTPUT -d downloads.nordcdn.com -j ACCEPT

NordVPN 로그인

- '실행' 단계에서 실행 된 컨테이너 내부에서 실행해야 한다.

- 토큰 발급 단계에서 발급 받은 토큰을 사용한다.

nordvpn login --token token_goes_here

NordVPN 설정

- '실행' 단계에서 실행 된 컨테이너 내부에서 실행해야 한다.

nordvpn set autoconnect enable # 자동 연결 활성화
nordvpn set analytics disable # 통계 정보 제공하지 않음
nordvpn set killswitch enable # 킬 스위치 활성화
nordvpn c uk # 영국 연결

여기까지 문제 없이 실행되었으면 생성 된 컨테이너는  다른 컨테이너의 트래픽을 받아서 VPN 을 통해 처리하게 되는 역할을 한다.


다른 컨테이너 트래픽 라우팅 하기 ( 예시: 우분투 )

VPN 컨테이너를 만들어 놨으니 이제 다른 컨테이너의 트래픽을 라우팅 시켜야 하는데, 이는 간단하게  `-net` 옵션으로 해결할 수 있다.

docker run -it --net=container:nord_bridge -d --name ubuntu_vpn ubuntu

 


오류 해결

resolv.conf 권한 오류

루트 편집 허용

chattr -i resolv.conf

 

파일 권한 재설정

chmod 777 resolv.conf