SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-13

Ubuntu VPS-এ কীভাবে একটি .onion সাইট হোস্ট করবেন

Ubuntu-তে tor এবং nginx ব্যবহার করে v3 onion সার্ভিস সেটআপ করার পদ্ধতি জানুন। লুপব্যাক অ্যাড্রেসে বাইন্ড করে কীভাবে আপনার পাবলিক IP লিক হওয়া থেকে রক্ষা করবেন তা এখানে দেখুন।

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

একটি onion site হলো একটি সাধারণ ওয়েব সার্ভার যা শুধুমাত্র Tor নেটওয়ার্কের মাধ্যমে সাড়া দেয়। tor ইনস্টল করুন, /etc/tor/torrc-এ দুটি লাইন যোগ করুন, tor আপনার জন্য যে ঠিকানাটি তৈরি করেছে তা পড়ুন, এবং তারপর nginx-কে 127.0.0.1-এ bind করুন যাতে public IP-তে কোনো সাড়া না পাওয়া যায়। ইনস্টলেশনের অংশটি সম্পন্ন করতে দশ মিনিট সময় লাগে। এই গাইডের বাকি অংশটি হলো লিক বা তথ্য ফাঁসের তালিকা, কারণ একটি onion site সাধারণত তখনই ব্যর্থ হয় যখন এর নিজস্ব কনফিগারেশন সরাসরি অপারেটরের দিকে নির্দেশ করে।

Tor-এর যাত্রা শুরু হয়েছিল "the onion router" হিসেবে, এবং একটি onion service হলো এমন একটি সার্ভিস যা শুধুমাত্র এর মাধ্যমেই অ্যাক্সেস করা যায়। একটি version 3 ঠিকানা হলো 56টি ক্যারেক্টার এবং তার পরে .onion, এবং এই ক্যারেক্টারগুলো হলো সার্ভিসটির ed25519 পাবলিক কি, সাথে একটি চেকসাম এবং একটি ভার্সন বাইট, যা base32-এ এনকোড করা। Version 2 ঠিকানাগুলো (16টি ক্যারেক্টার) 2021 সালে নেটওয়ার্ক থেকে সরিয়ে ফেলা হয়েছে, তাই বর্তমানে আপনি যা তৈরি করবেন তা সবই v3। ঠিকানাটি নিজেই একটি কি (key), যার দুটি ফলাফল রয়েছে। সংযোগটি কোনো certificate authority ছাড়াই এন্ড-টু-এন্ড এনক্রিপ্টেড এবং অথেন্টিকেটেড থাকে, এবং কি ফাইলটি হারিয়ে ফেলার অর্থ হলো ঠিকানাটি চিরতরে হারিয়ে ফেলা।

আপনার সার্ভার কখনোই কোনো ইনবাউন্ড সংযোগ গ্রহণ করে না। Tor কিছু রিলেকে ইন্ট্রোডাকশন পয়েন্ট হিসেবে বেছে নেয়, ডিরেক্টরি সার্ভারে একটি সাইন করা ডেসক্রিপ্টর আপলোড করে, এবং ভিজিটর যে রেন্ডেভউ রিলে বেছে নিয়েছে সেখানে প্রতিটি ভিজিটরের সাথে দেখা করে। এই সংযোগগুলোর প্রতিটিই আপনার বক্স থেকে আউটবাউন্ড। এখানে খোলার মতো কোনো পোর্ট নেই এবং প্রকাশ করার মতো কোনো DNS রেকর্ডও নেই।

Tor Project repository থেকে Tor ইনস্টল করা

Ubuntu-এর universe repository-তে একটি tor প্যাকেজ থাকে, তবে এটি সেই সংস্করণের কাছাকাছি থাকে যা রিলিজটি ফ্রিজ হওয়ার সময় বর্তমান ছিল। Tor Project-এর নিজস্ব repository বর্তমান stable রিলিজটি ট্র্যাক করে। আপনার আইপি অ্যাড্রেস গোপন রাখার জন্য যে সফটওয়্যারটি কাজ করে, তার জন্য এই সংস্করণটিই আপনার প্রয়োজন।

sudo apt update
sudo apt install -y apt-transport-https gnupg wget
KEYURL=https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc
wget -qO- "$KEYURL" | gpg --dearmor | sudo tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null

repository এন্ট্রিটি deb822 ফরম্যাট ব্যবহার করে এবং Suites অবশ্যই আপনার Ubuntu কোডনেম হতে হবে। এটি টাইপ করার পরিবর্তে /etc/os-release থেকে পড়ে নিন, কারণ ভুল কোডনেম দিলে এমন একটি repository যুক্ত হবে যা সঠিকভাবে resolve হলেও আপনার রিলিজের জন্য কোনো প্যাকেজ খুঁজে পাবে না।

. /etc/os-release
sudo tee /etc/apt/sources.list.d/tor.sources >/dev/null <<EOF
Types: deb deb-src
URIs: https://deb.torproject.org/torproject.org/
Suites: $VERSION_CODENAME
Components: main
Signed-By: /usr/share/keyrings/deb.torproject.org-keyring.gpg
EOF
sudo apt update
sudo apt install -y tor deb.torproject.org-keyring

deb.torproject.org-keyring প্যাকেজটি signing key-কে সবসময় আপ-টু-ডেট রাখে, যাতে এক বছর পরে key rotation-এর কারণে apt update ভেঙে না যায়। Tor চালু হয়েছে কি না এবং নেটওয়ার্কে যুক্ত হয়েছে কি না তা পরীক্ষা করুন:

tor --version
sudo journalctl -u tor@default -n 20

journal-এর শেষে Bootstrapped 100% (done): Done থাকা উচিত। যদি Tor Bootstrapped 10%-এ আটকে থাকে, তবে এর কোনো outbound পথ নেই। তাই আপনার প্রোভাইডারের নেটওয়ার্ক ফায়ারওয়াল এবং আপনার নিজস্ব egress রুলগুলো পরীক্ষা করুন: sudo ufw status verbose-এ ডিফল্ট হিসেবে allow (outgoing) দেখানো উচিত।

এখান থেকে দুটি নাম গুরুত্বপূর্ণ। প্যাকেজটি debian-tor ব্যবহারকারী হিসেবে Tor চালায় এবং চলমান unit-টি হলো tor@default.service, কারণ Debian এবং Ubuntu-তে tor.service হলো মূল ইনস্ট্যান্সের একটি র‍্যাপার। ইনস্ট্যান্সের নাম দিয়ে স্ট্যাটাস এবং লগ চেক করলে আপনি সবসময় মূল প্রসেসটির তথ্য পাবেন।

torrc-এ onion service কনফিগার করা

/etc/tor/torrc-এ নিচের দুটি লাইন যুক্ত করুন:

HiddenServiceDir /var/lib/tor/onion_site/
HiddenServicePort 80 127.0.0.1:8080

HiddenServiceDir হলো সেই ডিরেক্টরি যেখানে Tor এই সার্ভিসের কি (keys) এবং ঠিকানা সংরক্ষণ করে। এটি নিজে তৈরি করবেন না। Tor চালু হওয়ার সময় প্রয়োজনীয় মালিকানা (owner) এবং মোড (mode) অনুযায়ী এটি তৈরি করে। আপনি যদি root হিসেবে ডিরেক্টরি তৈরি করেন, তবে নিচের ব্যর্থতার তালিকায় থাকা প্রথম ত্রুটিটি দেখা দেবে।

HiddenServicePort-এর দুটি অংশ থাকে এবং সেগুলোকে গুলিয়ে ফেলা সাধারণ ভুল। প্রথম সংখ্যাটি হলো সেই পোর্ট যেখানে একজন ভিজিটর টানেলের ভেতর দিয়ে সংযোগ স্থাপন করে, তাই 80-ই প্রত্যাশিত এবং এটি পরিবর্তন করার কোনো কারণ নেই। দ্বিতীয় অংশটি হলো সেই লোকাল ঠিকানা যেখানে Tor ট্রাফিক ফরোয়ার্ড করে। একটি সাধারণ HiddenServicePort 80 ট্রাফিককে 127.0.0.1:80-এ ফরোয়ার্ড করে, তাই ঠিকানাটি লিখে উচ্চমানের পোর্ট ব্যবহার করলে onion vhost-টি 80 পোর্টে লিসেন করা অন্য যেকোনো কিছু থেকে আলাদা থাকে।

sudo systemctl restart tor@default
sudo ls -l /var/lib/tor/onion_site/

এই তালিকায় hostname, hs_ed25519_public_key, hs_ed25519_secret_key এবং একটি খালি authorized_clients ডিরেক্টরি থাকা উচিত।

আপনার .onion ঠিকানাটি পড়ুন

sudo cat /var/lib/tor/onion_site/hostname

একটি লাইন প্রদর্শিত হবে: 56টি base32 ক্যারেক্টার এবং .onion। এই স্ট্রিংটিই সাইটটির সম্পূর্ণ পরিচয়। কেউ এটি বরাদ্দ করে না, কেউ এটি হস্তান্তর করতে পারে না এবং আপনার কাছে key file থাকলে কেউ এটি কেড়ে নিতে পারে না। এখনই এটি কপি করে রাখুন, কারণ নিচের প্রতিটি কনফিগারেশনের জন্য এটি প্রয়োজন। এই গাইডের বাকি অংশে এটিকে <your-address>.onion হিসেবে লেখা হয়েছে।

nginx-কে 127.0.0.1-এ bind করে সাইটটি পরিবেশন করুন

sudo apt install -y nginx
sudo install -d -m 755 /srv/onion

/etc/nginx/sites-available/onion লিখুন:

server {
    listen 127.0.0.1:8080;
    server_name <your-address>.onion;

    root /srv/onion;
    index index.html;

    server_tokens off;
    etag off;
    access_log off;
    error_log /var/log/nginx/onion.error.log error;
}
echo '<h1>hello from the onion</h1>' | sudo tee /srv/onion/index.html
sudo ln -s /etc/nginx/sites-available/onion /etc/nginx/sites-enabled/onion
sudo nginx -t
sudo systemctl reload nginx

এখন সার্ভার থেকে দুটি বিষয় প্রমাণ করুন। প্রথমটি হলো, nginx onion নামের জন্য সাড়া দিচ্ছে, যা হুবহু সেই Host হেডার যা tor পাঠাবে:

curl -s -H 'Host: <your-address>.onion' http://127.0.0.1:8080/

দ্বিতীয়টি হলো, এটি শুধুমাত্র সেখানেই সাড়া দিচ্ছে এবং অন্য কোথাও নয়:

sudo ss -tlnp | grep 8080

ঠিকানা কলামে অবশ্যই 127.0.0.1:8080 থাকতে হবে। যদি সেখানে 0.0.0.0:8080 বা *:8080 থাকে, তবে আপনার onion সাইটটি পাবলিক ইন্টারনেটেও উন্মুক্ত রয়েছে, যা লিক তালিকার প্রথম আইটেম। কোনো ঠিকানা ছাড়া একটি listen 8080; লাইন প্রতিটি ইন্টারফেসকে bind করে, এবং এটিই ডিফল্ট।

Tor Browser-এ ঠিকানাটি খুলুন। প্রথমবার লোড হতে কয়েক সেকেন্ড সময় লাগে কারণ ক্লায়েন্ট আপনার ডেসক্রিপ্টর সংগ্রহ করে এবং একটি রেন্ডেভউ সার্কিট তৈরি করে।

Tor Project-এর নিজস্ব ডকুমেন্টেশনে লুপব্যাক পোর্টের চেয়ে ইউনিক্স সকেটকে অগ্রাধিকার দেওয়া হয়: HiddenServicePort 80 unix:/var/run/tor/onion_site.sock, যেখানে nginx সেই পাথে লিসেন করে। একটি সকেট অন্য কোনো হোস্ট থেকে একেবারেই অ্যাক্সেস করা যায় না, এমনকি যদি পরবর্তীতে সার্ভারে দ্বিতীয় কোনো ইন্টারফেস যুক্ত করা হয় তবুও। এর অসুবিধা হলো ফাইলের অনুমতি, কারণ nginx সকেটটি তৈরি করে এবং tor সেটিকে debian-tor হিসেবে সংযুক্ত করে, তাই এই দুই ব্যবহারকারীকে ডিরেক্টরির বিষয়ে একমত হতে হয়। যাচাইকৃত ss আউটপুটসহ লুপব্যাক ব্যবহার করা সহজ এবং এই গাইডের বাকি অংশে এটিই ধরে নেওয়া হয়েছে।

সাইটটি লুপব্যাকে থাকলে, সার্ভারে এর জন্য কোনো ইনবাউন্ড রুল রাখার প্রয়োজন নেই। নিজের জন্য 22 পোর্ট খোলা রাখুন এবং বাকিগুলো ডিনাই করুন (VPS-এ ufw-এর যে ডিফল্ট সেটিংসগুলো করা জরুরি)। মনে রাখবেন, একটি ফায়ারওয়াল এমন কোনো সার্ভিসকে বন্ধ করতে পারে না যা 0.0.0.0-এ bind হয়ে আছে, এটি কেবল ফায়ারওয়াল পর্যন্ত পৌঁছানো প্যাকেটগুলোকে ফিল্টার করে। কন্টেইনারের ক্ষেত্রে এটি আরও জটিল, কারণ Docker পোর্ট পাবলিশ করলে তা ufw-এর আগেই iptables রুল লিখে ফেলে, তাই -p 8080:80 আপনার onion ব্যাকএন্ডকে পাবলিক আইপিতে নিয়ে আসে যদিও ufw পোর্টটিকে ডিনাই হিসেবে দেখায়। কন্টেইনার পোর্টগুলোকে -p 127.0.0.1:8080:80 হিসেবে পাবলিশ করুন।

অনিয়ন সাইটকে ডি-অ্যানোনিমাইজ করে এমন লিকসমূহ

Tor সার্ভারের অবস্থান গোপন রাখে। কিন্তু সার্ভার কী বলছে, তা Tor গোপন করে না। নিচে উল্লেখিত প্রতিটি বিষয় আপনার নিজস্ব স্ট্যাকের মাধ্যমে প্রকাশিত হয়।

আপনার পাবলিক IP-তে একই সাইটের উত্তর দেওয়া

এটি এমন একটি বিষয় যা অনেককে বিপদে ফেলে। স্ক্যানারগুলো ক্রমাগত প্রতিটি রাউটেবল অ্যাড্রেসের HTTP রেসপন্স ইনডেক্স করে এবং সেই ফলাফলগুলো পাবলিক ও সার্চযোগ্য। আপনার পাবলিক IP এবং অনিয়ন অ্যাড্রেস উভয়টিতে একই পেজ সার্ভ করলে, একটি কুয়েরির মাধ্যমেই সেগুলোকে মিলিয়ে ফেলা সম্ভব: একই টাইটেল, একই favicon হ্যাশ, একই ETag, একই হেডার অর্ডার। উপরের listen 127.0.0.1:8080; লাইনটি এর সমাধান। এটি সার্ভার থেকে নয়, বরং অন্য একটি মেশিন থেকে যাচাই করুন:

curl -sv --max-time 5 http://<your-public-ip>:8080/

Connection refused অথবা টাইমআউট হলো সঠিক ফলাফল। যেকোনো HTML আসার অর্থ হলো সাইটটি পাবলিক। যদি বক্সে একটি ক্লিয়ারনেট সাইটও চলে, তবে সেই vhost-এর জন্য আলাদা রুট দিন এবং পাবলিক লিসেনারে একটি স্পষ্ট default_server ব্লক রাখুন, যাতে কোনো অমিল থাকা Host হেডার কখনোই অনিয়ন vhost-এ চলে না আসে।

ভার্সন ব্যানার

curl -sI http://127.0.0.1:8080/ | grep -i '^server'

একটি ডিফল্ট nginx Server: nginx/1.24.0 উত্তর দেয়। সেই ভার্সন স্ট্রিং এবং অন্যান্য হেডারের সঠিক ক্রম হলো একটি ফিঙ্গারপ্রিন্ট, যা আপনার অনিয়ন সাইটকে আপনার ক্লিয়ারনেট হোস্টের সাথে মিলিয়ে দেয়। server_tokens off; এটিকে কমিয়ে Server: nginx করে। এটি হেডারটিকে পুরোপুরি সরিয়ে ফেলে না এবং nginx-এ এটি করার কোনো বিল্ট-ইন ডিরেক্টিভ নেই, তাই আপনি যদি এটি সরাতে চান তবে headers-more মডিউলটি সাধারণত ব্যবহৃত হয়। PHP X-Powered-By যোগ করে যতক্ষণ না আপনি expose_php = Off সেট করেন। etag off; একই তালিকার অন্তর্ভুক্ত, কারণ nginx ফাইলের মডিফিকেশন টাইম এবং সাইজ থেকে ETag তৈরি করে, তাই দুটি সার্ভারে কপি করা একই ফাইল উভয় জায়গায় একই ETag প্রদান করে।

আপনার ক্লিয়ারনেট ডোমেইনের দিকে নির্দেশ করা অ্যাবসোলিউট URL

একটি rel="canonical" ট্যাগ, একটি Open Graph og:url, একটি RSS ফিড, একটি সাইটম্যাপ, একটি পাসওয়ার্ড রিসেট ইমেইল, অথবা হার্ডকোড করা লোগো URL। এগুলোর যেকোনো একটি অনিয়নের মাধ্যমে সার্ভ করা পেজের ভেতরে ক্লিয়ারনেট সাইটের নাম প্রকাশ করে দেয়। /static/logo.svg-এর মতো রুট-রিলেটিভ পাথ ব্যবহার করুন এবং অ্যাপ্লিকেশনটিকে কনস্ট্যান্টের পরিবর্তে রিকোয়েস্ট হোস্ট থেকে তার বেস URL পড়তে দিন। রিডাইরেক্টগুলো অন্য জায়গায় একই ধরনের বাগ তৈরি করে: একটি ক্যাচ-অল ব্লকে return 301 https://example.com$request_uri; অনিয়ন ভিজিটরকে আপনার আসল ডোমেইনে পাঠিয়ে দেয় এবং Location হেডার তাদের সরাসরি উত্তর দিয়ে দেয়।

ক্লিয়ারনেট সাইটের সাথে শেয়ার করা TLS সার্টিফিকেট

একটি অনিয়ন অ্যাড্রেস নিজেকেই প্রমাণ করে, কারণ অ্যাড্রেসটি নিজেই পাবলিক কি, তাই অনিয়ন কানেকশনের মাধ্যমে http:// ইতিমধ্যেই এন্ড-টু-এন্ড এনক্রিপ্টেড এবং Tor Browser এটিকে একটি নিরাপদ কনটেক্সট হিসেবে গণ্য করে। অনিয়ন vhost-এ আপনার বিদ্যমান সার্টিফিকেট ইনস্টল করা দুটির মধ্যে সংযোগ প্রকাশ করে দেয়, কারণ প্রতিটি পাবলিকলি ট্রাস্টেড সার্টিফিকেট Certificate Transparency লগে রেকর্ড করা থাকে এবং সেই লগগুলো পাবলিক, স্থায়ী ও নাম দিয়ে সার্চযোগ্য। ক্লিয়ারনেট vhost-এ Let's Encrypt সার্টিফিকেট রাখুন এবং অনিয়ন vhost-কে সাধারণ HTTP-তে চলতে দিন।

থার্ড-পার্টি ফন্ট এবং অ্যানালিটিক্স

একটি CDN (content delivery network) থেকে আসা ফন্ট বা একটি অ্যানালিটিক্স স্ক্রিপ্ট। ভিজিটরের ব্রাউজার প্রতিটি সরাসরি ফেচ করে, তাই থার্ড পার্টি জানতে পারে যে কেউ আপনার পেজ লোড করেছে এবং সাধারণত কোন পেজটি লোড করেছে। তাছাড়া Tor Browser-এর কঠোর নিরাপত্তা স্তর এমনিতেই এই রিকোয়েস্টগুলো ব্লক করে দেয়, যার ফলে লেআউট ভেঙে যায়। পেজের প্রয়োজনীয় প্রতিটি অ্যাসেট নিজে হোস্ট করুন।

হোস্ট হেডার অমিল

যদি server_name, Tor-এর পাঠানো Host হেডারের সাথে না মেলে, তবে nginx সেই লিসেন অ্যাড্রেসের জন্য ডিফল্ট সার্ভারে ফিরে যায়। একটি vhost থাকা বক্সে এটি অদৃশ্য থাকে, কারণ একমাত্র সার্ভার ব্লকটিই ডিফল্ট। পরে একটি ক্লিয়ারনেট vhost যোগ করলে অনিয়ন রিকোয়েস্টগুলো সেখানে চলে যেতে পারে, যা তার ক্যানোনিকাল ট্যাগ এবং রিডাইরেক্টসহ চলে আসে। প্রতিটি nginx পরিবর্তনের পর curl -H 'Host: ...' চেকটি পুনরায় চালান এবং আপনার আসল ডোমেইনের জন্য রেজাল্টটি grep করুন:

curl -s -H 'Host: <your-address>.onion' http://127.0.0.1:8080/ | grep -o 'https\?://[^"]*' | sort -u

কোন প্রসেস কোন সকেটের মালিক তা জানা এই কাজের বড় অংশ (Linux-এ পোর্ট এবং লিসেনিং সকেট কীভাবে কাজ করে)।

লগে যা অবশিষ্ট থাকে

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

প্রাইভেট কি (private key) ব্যাকআপ রাখুন, কারণ এটিই আপনার ঠিকানা

/var/lib/tor/onion_site/hs_ed25519_secret_key হলো সেই সার্ভিস। এখানে কোনো রেজিস্ট্রার বা রিকভারি ব্যবস্থা নেই। এটি হারিয়ে ফেললে আপনার ঠিকানাও হারিয়ে যাবে। আপনি যদি এটি কপি করে রাখেন, তবে যার কাছে এই কপি থাকবে সে আপনার ঠিকানায় নিজের কন্টেন্ট সার্ভ করতে পারবে এবং আপনার পক্ষে তা বাতিল করার কোনো উপায় থাকবে না।

sudo systemctl stop tor@default
sudo tar -C /var/lib/tor -czf onion-keys.tgz onion_site
sudo chmod 600 onion-keys.tgz
sudo systemctl start tor@default

এই আর্কাইভটিকে এনক্রিপ্ট করুন (gpg -c onion-keys.tgz) এবং সার্ভার থেকে সরিয়ে অন্য কোথাও রাখুন। নতুন কোনো VPS-এ রিস্টোর করার জন্য আর্কাইভ ফাইলটি এবং tor-এর প্রত্যাশিত মালিকানা (ownership) প্রয়োজন:

sudo systemctl stop tor@default
sudo tar -C /var/lib/tor -xzf onion-keys.tgz
sudo chown -R debian-tor:debian-tor /var/lib/tor/onion_site
sudo chmod 700 /var/lib/tor/onion_site
sudo systemctl start tor@default
sudo cat /var/lib/tor/onion_site/hostname

tor যখন ডেসক্রিপ্টর পুনরায় পাবলিশ করবে, তার এক বা দুই মিনিটের মধ্যেই নতুন হার্ডওয়্যারে একই ঠিকানা ফিরে আসবে। মাইগ্রেশনের পুরো প্রক্রিয়াটি এটাই: কোনো DNS পরিবর্তন বা সার্টিফিকেট পুনরায় ইস্যু করার প্রয়োজন নেই।

Onion-Location, যখন সাইটটি clearnet-এও বিদ্যমান থাকে

যদি onion সাইটটি গোপনীয়তার চেয়ে সুবিধার জন্য বেশি ব্যবহৃত হয়, তবে clearnet vhost থেকে সেটির বিজ্ঞাপন দিন:

add_header Onion-Location http://<your-address>.onion$request_uri;

Tor Browser তখন অ্যাড্রেস বারে একটি .onion available বাটন দেখায় এবং সাইটটিতে সুইচ করার প্রস্তাব দেয়। এই হেডারটি কেবল তখনই কার্যকর হয় যখন clearnet পেজটি HTTPS-এর মাধ্যমে পরিবেশন করা হয় এবং এর মান একটি বৈধ onion URL হয়।

এখানে Nginx-এর একটি নিয়ম মাথায় রাখতে হবে। add_header ডিরেক্টিভগুলো একটি location ব্লকে তখনই ইনহেরিট (inherit) হয় যখন সেই ব্লকে নিজস্ব কোনো ডিরেক্টিভ থাকে না। তাই একটি location যার নিজস্ব add_header আছে, সেটি নীরবে Onion-Location বাদ দিয়ে দেয়। সেখানে এটি পুনরায় যোগ করুন, অথবা সমস্ত রেসপন্স হেডার এক জায়গায় রাখুন। এই হেডারটি প্রকাশ করার অর্থ হলো আপনি সচেতনভাবে দুটি সাইটকে সংযুক্ত করছেন; একটি মিররের জন্য এটি সঠিক, কিন্তু যে সাইটগুলোকে আলাদা রাখতে চান সেগুলোর জন্য এটি ভুল।

ভ্যানিটি অ্যাড্রেস

mkp224o ততক্ষণ পর্যন্ত কি-পেয়ার (key pairs) তৈরি করতে থাকে যতক্ষণ না এটি আপনার দেওয়া প্রিফিক্স দিয়ে শুরু হওয়া একটি অ্যাড্রেস খুঁজে পায়। এটি একটি ব্রুট ফোর্স সার্চ, তাই প্রিফিক্স এবং আপনি কতক্ষণ অপেক্ষা করতে ইচ্ছুক তা ছাড়া এখানে কনফিগার করার মতো কিছু নেই।

sudo apt install -y git gcc libc6-dev libsodium-dev make autoconf
git clone https://github.com/cathugger/mkp224o
cd mkp224o
./autogen.sh
./configure --enable-amd64-51-30k
make
./mkp224o -d onionkeys blog

প্রতিটি হিট onionkeys/<address>.onion/-এ জমা হয়, যাতে hostname এবং hs_ed25519_secret_key থাকে। এটি ইনস্টল করতে tor বন্ধ করুন, সেই ডিরেক্টরিটিকে আপনার HiddenServiceDir-এর ওপর কপি করুন, এবং তারপর আগের রিস্টোর প্রক্রিয়ার মতো একই chownchmod 700 প্রয়োগ করুন।

প্রিফিক্সের দৈর্ঘ্যই হলো মূল খরচ। অ্যাড্রেসটি base32 ফরম্যাটে থাকে, তাই প্রতিটি অতিরিক্ত অক্ষরের জন্য আপনাকে প্রত্যাশিত কি-এর সংখ্যাকে 32 দিয়ে গুণ করতে হবে। একটি ছোট প্রিফিক্স ল্যাপটপেই তৈরি করা সম্ভব। কিন্তু অনেক লম্বা প্রিফিক্স আপনার মালিকানাধীন কোনো ডিভাইসেই তৈরি করা সম্ভব নয়। একটি ভ্যানিটি প্রিফিক্স ব্যবহারকারীদের পুরো অ্যাড্রেসের পরিবর্তে কেবল প্রথম কয়েকটি অক্ষর দেখে চেনার অভ্যাস তৈরি করে, আর ফিশিংয়ের মাধ্যমে তৈরি করা নকল অনিয়ন সাইটগুলো ঠিক এই অভ্যাসের ওপর ভিত্তি করেই গড়ে ওঠে।

ব্যর্থতার ধরন এবং যে বার্তাগুলো আপনি দেখবেন

রিস্টার্টের পর কোনো hostname ফাইল নেই। Tor চালু হয়নি অথবা এটি ডিরেক্টরিটিকে প্রত্যাখ্যান করেছে। sudo journalctl -u tor@default -n 50 এটি নির্দেশ করে:

/var/lib/tor/onion_site/ is not owned by this user (debian-tor, 108) but by root (0). Perhaps you are running Tor as the wrong user?

হাতে তৈরি করা একটি ডিরেক্টরি দেখতে এমন হয়। এর মালিকানা (ownership) এবং মোড (mode) ঠিক করুন, অথবা ডিরেক্টরিটি মুছে ফেলুন এবং Tor-কে এটি তৈরি করতে দিন।

Tor Browser Onionsite Not Found (0xF0) দেখাচ্ছে। ক্লায়েন্ট কোনো ডেসক্রিপ্টর সংগ্রহ করতে পারেনি, তাই নেটওয়ার্কের কাছে ওই ঠিকানায় কিছুই প্রকাশিত নেই। নিশ্চিত করুন যে Tor চলছে এবং বুটস্ট্র্যাপ হয়েছে, আপনি যে ঠিকানাটি টাইপ করেছেন তা sudo cat /var/lib/tor/onion_site/hostname-এর সাথে অক্ষর মিলিয়ে দেখুন, তারপর ঘড়ির সময় পরীক্ষা করুন। ডেসক্রিপ্টর প্রকাশ এবং যাচাই করার জন্য Tor-এর সঠিক সময়ের প্রয়োজন, এবং timedatectl-এর রিপোর্ট করা উচিত System clock synchronized: yes

ঠিকানাটি কাজ করছে কিন্তু পেজ লোড হচ্ছে না। Tor রেন্ডেভ্যু (rendezvous) সম্পন্ন করেছে কিন্তু শেষ ধাপে এসে ব্যর্থ হয়েছে, অর্থাৎ Tor থেকে Nginx-এর সংযোগে সমস্যা। এই ধাপটি লোকাল, তাই Tor লগে কোনো তথ্য পাওয়া যায় না। সার্ভারে curl -sI http://127.0.0.1:8080/ চালান। Connection refused মানে হলো Nginx বন্ধ আছে অথবা এটি এমন কোনো ঠিকানায় লিসেন করছে যা HiddenServicePort-এর নির্দেশিত ঠিকানার সাথে মেলে না।

পেজ লোড হয় কিন্তু প্রতিটি লিঙ্ক আপনার আসল ডোমেইনে চলে যায়। টেমপ্লেটগুলোতে অ্যাবসোলিউট ইউআরএল (Absolute URLs) ব্যবহার করা হয়েছে। উপরে উল্লিখিত grep -o 'https\?://[^"]*' চেকটি চালান এবং ঠিকানাটি কোথাও শেয়ার করার আগে এটি যা প্রদর্শন করে তা ঠিক করুন।

এটি কাজ করে, কিন্তু রিবুট করার পর বন্ধ হয়ে যায়। সাইটটি ব্যবহারের ওপর নির্ভর করার আগে একবার ইচ্ছাকৃতভাবে বক্সটি রিবুট করুন, তারপর sudo systemctl status tor@default এবং sudo systemctl status nginx চালান। কেউ হাতে চালু করেছে এমন একটি সার্ভিস দেখতে এনাবল করা সার্ভিসের মতোই মনে হয়, যতক্ষণ না মেশিনটি রিস্টার্ট হয়।

FAQ

Tor onion service-এর জন্য কি আমার ফায়ারওয়ালে কোনো পোর্ট খোলার প্রয়োজন আছে?

না। tor daemon শুধুমাত্র আউটবাউন্ড কানেকশন তৈরি করে—ডিরেক্টরি সার্ভার, ইন্ট্রোডাকশন পয়েন্ট এবং রেন্ডেভ্যু রিলেগুলোর সাথে। তাই কোনো ইনবাউন্ড রুলের প্রয়োজন নেই এবং ওয়েব সার্ভারটি নিজেই 127.0.0.1-এ লিসেন করে। ইনকামিং ট্র্যাফিকের জন্য ufw-কে ডিফল্ট 'deny' মোডে রাখুন এবং শুধুমাত্র SSH-এর অনুমতি দিন। এই একই বৈশিষ্ট্যের কারণে, NAT (network address translation)-এর পেছনে থাকা কোনো মেশিন, যার কোনো পাবলিক IP নেই, সেখান থেকেও একটি onion service চালানো সম্ভব।

Tor Browser-এ আমি কেন আমার .onion ঠিকানায় পৌঁছাতে পারছি না?

সার্ভার থেকে বাইরের দিকে পরীক্ষা শুরু করুন। sudo journalctl -u tor@default -n 50 কমান্ডটি চালালে Bootstrapped 100% (done): Done দেখানো উচিত। এরপর সার্ভারে curl -sI http://127.0.0.1:8080/ কমান্ডটি একটি স্ট্যাটাস লাইন রিটার্ন করবে। সবশেষে, আপনি যে ঠিকানাটি টাইপ করেছেন তা hostname ফাইলের সাথে মিলিয়ে দেখুন, কারণ একটি ভুল অক্ষর মানেই সেটি সম্পূর্ণ ভিন্ন একটি সার্ভিস। Onionsite Not Found (0xF0) এর অর্থ হলো ওই ঠিকানার জন্য কোনো ডেসক্রিপ্টর পাওয়া যায়নি, যার সাধারণত মানে হলো tor চলছে না অথবা সিস্টেমের ঘড়িতে ভুল সময় সেট করা আছে।

আমি কি আমার onion সাইটটিকে নতুন সার্ভারে স্থানান্তর করে একই ঠিকানা বজায় রাখতে পারি?

হ্যাঁ। ঠিকানাটি hs_ed25519_secret_key থেকে তৈরি হয়, তাই পুরো HiddenServiceDir ডিরেক্টরিটি নতুন মেশিনে কপি করুন। এরপর সেটির মালিকানা debian-tor-এ সেট করুন এবং পারমিশন 700 করুন, তারপর tor চালু করুন। ডেসক্রিপ্টরটি পুনরায় পাবলিশ হওয়ার সাথে সাথেই ঠিকানাটি আবার সচল হয়ে যাবে এবং কোনো DNS রেকর্ড আপডেট করার প্রয়োজন নেই। এই ফাইলটি হারিয়ে ফেললে ঠিকানাটি আর পুনরুদ্ধার করা সম্ভব নয়, তাই এটি তৈরির দিনই এনক্রিপ্ট করে সার্ভারের বাইরে ব্যাকআপ রাখুন।

onion সাইটের কি HTTPS সার্টিফিকেটের প্রয়োজন আছে?

না। 56-অক্ষরের ঠিকানাটিই হলো সার্ভিসের পাবলিক কি, তাই কানেকশনটি শুরু থেকেই এন্ড-টু-এন্ড এনক্রিপ্টেড এবং অথেন্টিকেটেড থাকে। Tor Browser .onion নামের ওপর http://-কে একটি নিরাপদ কনটেক্সট হিসেবে বিবেচনা করে। আপনার clearnet সার্টিফিকেট onion vhost-এ পুনরায় ব্যবহার করা কোনো কিছু না করার চেয়েও খারাপ, কারণ Certificate Transparency লগগুলো পাবলিক এবং সেখানে স্থায়ীভাবে রেকর্ড থাকে যে কোন কোন নাম একই সার্টিফিকেট শেয়ার করছে। একটি .onion নামের জন্য সার্টিফিকেট কেনার একমাত্র কারণ হতে পারে কোনো CA থেকে ব্র্যান্ডের নিশ্চয়তা পাওয়া, কিন্তু সেই সংযোগটি ডিজাইনের কারণেই পাবলিক।