How to Create a SOCKS5 Proxy with VPN Tunneling Using Docker

This guide shows you how to set up a SOCKS5 proxy that routes all traffic through a VPN connection using Docker Compose. This setup provides an extra layer of privacy for your internet traffic.

Prerequisites

  • Docker and Docker Compose installed

  • A VPN subscription (this example uses NordVPN but works with other providers)

Step 1: Create Project Structure

First, create a directory for your project and a subdirectory for your VPN configuration:

mkdir -p proxy-vpn/vpn1
cd proxy-vpn

Step 2: Create the Docker Compose File

Create a file named docker-compose.yml in the project directory and paste the following configuration:

services:
  vpn1:
    image: dperson/openvpn-client:latest
    container_name: vpn-client1
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun
    restart: unless-stopped
    volumes:
      - ./vpn1:/vpn
    environment:
      - PUID=1000
      - PGID=1000
    command: ["-f", '""', "-a", "${VPN_USERNAME};${VPN_PASSWORD}"]
    networks:
      - vpn_network1
    ports:
      - "1080:1080"
    dns:
      - 8.8.8.8
      - 8.8.4.4
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=1

  socks-proxy1:
    image: serjs/go-socks5-proxy:latest
    container_name: socks5-proxy1
    restart: unless-stopped
    environment:
      - PROXY_USER=${SOCKS_USER}
      - PROXY_PASSWORD=${SOCKS_PASSWORD}
    network_mode: "service:vpn1"
    depends_on:
      - vpn1
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=1

networks:
  vpn_network1:
    driver: bridge

Step 3: Set Up VPN Configuration

  1. Download your VPN configuration file from your provider (for NordVPN, visit https://nordvpn.com/blog/nordvpn-config-files/)

  2. Save the configuration file as vpn.conf in the vpn1 directory

Here's a sample of what a NordVPN configuration looks like (replace SERVER-IP with the server of your choice - pick one from the configs you downloaded)

client
dev tun
proto udp
remote <SERVER-IP> 1194
resolv-retry infinite
remote-random
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
ping 15
ping-restart 0
ping-timer-rem
reneg-sec 0
comp-lzo no
verify-x509-name CN=es137.nordvpn.com

remote-cert-tls server

auth-user-pass
verb 3
pull
fast-io
cipher AES-256-CBC
auth SHA512
<ca>
-----BEGIN CERTIFICATE-----
MIIFCjCCAvKgAwIBAgIBATANBgkqhkiG9w0BAQ0FADA5MQswCQYDVQQGEwJQQTEQ
MA4GA1UEChMHTm9yZFZQTjEYMBYGA1UEAxMPTm9yZFZQTiBSb290IENBMB4XDTE2
MDEwMTAwMDAwMFoXDTM1MTIzMTIzNTk1OVowOTELMAkGA1UEBhMCUEExEDAOBgNV
BAoTB05vcmRWUE4xGDAWBgNVBAMTD05vcmRWUE4gUm9vdCBDQTCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBAMkr/BYhyo0F2upsIMXwC6QvkZps3NN2/eQF
kfQIS1gql0aejsKsEnmY0Kaon8uZCTXPsRH1gQNgg5D2gixdd1mJUvV3dE3y9FJr
XMoDkXdCGBodvKJyU6lcfEVF6/UxHcbBguZK9UtRHS9eJYm3rpL/5huQMCppX7kU
eQ8dpCwd3iKITqwd1ZudDqsWaU0vqzC2H55IyaZ/5/TnCk31Q1UP6BksbbuRcwOV
skEDsm6YoWDnn/IIzGOYnFJRzQH5jTz3j1QBvRIuQuBuvUkfhx1FEwhwZigrcxXu
MP+QgM54kezgziJUaZcOM2zF3lvrwMvXDMfNeIoJABv9ljw969xQ8czQCU5lMVmA
37ltv5Ec9U5hZuwk/9QO1Z+d/r6Jx0mlurS8gnCAKJgwa3kyZw6e4FZ8mYL4vpRR
hPdvRTWCMJkeB4yBHyhxUmTRgJHm6YR3D6hcFAc9cQcTEl/I60tMdz33G6m0O42s
Qt/+AR3YCY/RusWVBJB/qNS94EtNtj8iaebCQW1jHAhvGmFILVR9lzD0EzWKHkvy
WEjmUVRgCDd6Ne3eFRNS73gdv/C3l5boYySeu4exkEYVxVRn8DhCxs0MnkMHWFK6
MyzXCCn+JnWFDYPfDKHvpff/kLDobtPBf+Lbch5wQy9quY27xaj0XwLyjOltpiST
LWae/Q4vAgMBAAGjHTAbMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqG
SIb3DQEBDQUAA4ICAQC9fUL2sZPxIN2mD32VeNySTgZlCEdVmlq471o/bDMP4B8g
nQesFRtXY2ZCjs50Jm73B2LViL9qlREmI6vE5IC8IsRBJSV4ce1WYxyXro5rmVg/
k6a10rlsbK/eg//GHoJxDdXDOokLUSnxt7gk3QKpX6eCdh67p0PuWm/7WUJQxH2S
DxsT9vB/iZriTIEe/ILoOQF0Aqp7AgNCcLcLAmbxXQkXYCCSB35Vp06u+eTWjG0/
pyS5V14stGtw+fA0DJp5ZJV4eqJ5LqxMlYvEZ/qKTEdoCeaXv2QEmN6dVqjDoTAo
k0t5u4YRXzEVCfXAC3ocplNdtCA72wjFJcSbfif4BSC8bDACTXtnPC7nD0VndZLp
+RiNLeiENhk0oTC+UVdSc+n2nJOzkCK0vYu0Ads4JGIB7g8IB3z2t9ICmsWrgnhd
NdcOe15BincrGA8avQ1cWXsfIKEjbrnEuEk9b5jel6NfHtPKoHc9mDpRdNPISeVa
wDBM1mJChneHt59Nh8Gah74+TM1jBsw4fhJPvoc7Atcg740JErb904mZfkIEmojC
VPhBHVQ9LHBAdM8qFI2kRK0IynOmAZhexlP/aT/kpEsEPyaZQlnBn3An1CRz8h0S
PApL8PytggYKeQmRhl499+6jLxcZ2IegLfqq41dzIjwHwTMplg+1pKIOVojpWA==
-----END CERTIFICATE-----
</ca>
key-direction 1
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
e685bdaf659a25a200e2b9e39e51ff03
0fc72cf1ce07232bd8b2be5e6c670143
f51e937e670eee09d4f2ea5a6e4e6996
5db852c275351b86fc4ca892d78ae002
d6f70d029bd79c4d1c26cf14e9588033
cf639f8a74809f29f72b9d58f9b8f5fe
fc7938eade40e9fed6cb92184abb2cc1
0eb1a296df243b251df0643d53724cdb
5a92a1d6cb817804c4a9319b57d53be5
80815bcfcb2df55018cc83fc43bc7ff8
2d51f9b88364776ee9d12fc85cc7ea5b
9741c4f598c485316db066d52db4540e
212e1518a9bd4828219e24b20d88f598
a196c9de96012090e333519ae18d3509
9427e7b372d348d352dc4c85e18cd4b9
3f8a56ddb2e64eb67adfc9b337157ff4
-----END OpenVPN Static key V1-----
</tls-auth>

Step 4: Create Environment Variables File

Create a .env file in the project directory with your credentials:

VPN_USERNAME=username
VPN_PASSWORD=password
#SOCKS_USER=proxyuser # leave commented for no credentials in the socks proxy
#SOCKS_PASSWORD=proxypass # leave commented for no credentials in the socks proxy

Step 5: Start the Services

docker-compose up -d

Step 6: Test the Connection

curl --socks5 localhost:1080 ifconfig.me

This will display your VPN's IP address rather than your actual IP.

Using Your SOCKS5 Proxy

You can now configure applications to use your SOCKS5 proxy with these details:

  • Proxy host: localhost (or your server's IP)

  • Port: 1080

  • Username: proxyuser (or whatever you set in the .env file) (if you set this in .env - otherwise empty)

  • Password: proxypass (or whatever you set in the .env file) (if you set this in .env - otherwise empty)

0
Subscribe to my newsletter

Read articles from Georgios Komninos directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Georgios Komninos
Georgios Komninos

I am a software engineer based in Cyprus with over 20 years of experience in the industry. My background in Computer Science has led me to work with PHP, Python, and more recently, with a focus on Golang. Originally from Greece, my career has taken me across Europe, and I now call Cyprus home. I've attended numerous conferences, continually expanding my knowledge and network. Recently, I started blogging to share my insights and experiences with the tech community. I'm passionate about engaging with fellow developers and contributing to the field through my writing and future projects. Thank you for visiting my blog.