SSD Nodes Learn 8GB RAM — $66/বছর
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-01

Docker-এ wg-easy ব্যবহার করে WireGuard সেটআপ করার নিয়ম

Docker Compose দিয়ে wg-easy সেটআপ করার পূর্ণাঙ্গ গাইড। NET_ADMIN ক্যাপাবিলিটি, প্রয়োজনীয় sysctl সেটিংস এবং QR কোড দিয়ে ক্লায়েন্ট কানেক্ট করার সঠিক পদ্ধতি এখানে বিস্তারিত দেওয়া হলো।

আপনি যা তৈরি করছেন

wg-easy হলো একটি ওয়েব ইন্টারফেসসহ WireGuard, যা একটি Docker কন্টেইনার হিসেবে চলে। এটি আপনার জন্য WireGuard ইন্টারফেস পরিচালনা করে এবং ক্লায়েন্ট তৈরির জন্য একটি ব্রাউজার UI যুক্ত করে। আপনার তৈরি করা প্রতিটি ক্লায়েন্ট একটি কনফিগ ফাইল এবং একটি QR কোড পায়, তাই একটি ফোন স্ক্রিনের দিকে ক্যামেরা তাক করে সহজেই VPN-এ যুক্ত হতে পারে।

টানেলটি মূলত সাধারণ WireGuard। কার্নেল মডিউল প্যাকেটগুলো স্থানান্তর করে, তাই এর থ্রুপুট হাতে তৈরি সেটআপের মতোই থাকে। আপনি যা অর্জন করেন তা হলো ক্লায়েন্ট লাইফসাইকেল: SSH-এর মাধ্যমে কনফিগ ফাইল এডিট না করেই পিয়ার যোগ করা, নিষ্ক্রিয় করা এবং মুছে ফেলা। আপনি যা ত্যাগ করেন তা হলো সেই কনফিগের ওপর সরাসরি নিয়ন্ত্রণ, যা VPS-এ ম্যানুয়াল WireGuard সেটআপ-এর বিষয়।

আপনার একটি পাবলিক IPv4 অ্যাড্রেসসহ KVM VPS, Compose প্লাগইনসহ Docker Engine এবং root অ্যাক্সেস প্রয়োজন। কন্টেইনার ভার্চুয়ালাইজেশন যা হোস্ট কার্নেল শেয়ার করে, যেমন OpenVZ বা LXC, সাধারণত WireGuard মডিউল লোড করতে পারে না এবং কন্টেইনারটি ইন্টারফেস চালু করতে ব্যর্থ হবে।

সংস্করণ 15 সেটিংসকে এনভায়রনমেন্ট থেকে সরিয়ে নিয়েছে

আপনি যে গাইডগুলো পাবেন তার বেশিরভাগই wg-easy 14-এর জন্য লেখা, যেখানে আপনি WG_HOST-কে আপনার সার্ভার অ্যাড্রেসে এবং PASSWORD_HASH-কে অ্যাডমিন পাসওয়ার্ডের bcrypt হ্যাশে সেট করতেন, উভয়ই এনভায়রনমেন্ট ভেরিয়েবল হিসেবে। সংস্করণ 15 একটি নতুন সংস্করণ। অফিসিয়াল মাইগ্রেশন নোটে স্পষ্টভাবে বলা হয়েছে যে v15, v14-এর মতো একই এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে না এবং সেগুলোর বেশিরভাগই ওয়েব UI-এর অ্যাডমিন প্যানেলে স্থানান্তরিত হয়েছে।

তাই WG_HOST এবং PASSWORD_HASH এখন আর কোনো কাজ করে না। আপনি যদি একটি পুরনো compose ফাইল কপি করেন, তবে কন্টেইনারটি চালু হবে, সেই লাইনগুলোকে উপেক্ষা করবে এবং তারপর আপনাকে ব্রাউজারে একটি অ্যাডমিন অ্যাকাউন্ট তৈরি করতে বলবে। এটি কোনো বাগ নয়। এটি নতুন সেটআপ প্রক্রিয়া।

2026 সালের জুলাই মাস অনুযায়ী, পিন করার জন্য প্রধান ট্যাগ হলো 15latest ব্যবহার করার পরিবর্তে মেজর ভার্সন পিন করুন, কারণ একটি মেজর আপগ্রেড অন-ডিস্ক কনফিগারেশন ফরম্যাট পরিবর্তন করে এবং এটি সহজে রোল ব্যাক করা যাবে না।

The compose file

স্ট্যাকটির জন্য একটি ডিরেক্টরি তৈরি করুন এবং এতে অফিসিয়াল compose ফাইলটি লিখুন। এটি আপস্ট্রিম ফাইল, যা অপরিবর্তিত রাখা হয়েছে।

sudo mkdir -p /etc/docker/containers/wg-easy
sudo curl -o /etc/docker/containers/wg-easy/docker-compose.yml \
  https://raw.githubusercontent.com/wg-easy/wg-easy/master/docker-compose.yml

ফাইলটির বিষয়বস্তু দেখতে এরকম:

volumes:
  etc_wireguard:

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:15
    container_name: wg-easy
    networks:
      wg:
        ipv4_address: 10.42.42.42
        ipv6_address: fdcc:ad94:bacf:61a3::2a
    volumes:
      - etc_wireguard:/etc/wireguard
      - /lib/modules:/lib/modules:ro
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv6.conf.all.forwarding=1
      - net.ipv6.conf.default.forwarding=1

networks:
  wg:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: 10.42.42.0/24
        - subnet: fdcc:ad94:bacf:61a3::/64

etc_wireguard হলো একটি নেমড ভলিউম যা সার্ভার কি (key) এবং আপনার তৈরি করা প্রতিটি ক্লায়েন্টকে ধারণ করে। এই ভলিউমটির ব্যাকআপ রাখুন, অন্যথায় রিবিল্ড করার সময় আপনার সমস্ত পিয়ার (peer) মুছে যাবে। আপনি যদি এই ফাইলগুলো হোস্ট ফাইলসিস্টেমে দেখতে চান, তবে এটিকে বাইন্ড মাউন্ট (bind mount) দিয়ে পরিবর্তন করুন। এটি করার আগে বাইন্ড মাউন্ট এবং নেমড ভলিউমের মধ্যে পার্থক্য পড়ুন, কারণ পারমিশন বা অনুমতির আচরণ ভিন্ন হয়।

NET_ADMIN, SYS_MODULE এবং sysctl-এর প্রয়োজনীয়তা

ডিফল্টভাবে একটি কন্টেইনারকে নেটওয়ার্ক স্ট্যাক স্পর্শ করার অনুমতি দেওয়া হয় না এবং এই প্রতিটি লাইন একটি নির্দিষ্ট বাধা দূর করে।

NET_ADMIN কন্টেইনারকে wg0 ইন্টারফেস তৈরি করতে, এতে একটি অ্যাড্রেস অ্যাসাইন করতে এবং রাউট লিখতে দেয়। এটি ছাড়া কন্টেইনারটি চালু হওয়ার পর ইন্টারফেসটি সক্রিয় করার সময় বন্ধ হয়ে যায়, কারণ ip link add wg0 type wireguard তখন Operation not permitted রিটার্ন করে।

SYS_MODULE এবং এর সাথে রিড-অনলি /lib/modules মাউন্ট কন্টেইনারকে WireGuard কার্নেল মডিউল লোড করতে দেয়, যদি হোস্ট এটি আগে থেকে লোড না করে থাকে। মডিউলটি হোস্ট কার্নেলে থাকে, ইমেজের ভেতরে নয়, আর এই কারণেই হোস্ট ডিরেক্টরিটিকে দৃশ্যমান হতে হয়। আধুনিক কার্নেলে মডিউলটি সাধারণত বিল্ট-ইন থাকে এবং আপনি হোস্ট মেশিনে sudo modprobe wireguard && echo ok কমান্ড দিয়ে তা নিশ্চিত করতে পারেন।

net.ipv4.ip_forward=1 কার্নেলকে এমন প্যাকেট ফরওয়ার্ড করতে বাধ্য করে যা সরাসরি এই বক্সের উদ্দেশ্যে পাঠানো হয়নি। এটি ছাড়া ক্লায়েন্ট সংযুক্ত হয়, হ্যান্ডশেক সফল হয়, কিন্তু ইন্টারনেটের উদ্দেশ্যে পাঠানো প্রতিটি প্যাকেট ড্রপ হয়ে যায়। ফলে ping 1.1.1.1 টাইম-আউট হয়, যদিও VPN সংযুক্ত দেখা যায়।

net.ipv4.conf.all.src_valid_mark=1 বিষয়টি অনেককে অবাক করে। WireGuard তার নিজস্ব আউটগোয়িং প্যাকেটগুলোকে মার্ক করে রাখে যাতে সেগুলো পুনরায় টানেলের ভেতর রাউট না হয়। স্ট্রিক্ট রিভার্স পাথ ফিল্টারিং এমন প্যাকেট দেখে যার সোর্স অ্যাড্রেস প্রত্যাশিত রাউটের সাথে মেলে না এবং সেগুলোকে ড্রপ করে দেয়। এই sysctl কার্নেলকে মার্ক করা প্যাকেটগুলো গ্রহণ করার নির্দেশ দেয়, যা একটি পূর্ণাঙ্গ টানেলকে ভেঙে পড়া থেকে রক্ষা করে।

এটি চালু করুন এবং অ্যাডমিন অ্যাকাউন্ট তৈরি করুন

cd /etc/docker/containers/wg-easy
sudo docker compose up -d
sudo docker compose logs -f

docker compose up এবং docker compose down ব্যবহার করুন, start এবং stop নয়। আপস্ট্রিম সতর্ক করে যে, ভিন্ন সেটিংসে তৈরি করা কন্টেইনারে start ব্যবহার করলে নেটওয়ার্ক অসামঞ্জস্যপূর্ণ অবস্থায় থেকে যায়। রিবুটের পর যদি আপনি স্ট্যাকটি পুনরায় পেতে চান, তবে restart: unless-stopped ইতিমধ্যেই তা নিশ্চিত করে, এবং compose সার্ভিসগুলোর বুট আচরণ ব্যাখ্যা করে যে এই পলিসিটি কী প্রতিশ্রুতি দেয় এবং কী দেয় না।

ওয়েব UI টি TCP 51821 পোর্টে লিসেন করে। প্রথমবার ভিজিট করলে এটি একটি সেটআপ পেজ দেখাবে যেখানে আপনি অ্যাডমিন অ্যাকাউন্ট তৈরি করবেন এবং হোস্ট অ্যাড্রেস নিশ্চিত করবেন যা ক্লায়েন্টরা সার্ভারে পৌঁছানোর জন্য ব্যবহার করবে। সেই হোস্ট অ্যাড্রেসটি প্রতিটি ক্লায়েন্ট কনফিগারেশনের Endpoint লাইনে যুক্ত হয়, তাই এটি অবশ্যই VPS-এর পাবলিক IP বা DNS নাম হতে হবে। যদি এটি ভুল হয়, তবে আপনার ফোনে দেওয়া QR কোডটি এমন কোথাও নির্দেশ করবে যেখানে পৌঁছানো সম্ভব নয় এবং হ্যান্ডশেক কখনোই সম্পন্ন হবে না।

এই পোর্ট সম্পর্কে আরও একটি বিষয়: INSECURE=true সেট না করা পর্যন্ত wg-easy 15 সাধারণ HTTP সংযোগ গ্রহণ করে না। একটি আনট্রাস্টেড সার্টিফিকেট দিয়ে HTTPS-এর মাধ্যমে এটিতে পৌঁছানো, অথবা এর সামনে একটি রিভার্স প্রক্সিতে TLS টার্মিনেট করা—উভয়ই গ্রহণযোগ্য। ডিফল্ট সেটিংসে http://-এর মাধ্যমে এটিতে পৌঁছানো সম্ভব নয়।

UI পোর্ট ইন্টারনেটে প্রকাশ করবেন না

আপনার compose ফাইলটি প্রতিটি ইন্টারফেসে 51821 পোর্টটি প্রকাশ করে। এটি এমন একটি বক্সের লগইন পেজ যা আপনার ট্রাফিক রাউট করতে পারে, তাই এটি বিশ্বের সবার জন্য উন্মুক্ত থাকা উচিত নয়। Docker-এ কোনো পোর্ট প্রকাশ করলে তা DOCKER চেইনে নিয়ম লিখে দেয়, যা ufw-এর আগেই মূল্যায়ন করা হয়। ফলে, ufw deny নিয়ম দিয়ে এটি বন্ধ করা যায় না। এই বিষয়টি আলাদাভাবে বোঝা জরুরি এবং কেন Docker-এর প্রকাশিত পোর্টগুলো ufw উপেক্ষা করে নিবন্ধে এটি বিস্তারিত আলোচনা করা হয়েছে।

এর সহজ সমাধান হলো UI-কে লুপব্যাক (loopback) ইন্টারফেসের সাথে বাইন্ড করা এবং SSH টানেলের মাধ্যমে এটি অ্যাক্সেস করা:

    ports:
      - "51820:51820/udp"
      - "127.0.0.1:51821:51821/tcp"
    environment:
      - INSECURE=true

এরপর আপনার ল্যাপটপ থেকে নিচের কমান্ডটি চালান:

ssh -L 51821:127.0.0.1:51821 youruser@your.server.address

আপনার ল্যাপটপের ব্রাউজারে http://127.0.0.1:51821 ওপেন করুন। ট্রাফিকটি SSH দ্বারা এনক্রিপ্ট করা থাকে, পোর্টটি অন্য কাউকে সাড়া দেয় না এবং INSECURE=true এখানে নিরাপদ থাকে কারণ সাধারণ HTTP হপটি কখনোই লুপব্যাক ইন্টারফেসের বাইরে যায় না।

UDP 51820 পোর্ট ওপেন করুন এবং উভয় ফায়ারওয়াল পরীক্ষা করুন

WireGuard-এর জন্য ইন্টারনেট থেকে UDP 51820 পোর্টে সংযোগ থাকা প্রয়োজন। Docker এই পোর্টটি পাবলিশ করলেও, অনেক প্রোভাইডার VPS-এর সামনে একটি আলাদা নেটওয়ার্ক ফায়ারওয়াল রাখে যা সম্পর্কে Docker অবগত নয়। উভয় স্থানেই পোর্টটি ওপেন করুন। আপনি যদি ufw দিয়ে হোস্ট ফায়ারওয়াল ম্যানেজ করেন, তবে হাতে nftables লেখার চেয়ে VPS-এর জন্য প্রয়োজনীয় প্রাথমিক ufw রুলস অনুসরণ করা সহজ।

কন্টেইনারটি প্রকৃতপক্ষে লিসেন করছে কি না তা পরীক্ষা করুন:

sudo ss -ulnp | grep 51820

আপনি একটি লিসেনিং UDP সকেট দেখতে পাবেন। ওই লাইনে কিছু না থাকলে বুঝতে হবে কন্টেইনারটি ইন্টারফেস চালু করতে পারেনি, এবং sudo docker compose logs wg-easy কমান্ডটি এর কারণ জানিয়ে দেবে।

একটি ক্লায়েন্ট তৈরি করুন এবং ফোনে স্ক্যান করুন

UI-তে, একটি ক্লায়েন্ট তৈরি করুন এবং এটিকে এমন একটি নাম দিন যা আপনি পরে চিনতে পারবেন, যেমন এটি যে ডিভাইসের সাথে সম্পর্কিত তার নাম। wg-easy পরবর্তী খালি টানেল ঠিকানা বরাদ্দ করে এবং আপনার জন্য কি পেয়ার (key pair) তৈরি করে। প্রতিটি ক্লায়েন্ট সারিতে একটি QR কোড এবং একটি ডাউনলোডযোগ্য .conf ফাইল থাকে।

ফোনে অফিসিয়াল WireGuard অ্যাপটি ইনস্টল করুন, QR কোড থেকে একটি টানেল যোগ করার বিকল্পটি বেছে নিন এবং আপনার স্ক্রিনে থাকা কোডটির দিকে ক্যামেরা তাক করুন। আপনার টাইপ করা নামসহ টানেলটি প্রদর্শিত হবে। এটি চালু করুন, এবং UI-তে ক্লায়েন্ট সারিটি ট্রান্সফার কাউন্টার এবং সাম্প্রতিক হ্যান্ডশেক টাইম দেখাতে শুরু করবে।

একটি ক্লায়েন্ট যা চালু করার পরেও কোনো হ্যান্ডশেক দেখায় না, সেটি সার্ভারে পৌঁছাতে পারছে না। এটি UDP 51820 পোর্টের সমস্যার দিকে নির্দেশ করে, যা হয় প্রোভাইডার ফায়ারওয়ালে অথবা কনফিগারেশনে থাকা এন্ডপয়েন্ট ঠিকানায় হতে পারে। একটি ক্লায়েন্ট যা হ্যান্ডশেক দেখাচ্ছে কিন্তু ইন্টারনেট কাজ করছে না, সেটি ফরওয়ার্ডিং বা DNS সংক্রান্ত সমস্যার দিকে নির্দেশ করে।

ডেস্কটপে, .conf ফাইলটি ডাউনলোড করুন এবং এটি পুনরায় টাইপ করার পরিবর্তে WireGuard ক্লায়েন্টে ইমপোর্ট করুন। সেই ফাইলে থাকা প্রাইভেট কি (private key) একবারই তৈরি হয় এবং একবারই দেখানো হয়। ফাইলটিকে আপনি যেভাবে একটি SSH প্রাইভেট কি-এর সাথে আচরণ করেন, সেভাবেই ব্যবহার করুন।

কখন UI-এর সীমাবদ্ধতা অতিক্রম করবেন

আপনার সহকর্মীরা যখন মানুষ এবং ফোন ব্যবহারকারী হন, তখন wg-easy একটি উপযুক্ত টুল। কনফিগারেশন ফাইল এডিট করার চেয়ে UI ব্যবহার করা দ্রুত এবং হারিয়ে যাওয়া ফোনের অ্যাক্সেস বাতিল করা একটি ক্লিকেই সম্ভব।

UI-তে নেই এমন কোনো ফিচার প্রয়োজন হলে আপনি এর সীমাবদ্ধতার সম্মুখীন হবেন। সাইট-টু-সাইট রাউটিং, যেখানে কোনো পিয়ারের AllowedIPs একটি একক অ্যাড্রেসের পরিবর্তে পুরো একটি রিমোট সাবনেট কভার করে, সেটি সাধারণত প্রথম বাধা হিসেবে দেখা দেয়। এরপর আসে পার-পিয়ার রাউটিং রুলসহ স্প্লিট টানেল অথবা আপনার প্রোভিশনিং টুলের মাধ্যমে তৈরি করা কনফিগারেশন। সেই পর্যায়ে হাতে লেখা সেটআপ কঠিন নয়, বরং এটি ভিন্ন একটি পদ্ধতি মাত্র, এবং সাধারণ WireGuard গাইড একই টানেলকে wg0.conf থেকে তৈরি করার প্রক্রিয়া দেখায়। আপনি যদি কন্ট্রোল প্লেন চালানো পুরোপুরি বন্ধ করতে চান, তবে WireGuard বনাম Tailscale নিবন্ধটি ম্যানেজড অপশন সম্পর্কে ধারণা দেবে।

যদি WireGuard-এর চেয়ে উপরের compose সিনট্যাক্স আপনার কাছে অপরিচিত মনে হয়, তবে VPS-এ Docker Compose-এর মৌলিক বিষয়সমূহ ফাইল ফরম্যাট এবং দৈনন্দিন কমান্ডগুলো ব্যাখ্যা করে।

FAQ

কেন wg-easy আমার WG_HOST এবং PASSWORD_HASH উপেক্ষা করে?

এই ভেরিয়েবলগুলো wg-easy 14-এর অংশ। সংস্করণ 15 একটি নতুন সংস্করণ, যেখানে আপস্ট্রিম ডেভেলপাররা প্রায় সমস্ত কনফিগারেশন ওয়েব UI-এর অ্যাডমিন প্যানেলে সরিয়ে নিয়েছেন। কন্টেইনারটি এই ভেরিয়েবলগুলো পড়ে না, তাই এটি স্বাভাবিকভাবে চালু হয় এবং প্রথমবার ভিজিট করার সময় আপনাকে একটি অ্যাডমিন অ্যাকাউন্ট তৈরি করতে বলে। সেই সেটআপ পেজেই ক্লায়েন্ট-ফেসিং হোস্ট অ্যাড্রেস সেট করুন।

আমার কার্নেলে যদি ইতিমধ্যে WireGuard থাকে, তবে কি আমার SYS_MODULE প্রয়োজন?

না। SYS_MODULE এবং /lib/modules মাউন্টটি এই কারণে থাকে যাতে হোস্ট মেশিনে মডিউলটি না থাকলে কন্টেইনার তা লোড করতে পারে। যে হোস্টে sudo modprobe wireguard ইতিমধ্যে সফল হয়, সেখানে এই ক্যাপাবিলিটিটি অব্যবহৃত থাকে। এটি সরিয়ে ফেলা একটি ভালো নিরাপত্তা পদক্ষেপ, এবং উভয় ক্ষেত্রেই NET_ADMIN প্রয়োজন।

ক্লায়েন্ট কানেক্ট হচ্ছে কিন্তু ইন্টারনেট নেই। সমস্যা কোথায়?

হ্যান্ডশেক হওয়ার পরেও ট্রাফিক না থাকার অর্থ প্রায় সবসময়ই ফরোয়ার্ডিং সংক্রান্ত সমস্যা। নিশ্চিত করুন যে net.ipv4.ip_forward=1 এবং net.ipv4.conf.all.src_valid_mark=1 আপনার compose ফাইলে আছে, কারণ হাতে এডিট করার সময় অনেক সময় এগুলো বাদ পড়ে যায়। যদি ফরোয়ার্ডিং চালু থাকে, তবে ক্লায়েন্ট যে DNS সার্ভারটি পেয়েছে তা পরীক্ষা করুন। যে টানেল সমস্ত ট্রাফিক VPN-এর মাধ্যমে পাঠায় কিন্তু এমন একটি DNS সার্ভার ব্যবহার করে যা এখন আর নাগালের মধ্যে নেই, তা ব্রাউজারে অচল সংযোগের মতো দেখায়।

আমি কীভাবে আমার ক্লায়েন্টদের ব্যাকআপ নেব?

সবকিছু etc_wireguard নামক ভলিউমের একটি wg0.json ফাইলে থাকে। UI-তে একটি ব্যাকআপ বাটনও আছে যা একই ডেটা এক্সপোর্ট করে। যেকোনো আপগ্রেডের আগে সেই ফাইলটি সার্ভারের বাইরে কোথাও কপি করে রাখুন। নতুন কন্টেইনারে সেটআপ করার সময় ফাইলটি আপলোড করে রিস্টোর করা যায়।

আমি কি রিভার্স প্রক্সির পেছনে wg-easy চালাতে পারি?

হ্যাঁ। প্রক্সিকে TCP 51821-এর সামনে রাখুন, সেখানে TLS টার্মিনেট করুন এবং কন্টেইনারে INSECURE=true সেট করুন যাতে এটি প্রক্সি থেকে আসা প্লেইন HTTP হপ গ্রহণ করতে পারে। UDP 51820 সরাসরি পাবলিশ করে রাখুন, কারণ VPN ট্রাফিক UDP এবং তা HTTP প্রক্সির মধ্য দিয়ে যায় না।