Маршрутизація трафіку Docker-контейнера через VPN: покроковий гайд
Під час розробки парсерів, систем тестування локалізації або автоматичних скриптів скачування картографічних даних часто виникає потреба запустити окремий скрипт чи контейнер через VPN, не змінюючи при цьому мережеві налаштування всієї хост-машини.
Docker надає гнучкі можливості для налаштування мережі. У цьому посібнику ми розглянемо, як створити зв'язку в docker-compose.yml, де один контейнер гратиме роль VPN-шлюзу (за допомогою NordVPN клієнта), а інший контейнер (наприклад, з вашим скриптом) надсилатиме весь свій трафік через цей шлюз.
---
Концепція: Мережа типу service:vpn
У Docker замість створення окремого віртуального мережевого адаптера (bridge) для кожного контейнера, ми можемо вказати одному контейнеру використовувати мережевий стек іншого.
Схема роботи виглядає так:
- Контейнер
vpnпідключається до мережі NordVPN та створює інтерфейсtun0. - Контейнер
app(наприклад, ваш парсер на Node.js або Python) запускається з параметром мережіnetwork_mode: service:vpn. - Весь вихідний трафік контейнера
appавтоматично проходить через тунельvpnконтейнера.
---
Налаштування docker-compose.yml
Для реалізації цієї схеми ми скористаємося легковаговим контейнером OpenVPN або офіційним клієнтом, сумісним з NordVPN.
Створіть файл docker-compose.yml у робочій папці:
version: '3.8'
services:
vpn:
image: bubuntux/nordvpn:latest
container_name: nordvpn_gateway
cap_add:
- NET_ADMIN # Необхідно для створення VPN-інтерфейсу в ядрі
devices:
- /dev/net/tun:/dev/net/tun # Надає доступ до тунельного пристрою хоста
environment:
- USER=your_nordvpn_email@gmail.com
- PASS=your_nordvpn_password
- TECHNOLOGY=NordLynx # Використовуємо швидкісний протокол NordLynx
- CONNECT=Germany # Підключаємося до німецького сервера
restart: unless-stopped
app:
image: curlimages/curl:latest
container_name: app_client
network_mode: "service:vpn" # Весь трафік іде через контейнер vpn
depends_on:
- vpn
entrypoint: ["sh", "-c", "sleep 5 && curl https://ipinfo.io"]
> [!IMPORTANT]
> Зверніть увагу на параметр cap_add: - NET_ADMIN. Без нього контейнер не зможе змінювати таблицю маршрутизації та піднімати VPN-з'єднання всередині ізольованого середовища.
---
Перевірка роботи та запуск
Запустіть контейнери за допомогою команди:
docker compose up
Під час запуску ви побачите наступний лог:
- Контейнер
vpnавторизується в мережі NordVPN, вибирає оптимальний сервер у Німеччині та створює захищений тунель за протоколом NordLynx. - Контейнер
appочікує 5 секунд (поки підніметься з'єднання) та робить запитcurl https://ipinfo.io. - У консолі відобразиться JSON з інформацією про IP-адресу. Ви побачите, що країна запиту змінилася на
"DE"(Німеччина), а IP належить серверам NordVPN.
---
Як підключити власний додаток
Якщо ви хочете запустити власний скрипт на Python для збору геоданих, змініть опис сервісу app у docker-compose.yml:
app:
build: .
network_mode: "service:vpn"
depends_on:
- vpn
Ваш додаток може вільно користуватися будь-якими бібліотеками (наприклад, requests у Python або axios у Node.js). Весь зовнішній трафік буде автоматично зашифрований та спрямований через обраний VPN-вузол.
Це дозволяє легко автоматизувати завдання, такі як швидке скачування великих геоданих або мультирегіональне тестування ГІС-інфраструктури.
---
Керування портами (Порти через VPN)
Якщо ваш додаток має веб-інтерфейс (наприклад, ви запустили локальний веб-сервер у контейнері app на порту 3000), ви не зможете відкрити його через ports: - "3000:3000" у сервісі app.
Оскільки app використовує мережу vpn, усі порти повинні публікуватися в описі сервісу vpn:
services:
vpn:
image: bubuntux/nordvpn:latest
ports:
- "3000:3000" # Відкриваємо порт нашого додатка app
...
Це безпечно зв'яже порт 3000 на вашому хост-комп'ютері з контейнером app через мережевий міст VPN-шлюзу. Якщо ви хочете налаштувати захищений доступ до віддалених баз даних, прочитайте наш порівняльний огляд SSH тунелів проти VPN.
Routing Docker Container Traffic Through a VPN: Step-by-Step Guide
During the development of scrapers, location-testing engines, or automated geodata pipelines, developers often need to run a specific script or service inside a container routed through a VPN, without altering the network settings of the host operating system.
Docker offers robust networking capabilities. In this tutorial, we will write a docker-compose.yml config where a dedicated container acts as a VPN gateway (using a NordVPN client) and an application container routes all its outbound packets through this gateway.
---
The Core Concept: service:vpn Network Mode
In Docker, instead of assigning a virtual network bridge to every single container, you can instruct one container to share the network stack and interfaces of another.
Here is the operational workflow:
- The
vpncontainer connects to the NordVPN network, establishing atun0interface. - The
appcontainer (e.g., your Node.js scraper or Python script) starts withnetwork_mode: service:vpn. - All outbound packets from the
appcontainer are automatically encapsulated and routed through thevpntunnel.
---
Writing the docker-compose.yml Configuration
We will write a compose setup utilizing a lightweight Docker client configuration for NordVPN.
Create docker-compose.yml in your working folder:
version: '3.8'
services:
vpn:
image: bubuntux/nordvpn:latest
container_name: nordvpn_gateway
cap_add:
- NET_ADMIN # Required to modify network routing inside the kernel
devices:
- /dev/net/tun:/dev/net/tun # Grants access to the host's tunnel device
environment:
- USER=your_nordvpn_email@gmail.com
- PASS=your_nordvpn_password
- TECHNOLOGY=NordLynx # Use the high-speed NordLynx protocol
- CONNECT=Germany # Connect to Germany nodes
restart: unless-stopped
app:
image: curlimages/curl:latest
container_name: app_client
network_mode: "service:vpn" # All traffic flows through the vpn service
depends_on:
- vpn
entrypoint: ["sh", "-c", "sleep 5 && curl https://ipinfo.io"]
> [!IMPORTANT]
> The cap_add: - NET_ADMIN capability is essential. Without it, the container will fail to establish virtual routing tables, causing the network initialization to crash.
---
Launching and Verification
Start the stack with:
docker compose up
During initialization, check the output streams:
- The
vpncontainer logs in to NordVPN, establishes a connection to a node in Germany, and initializes a NordLynx tunnel. - The
appcontainer sleeps for 5 seconds (to allow the VPN handshake to complete) and runscurl https://ipinfo.io. - The console prints a JSON object showing that the public IP region is now
"DE"(Germany) and points to a NordVPN server.
---
Connecting Your Own Application
To deploy your own data scraper (e.g. written in Python), modify the app service config in your docker-compose.yml:
app:
build: .
network_mode: "service:vpn"
depends_on:
- vpn
Your script can execute arbitrary operations (e.g., calling standard libraries like requests or axios). All web traffic will automatically pass through the encrypted tunnel.
This config is ideal for operations like accelerating large geodata downloads or multi-region GIS API testing.
---
Publishing Container Ports
If your application exposes a web interface (e.g., running on port 3000 inside the app container), you cannot write ports: - "3000:3000" in the app service configuration.
Because the app container shares the vpn service's network namespace, all ports must be declared under the vpn service instead:
services:
vpn:
image: bubuntux/nordvpn:latest
ports:
- "3000:3000" # Expose the app port here
...
This maps port 3000 on your host machine to the application container via the shared namespace. For securing access to staging DB clusters, check out our comparison of SSH tunnels vs. VPNs.
🚀 Потрібен надійний VPN для розробки та DevOps?
🚀 Need a Reliable VPN for Dev & DevOps Workflows?
Отримайте максимальну знижку на NordVPN за промокодом 2026. Захистіть свої сервери Hetzner, бази PostGIS та прискорте завантаження ГІС-даних вже зараз.
Get the maximum developer discount on NordVPN for 2026. Hardened Hetzner VPS access, secure PostGIS tunnels, and high-speed geo-API routing.
Активувати знижку розробника Claim Your Developer Discount