배경
이런저런 정보를 수집해서 텔레그램으로 노티를 쏴 주는 크롤러 + 봇이 있는데, 이 중 외국 사이트에서 수집하는 정보가 몇개 있었다.
갑자기 모니터링쪽에서 알람이 오지게 오길래 내용을 봤는데 알람 내용은 응답 속도가 꽤 느려졌다는 것..
이런 저런 시도를 해보니 컨트릭 락이 걸린 듯 하였다.
즉, 자기네 국가 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