SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

วิธีตั้งค่า Onion Site บน VPS ด้วย Tor และ Nginx

เรียนรู้วิธีรัน v3 onion service บน Ubuntu ด้วย Tor และ Nginx ผูกเข้ากับ loopback พร้อมขั้นตอนการตั้งค่าเพื่อป้องกันข้อมูลรั่วไหลที่อาจเชื่อมโยงกลับไปยัง IP จริงของคุณ

สิ่งที่คุณกำลังสร้าง

Onion site คือเว็บเซิร์ฟเวอร์ปกติที่ตอบสนองผ่านเครือข่าย Tor เท่านั้น ให้ติดตั้ง tor เพิ่มสองบรรทัดลงใน /etc/tor/torrc อ่านที่อยู่ที่ tor เขียนไว้ให้คุณ จากนั้นผูก nginx เข้ากับ 127.0.0.1 เพื่อไม่ให้มีการตอบสนองบน public IP ขั้นตอนการติดตั้งใช้เวลาสิบนาที ส่วนที่เหลือของคู่มือนี้คือรายการสิ่งที่อาจทำให้ข้อมูลรั่วไหล เนื่องจากวิธีที่ onion site ล้มเหลวโดยทั่วไปคือการที่การตั้งค่าของตัวมันเองชี้กลับไปหาผู้ดูแลโดยตรง

Tor เริ่มต้นจากการเป็น "the onion router" และ onion service คือบริการที่คุณสามารถเข้าถึงได้ผ่านเครือข่ายนี้เท่านั้น ที่อยู่เวอร์ชัน 3 มีความยาว 56 ตัวอักษรตามด้วย .onion โดยตัวอักษรเหล่านั้นคือ ed25519 public key ของบริการ บวกกับ checksum และ version byte ที่เข้ารหัสแบบ base32 ที่อยู่เวอร์ชัน 2 (16 ตัวอักษร) ถูกถอดออกจากเครือข่ายในปี 2021 ดังนั้นทุกอย่างที่คุณสร้างในปัจจุบันจะเป็น v3 ที่อยู่ คือ กุญแจ ซึ่งส่งผลสองประการคือ การเชื่อมต่อจะถูกเข้ารหัสและยืนยันตัวตนแบบ end-to-end โดยไม่ต้องอาศัย certificate authority และการทำไฟล์กุญแจหายหมายถึงการสูญเสียที่อยู่นั้นไปตลอดกาล

เซิร์ฟเวอร์ของคุณจะไม่ยอมรับการเชื่อมต่อขาเข้าใดๆ Tor จะเลือก relay สองสามแห่งเพื่อเป็นจุดแนะนำ (introduction points) อัปโหลด descriptor ที่ลงนามแล้วไปยัง directory servers และพบกับผู้เยี่ยมชมแต่ละรายที่ rendezvous relay ที่ผู้เยี่ยมชมเลือก การเชื่อมต่อเหล่านั้นทั้งหมดเป็นการเชื่อมต่อขาออกจากเครื่องของคุณ ไม่จำเป็นต้องเปิดพอร์ตและไม่มี DNS record ที่ต้องประกาศ

การติดตั้ง tor จาก repository ของ Tor Project

Ubuntu มีแพ็กเกจ tor ใน repository แบบ universe แต่เวอร์ชันมักจะค้างอยู่ที่เวอร์ชันที่เสถียรในช่วงที่ปล่อยรุ่นนั้นออกมา Repository ของ Tor Project เองจะติดตามเวอร์ชันเสถียรล่าสุด ซึ่งเป็นสิ่งที่คุณต้องการสำหรับซอฟต์แวร์ที่ทำหน้าที่ตัดสินว่าที่อยู่ของคุณจะยังคงเป็นส่วนตัวหรือไม่

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 จะต้องเป็น codename ของ Ubuntu ที่คุณใช้งานอยู่ ให้ตรวจสอบจาก /etc/os-release แทนการพิมพ์เอง เพราะหากใส่ codename ผิด จะทำให้ repository แก้ไขชื่อได้ถูกต้องแต่ไม่มีแพ็กเกจสำหรับรุ่นที่คุณใช้งานอยู่

. /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% แสดงว่าไม่มีเส้นทางออกสู่ภายนอก ให้ตรวจสอบ firewall ของผู้ให้บริการเครือข่ายและกฎการส่งข้อมูลขาออก (egress rules) ของคุณเอง โดย sudo ufw status verbose ควรแสดง allow (outgoing) เป็นค่าเริ่มต้น

จากจุดนี้ไปมีชื่อที่สำคัญสองชื่อ แพ็กเกจจะรัน tor ในฐานะผู้ใช้ debian-tor และ unit ที่กำลังทำงานอยู่คือ tor@default.service เนื่องจาก tor.service บน Debian และ Ubuntu เป็นเพียง wrapper ครอบ instance หลักอยู่ การเรียกดูสถานะและ log โดยใช้ชื่อ instance จะทำให้คุณได้รับข้อมูลจาก process จริงเสมอ

การตั้งค่า onion service ใน torrc

ให้เพิ่มสองบรรทัดต่อไปนี้ลงใน /etc/tor/torrc:

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

HiddenServiceDir คือตำแหน่งที่ Tor ใช้เก็บกุญแจและที่อยู่สำหรับบริการนี้ ห้ามสร้างไดเรกทอรีนี้ด้วยตนเอง Tor จะสร้างขึ้นเองเมื่อเริ่มทำงานพร้อมกำหนดเจ้าของและสิทธิ์การเข้าถึงที่จำเป็น หากคุณสร้างไดเรกทอรีนี้ในฐานะ 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

จะมีข้อความปรากฏขึ้นมาหนึ่งบรรทัด ประกอบด้วยอักขระ base32 จำนวน 56 ตัว และ .onion สตริงดังกล่าวคือตัวตนทั้งหมดของเว็บไซต์ ไม่มีใครเป็นผู้กำหนด ไม่มีใครสามารถโอนย้าย และไม่มีใครสามารถยึดไปได้ตราบใดที่คุณยังถือครองไฟล์กุญแจอยู่ ให้คัดลอกที่อยู่นี้ไว้ทันที เนื่องจากทุกการตั้งค่าในขั้นตอนถัดไปจำเป็นต้องใช้ที่อยู่นี้ ในส่วนที่เหลือของคู่มือนี้จะเรียกที่อยู่นี้ว่า <your-address>.onion

ให้บริการเว็บไซต์ผ่าน nginx โดยผูกไว้ที่ 127.0.0.1

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 ซึ่งเป็นค่าของ header Host ที่ tor จะส่งมาให้:

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

สิ่งที่สองคือมันตอบสนองเฉพาะที่นั่นและไม่ตอบสนองที่อื่น:

sudo ss -tlnp | grep 8080

คอลัมน์ address จะต้องแสดงเป็น 127.0.0.1:8080 หากแสดงเป็น 0.0.0.0:8080 หรือ *:8080 แสดงว่าเว็บไซต์ onion ของคุณเปิดเผยอยู่บนอินเทอร์เน็ตสาธารณะ ซึ่งเป็นรายการแรกในรายการสิ่งที่รั่วไหล บรรทัด listen 8080; ที่ไม่มี address ระบุอยู่หมายถึงการผูกกับทุกอินเทอร์เฟซ ซึ่งเป็นค่าเริ่มต้น

เปิด address ดังกล่าวใน Tor Browser การโหลดครั้งแรกจะใช้เวลาสองสามวินาทีในขณะที่ไคลเอ็นต์ดึง descriptor ของคุณและสร้าง rendezvous circuit

เอกสารประกอบของ The Tor Project แนะนำให้ใช้ unix socket แทน loopback port คือ HiddenServicePort 80 unix:/var/run/tor/onion_site.sock โดยให้ nginx ฟังที่ path นั้น socket จะไม่สามารถเข้าถึงได้จากโฮสต์อื่นเลย แม้ว่าในอนาคตเครื่องจะมีการเพิ่มอินเทอร์เฟซที่สองก็ตาม ข้อควรระวังคือเรื่องสิทธิ์ของไฟล์ เนื่องจาก nginx เป็นผู้สร้าง socket และ tor เชื่อมต่อเข้ามาในฐานะ debian-tor ดังนั้นผู้ใช้ทั้งสองต้องเข้าถึงไดเรกทอรีดังกล่าวได้ การใช้ loopback พร้อมผลลัพธ์ ss ที่ตรวจสอบแล้วนั้นทำได้ง่ายกว่าและเป็นวิธีที่คู่มือนี้ใช้เป็นหลัก

เมื่อเว็บไซต์ทำงานอยู่บน loopback เครื่องก็ไม่จำเป็นต้องมีกฎ inbound สำหรับพอร์ตนั้นเลย ให้เปิดเฉพาะพอร์ต 22 สำหรับตัวคุณเองและปฏิเสธการเชื่อมต่ออื่นทั้งหมด (ค่าเริ่มต้นของ ufw ที่ควรตั้งค่าบน VPS) โปรดจำไว้ว่า firewall ไม่ได้ยกเลิกการทำงานของบริการที่ผูกกับ 0.0.0.0 แต่ทำหน้าที่เพียงกรองแพ็กเก็ตที่มาถึง firewall เท่านั้น คอนเทนเนอร์ทำให้ปัญหานี้ชัดเจนขึ้น เพราะ การเผยแพร่พอร์ต Docker จะเขียนกฎ iptables ก่อน ufw ดังนั้น -p 8080:80 จึงทำให้ onion backend ของคุณไปปรากฏบน public IP ในขณะที่ ufw ยังคงรายงานว่าพอร์ตถูกปฏิเสธ ให้เผยแพร่พอร์ตคอนเทนเนอร์เป็น -p 127.0.0.1:8080:80

ช่องโหว่ที่ทำให้ onion site ถูกระบุตัวตนได้

Tor ปกปิดตำแหน่งที่ตั้งของเซิร์ฟเวอร์ แต่ไม่มีสิ่งใดใน Tor ที่ปกปิดเนื้อหาที่เซิร์ฟเวอร์สื่อสารออกมา รายการต่อไปนี้คือสิ่งที่ stack ของคุณเผยแพร่ออกไปโดยไม่ตั้งใจ

เว็บไซต์เดียวกันที่ตอบสนองผ่าน public IP ของคุณ

นี่คือจุดที่ทำให้หลายคนพลาด เครื่องมือสแกนจะทำดัชนีการตอบสนอง HTTP ของทุก routable address อย่างต่อเนื่อง และผลลัพธ์เหล่านั้นเป็นข้อมูลสาธารณะที่ค้นหาได้ หากคุณให้บริการหน้าเว็บเดียวกันบน public IP และ onion address การเชื่อมโยงข้อมูลทั้งสองเข้าด้วยกันทำได้เพียงแค่การสืบค้นเดียว: ชื่อหน้าเว็บเหมือนกัน, hash ของ favicon เหมือนกัน, ETag เหมือนกัน, ลำดับของ header เหมือนกัน บรรทัด listen 127.0.0.1:8080; ด้านบนคือวิธีแก้ไข ให้ตรวจสอบจากเครื่องอื่นที่ไม่ใช่เซิร์ฟเวอร์ของคุณเอง:

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

Connection refused หรือการหมดเวลา (timeout) คือผลลัพธ์ที่ถูกต้อง หากมี HTML ปรากฏขึ้นแสดงว่าเว็บไซต์ของคุณเป็นสาธารณะ หากเซิร์ฟเวอร์นี้รันเว็บไซต์บน clearnet ด้วย ให้กำหนด root แยกต่างหากสำหรับ vhost นั้น และใส่บล็อก default_server ไว้ใน listener สาธารณะอย่างชัดเจน เพื่อไม่ให้ Host header ที่ไม่ตรงกันหลุดไปถึง onion vhost

แบนเนอร์ระบุเวอร์ชัน

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

nginx ค่าเริ่มต้นจะตอบกลับด้วย Server: nginx/1.24.0 สตริงเวอร์ชันนั้นรวมถึงลำดับของ header อื่นๆ คือลายนิ้วมือ (fingerprint) ที่เชื่อมโยง onion site ของคุณเข้ากับ clearnet host server_tokens off; จะลดทอนข้อมูลนี้ให้เหลือเพียง Server: nginx แต่มันไม่ได้ลบ header ออก และ nginx ไม่มี directive ในตัวสำหรับลบออก ดังนั้นโมดูล headers-more จึงเป็นวิธีมาตรฐานหากคุณต้องการลบออก PHP จะเพิ่ม X-Powered-By จนกว่าคุณจะตั้งค่า expose_php = Off ส่วน etag off; ก็อยู่ในรายการเดียวกัน เพราะ nginx สร้าง ETag จากเวลาแก้ไขและขนาดของไฟล์ ดังนั้นไฟล์เดียวกันที่ถูกคัดลอกไปยังสองเซิร์ฟเวอร์จะส่งค่า ETag เดียวกันออกมา

Absolute URL ที่ชี้ไปยังโดเมน clearnet ของคุณ

แท็ก rel="canonical", Open Graph og:url, RSS feed, sitemap, อีเมลรีเซ็ตรหัสผ่าน หรือ URL ของโลโก้ที่ระบุไว้ตายตัว สิ่งเหล่านี้ล้วนอ้างถึง clearnet site ภายในหน้าเว็บที่ให้บริการผ่าน onion ให้ใช้ path แบบ root-relative เช่น /static/logo.svg และให้แอปพลิเคชันอ่าน base URL จาก request host แทนการใช้ค่าคงที่ การ redirect ก็เป็นข้อผิดพลาดในลักษณะเดียวกัน: return 301 https://example.com$request_uri; ในบล็อก catch-all จะส่งผู้เยี่ยมชม onion ไปยังโดเมนจริงของคุณ และ header Location จะส่งคำตอบนั้นให้พวกเขาโดยตรง

ใบรับรอง TLS ที่ใช้ร่วมกับ clearnet site

onion address มีการยืนยันตัวตนในตัวอยู่แล้วเนื่องจากที่อยู่คือ public key ดังนั้น http:// ผ่านการเชื่อมต่อ onion จึงมีการเข้ารหัสแบบ end-to-end อยู่แล้ว และ Tor Browser จะถือว่าเป็นบริบทที่ปลอดภัย การติดตั้งใบรับรองเดิมของคุณบน onion vhost จะเป็นการเผยแพร่ความเชื่อมโยงระหว่างทั้งสอง เพราะใบรับรองที่ได้รับความเชื่อถือจากสาธารณะทุกใบจะถูกบันทึกไว้ใน Certificate Transparency logs ซึ่งเป็นบันทึกสาธารณะ ถาวร และค้นหาได้ด้วยชื่อ ให้เก็บ ใบรับรอง Let's Encrypt ไว้บน clearnet vhost และปล่อยให้ onion vhost เป็น HTTP ธรรมดา

ฟอนต์และเครื่องมือวิเคราะห์จากบุคคลที่สาม

ฟอนต์จาก CDN หรือสคริปต์วิเคราะห์ข้อมูล เบราว์เซอร์ของผู้เยี่ยมชมจะดึงข้อมูลแต่ละรายการโดยตรง ทำให้บุคคลที่สามทราบว่ามีคนโหลดหน้าเว็บของคุณและมักจะทราบด้วยว่าหน้าไหน นอกจากนี้ Tor Browser ที่มีระดับความปลอดภัยสูงจะบล็อกคำขอเหล่านี้อยู่แล้ว ทำให้การแสดงผลหน้าเว็บพัง ให้โฮสต์ asset ทุกอย่างที่หน้าเว็บจำเป็นต้องใช้ด้วยตัวเอง

Host header ไม่ตรงกัน

หาก server_name ไม่ตรงกับ header Host ที่ tor ส่งมา nginx จะย้อนกลับไปใช้เซิร์ฟเวอร์เริ่มต้น (default server) สำหรับ listen address นั้น ในเครื่องที่มี vhost เดียว สิ่งนี้จะมองไม่เห็นเพราะบล็อกเซิร์ฟเวอร์เดียวที่มีอยู่คือค่าเริ่มต้น แต่หากเพิ่ม clearnet vhost ในภายหลัง คำขอ onion อาจเริ่มหลุดเข้าไปที่นั่น พร้อมกับ canonical tags และการ redirect ต่างๆ ให้รันการตรวจสอบ curl -H 'Host: ...' อีกครั้งหลังจากการเปลี่ยนแปลง nginx ทุกครั้ง และใช้ grep เพื่อค้นหาโดเมนจริงของคุณ:

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

การทราบว่า process ใดเป็นเจ้าของ socket ใดคือหัวใจสำคัญของงานนี้ (วิธีการทำงานของพอร์ตและ listening socket บน Linux)

สิ่งที่หลงเหลืออยู่ใน log

ทุกคำขอจะมาจาก 127.0.0.1 ดังนั้น nginx จึงไม่มีที่อยู่ของผู้เยี่ยมชมให้บันทึก และ access_log off; ก็ไม่มีผลกระทบใดๆ ส่วนแอปพลิเคชันที่อยู่เหนือขึ้นไปเป็นอีกเรื่องหนึ่ง เนื่องจากข้อมูลคำสั่งซื้อ ที่อยู่อีเมล หรือ metadata ของไฟล์ที่อัปโหลดเป็นสิ่งที่คุณต้องจัดการเอง นิสัยส่วนตัวของคุณก็มีความสำคัญเช่นกัน: การดูแลระบบผ่านการล็อกอินที่ไม่ได้เสริมความปลอดภัยถือเป็นสิ่งที่อยู่นอกเหนือการป้องกันของ Tor ดังนั้นให้ถือว่า การเสริมความปลอดภัย SSH บน VPS เดียวกัน เป็นส่วนหนึ่งของการสร้างระบบนี้

สำรองข้อมูล 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 ต้องการ:

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 เผยแพร่ descriptor ใหม่ภายในหนึ่งหรือสองนาที นี่คือกระบวนการย้ายระบบทั้งหมด: ไม่มีการเปลี่ยนแปลง DNS และไม่ต้องออกใบรับรองใหม่

Onion-Location ในกรณีที่เว็บไซต์มีอยู่บน clearnet ด้วย

หาก onion service มีไว้เพื่อความสะดวกมากกว่าการรักษาความลับ ให้ประกาศที่อยู่ผ่าน vhost ของ clearnet ดังนี้:

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

จากนั้น Tor Browser จะแสดงปุ่ม .onion available บนแถบที่อยู่และเสนอให้สลับไปใช้งาน ส่วนหัว (header) นี้จะถูกนำไปใช้ก็ต่อเมื่อหน้าเว็บ clearnet ถูกส่งผ่าน HTTPS และค่าที่ระบุเป็น URL ของ onion ที่ถูกต้องเท่านั้น

มีกฎของ nginx ข้อหนึ่งที่ต้องระวัง คือคำสั่ง add_header จะถูกสืบทอดไปยังบล็อก location ก็ต่อเมื่อบล็อกนั้นไม่มีการประกาศคำสั่งดังกล่าวของตนเอง ดังนั้นหากมี location ที่มี add_header เป็นของตัวเอง จะทำให้ Onion-Location ถูกยกเลิกไปโดยไม่มีการแจ้งเตือน คุณต้องประกาศซ้ำในบล็อกนั้น หรือรวมการตั้งค่า response header ทั้งหมดไว้ที่จุดเดียว การเผยแพร่ header นี้ถือเป็นการเชื่อมโยงเว็บไซต์ทั้งสองเข้าด้วยกันโดยเจตนา ซึ่งเป็นสิ่งที่ถูกต้องสำหรับ mirror แต่ไม่ควรทำหากต้องการให้เว็บไซต์แยกจากกันโดยสิ้นเชิง

ที่อยู่แบบกำหนดเอง (Vanity addresses)

mkp224o จะสร้างคู่กุญแจไปเรื่อยๆ จนกว่าจะได้ที่อยู่ที่ขึ้นต้นด้วยคำนำหน้า (prefix) ที่คุณต้องการ กระบวนการนี้เป็นการค้นหาแบบ brute force จึงไม่มีอะไรต้องตั้งค่าเพิ่มเติม นอกจากระบุคำนำหน้าและระยะเวลาที่คุณยินดีรอ

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 ของคุณ แล้วกำหนด chown และ chmod 700 ให้เหมือนกับการกู้คืนข้อมูลที่กล่าวไปข้างต้น

ความยาวของคำนำหน้าคือต้นทุนทั้งหมด เนื่องจากที่อยู่เป็นรูปแบบ base32 ทุกตัวอักษรที่คุณเพิ่มเข้าไปจะทำให้จำนวนกุญแจที่ต้องสุ่มเพิ่มขึ้นเป็น 32 เท่า คำนำหน้าสั้นๆ สามารถประมวลผลเสร็จได้บนแล็ปท็อป แต่คำนำหน้าที่ยาวเกินไปจะไม่สามารถประมวลผลให้เสร็จสิ้นได้ด้วยทรัพยากรที่คุณมี นอกจากนี้ การใช้คำนำหน้าแบบกำหนดเองยังเป็นการสอนให้ผู้อ่านจดจำเพียงตัวอักษรไม่กี่ตัวแรกแทนที่จะเป็นที่อยู่ทั้งหมด ซึ่งเป็นพฤติกรรมที่เว็บไซต์ onion ปลอมใช้ในการหลอกลวง (phishing)

รูปแบบความล้มเหลวและข้อความที่คุณจะพบ

ไม่มีไฟล์ 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) ไคลเอนต์ไม่สามารถดึง descriptor ได้ ดังนั้นในมุมมองของเครือข่ายจึงไม่มีข้อมูลเผยแพร่ที่ที่อยู่นั้น ให้ยืนยันว่า tor กำลังทำงานและ bootstrapped เรียบร้อยแล้ว เปรียบเทียบที่อยู่ที่คุณพิมพ์กับ sudo cat /var/lib/tor/onion_site/hostname ทีละตัวอักษร จากนั้นตรวจสอบเวลาของระบบ Tor จำเป็นต้องใช้เวลาที่แม่นยำในการเผยแพร่และตรวจสอบความถูกต้องของ descriptor และ timedatectl ควรรายงานสถานะเป็น System clock synchronized: yes

ที่อยู่สามารถ resolve ได้แต่หน้าเว็บไม่โหลด Tor ทำการ rendezvous เสร็จสิ้นแล้วแต่ล้มเหลวใน hop สุดท้าย ซึ่งเป็นการเชื่อมต่อจาก tor ไปยัง nginx และเนื่องจาก hop นี้เป็น local log ของ tor จึงไม่มีข้อความแจ้งเตือน ให้รันคำสั่ง curl -sI http://127.0.0.1:8080/ บนเซิร์ฟเวอร์ หากพบ Connection refused หมายความว่า nginx หยุดทำงานหรือกำลังฟังอยู่ที่ที่อยู่ซึ่งต่างจากที่ HiddenServicePort ชี้ไป

หน้าเว็บโหลดได้แต่ทุกลิงก์ชี้ไปยังโดเมนจริงของคุณ เกิดจาก Absolute URL ในเทมเพลต ให้รันการตรวจสอบด้วย grep -o 'https\?://[^"]*' ตามที่ระบุไว้ข้างต้นและแก้ไขสิ่งที่แสดงผลก่อนที่คุณจะแชร์ที่อยู่นั้นไปยังที่ใดก็ตาม

ใช้งานได้ปกติ แต่หยุดทำงานหลังรีบูต ให้รีบูตเครื่องหนึ่งครั้งโดยตั้งใจก่อนที่คุณจะเริ่มใช้งานเว็บไซต์จริง จากนั้นรันคำสั่ง sudo systemctl status tor@default และ sudo systemctl status nginx บริการที่มีคนเริ่มด้วยมือจะมีลักษณะเหมือนกับบริการที่ถูกเปิดใช้งาน (enabled) จนกว่าเครื่องจะรีสตาร์ทใหม่

FAQ

ฉันจำเป็นต้องเปิดพอร์ตในไฟร์วอลล์สำหรับ Tor onion service หรือไม่?

ไม่จำเป็น tor daemon จะสร้างเฉพาะการเชื่อมต่อขาออกไปยัง directory servers, introduction points และ rendezvous relay แต่ละจุด ดังนั้นจึงไม่จำเป็นต้องมีกฎขาเข้า และตัวเว็บเซิร์ฟเวอร์เองจะฟังการเชื่อมต่อที่ 127.0.0.1 ให้คงค่า ufw ไว้ที่ default deny สำหรับทราฟฟิกขาเข้าโดยอนุญาตเฉพาะ SSH คุณสมบัตินี้ยังหมายความว่า onion service สามารถทำงานได้จากเครื่องที่อยู่หลัง NAT (network address translation) โดยไม่มี public IP เลย

ทำไมฉันถึงเข้าถึงที่อยู่ .onion ใน Tor Browser ไม่ได้?

ให้ตรวจสอบไล่จากเซิร์ฟเวอร์ออกมา sudo journalctl -u tor@default -n 50 ควรแสดงผลเป็น Bootstrapped 100% (done): Done จากนั้น curl -sI http://127.0.0.1:8080/ บนเซิร์ฟเวอร์ควรส่งคืนบรรทัดสถานะ แล้วจึงเปรียบเทียบที่อยู่ที่คุณพิมพ์กับไฟล์ hostname เนื่องจากตัวอักษรที่ผิดเพียงตัวเดียวก็ถือเป็นบริการที่แตกต่างกันทันที Onionsite Not Found (0xF0) หมายความว่าไม่พบ descriptor สำหรับที่อยู่นั้น ซึ่งโดยปกติหมายความว่า tor ไม่ได้ทำงานอยู่หรือนาฬิกาของระบบไม่ถูกต้อง

ฉันสามารถย้ายเว็บไซต์ onion ไปยังเซิร์ฟเวอร์ใหม่โดยใช้ที่อยู่เดิมได้หรือไม่?

ได้ ที่อยู่ถูกสร้างมาจาก hs_ed25519_secret_key ดังนั้นให้คัดลอกไฟล์ทั้งหมดใน HiddenServiceDir ไปยังเครื่องใหม่ ตั้งค่าความเป็นเจ้าของเป็น debian-tor และกำหนดสิทธิ์เป็น 700 แล้วเริ่มการทำงานของ tor ที่อยู่จะกลับมาใช้งานได้อีกครั้งเมื่อมีการเผยแพร่ descriptor ใหม่ และไม่มีระเบียน DNS ที่ต้องอัปเดต หากทำไฟล์นั้นหาย ที่อยู่ดังกล่าวจะไม่สามารถกู้คืนได้ ดังนั้นควรสำรองข้อมูลแบบเข้ารหัสและเก็บไว้นอกเซิร์ฟเวอร์ตั้งแต่วันที่คุณสร้างมันขึ้นมา

เว็บไซต์ onion จำเป็นต้องมีใบรับรอง HTTPS หรือไม่?

ไม่จำเป็น ที่อยู่ความยาว 56 ตัวอักษรคือ public key ของบริการ ดังนั้นการเชื่อมต่อจึงถูกเข้ารหัสและยืนยันตัวตนแบบ end-to-end อยู่แล้ว และ Tor Browser จะถือว่า http:// บนชื่อ .onion เป็นบริบทที่ปลอดภัย การนำใบรับรองจาก clearnet มาใช้ซ้ำบน onion vhost นั้นแย่ยิ่งกว่าการไม่ทำอะไรเลย เนื่องจากบันทึก Certificate Transparency เป็นข้อมูลสาธารณะและจะบันทึกไว้อย่างถาวรว่าชื่อใดบ้างที่ใช้ใบรับรองร่วมกัน เหตุผลเดียวที่จะซื้อใบรับรองสำหรับชื่อ .onion คือเพื่อการรับรองแบรนด์จาก CA ที่ออกใบรับรองให้ และลิงก์ดังกล่าวก็เป็นข้อมูลสาธารณะโดยการออกแบบอยู่แล้ว