🌐
VPS

เมื่อเปิดเซิร์ฟเวอร์ Minecraft Java Edition พอร์ตเริ่มต้นคือ 25565 ผู้เล่นจึงพิมพ์แค่ชื่อโดเมนก็เข้าได้ แต่ถ้าคุณรันเซิร์ฟเวอร์บนพอร์ตอื่น (เช่นมีหลายเซิร์ฟเวอร์ในเครื่องเดียว หรือ VPS จัดพอร์ตให้) ผู้เล่นจะต้องพิมพ์ play.example.com:25577 ซึ่งจำยากและดูไม่มืออาชีพ วิธีแก้ที่สะอาดที่สุดคือการสร้าง DNS SRV record ซึ่งจะบอกไคลเอนต์ Minecraft โดยอัตโนมัติว่าต้องต่อไปที่โฮสต์และพอร์ตใด ทำให้ผู้เล่นพิมพ์แค่ play.example.com ก็พอ

SRV record คืออะไรและทำงานอย่างไร

SRV (Service) record เป็นเรคคอร์ด DNS มาตรฐานตาม RFC 2782 ที่ใช้ระบุว่า "บริการ" หนึ่ง ๆ ทำงานอยู่ที่โฮสต์และพอร์ตใด แทนที่จะชี้แค่ IP เหมือน A record ทั่วไป SRV record จะพก priority, weight, port และ target มาด้วย ไคลเอนต์ Minecraft Java จะค้นหา SRV record ชื่อ _minecraft._tcp.<ชื่อที่ผู้เล่นพิมพ์> ก่อนเสมอ ถ้าพบก็จะเชื่อมต่อไปยังพอร์ตที่ระบุโดยผู้เล่นไม่ต้องรู้เลยว่าพอร์ตจริงคืออะไร

หัวใจสำคัญคือ SRV record ไม่ได้ชี้ไปที่ IP โดยตรง แต่ชี้ไปที่ "ชื่อโฮสต์" (target) ซึ่งต้อง resolve ได้ผ่าน A record (หรือ AAAA สำหรับ IPv6) อีกทอดหนึ่ง ดังนั้นการตั้งค่าจึงมีสองขั้นตอนเสมอ

ขั้นที่ 1: สร้าง A record ให้โฮสต์ก่อน

ก่อนอื่นต้องมีชื่อโฮสต์ที่ชี้ไปยัง IP ของเซิร์ฟเวอร์ เช่นสร้าง subdomain mc.example.com ให้ชี้ไปที่ IP จริง

; A record — ชี้ชื่อโฮสต์ไปยัง IP ของเซิร์ฟเวอร์
mc.example.com.        3600  IN  A     203.0.113.45

; ถ้ามี IPv6 ให้เพิ่ม AAAA ด้วย
mc.example.com.        3600  IN  AAAA  2001:db8::45

ชื่อ mc.example.com นี้จะถูกใช้เป็น target ของ SRV record ในขั้นถัดไป โปรดจำไว้ว่า target ต้องเป็นชื่อโฮสต์เท่านั้น ห้ามใส่เป็น IP ตรง ๆ

ขั้นที่ 2: สร้าง SRV record สำหรับ Java Edition

รูปแบบ SRV record ของ Minecraft Java มีองค์ประกอบดังนี้ service คือ _minecraft โปรโตคอลคือ _tcp ตามด้วย subdomain ที่ผู้เล่นจะพิมพ์ (เช่น play) ตัวอย่างแบบ BIND zone file

; SRV record — priority weight port target
; ชื่อเต็ม: _minecraft._tcp.play.example.com
_minecraft._tcp.play   IN  SRV  0 5 25577 mc.example.com.

บรรทัดนี้อ่านว่า เมื่อผู้เล่นพิมพ์ play.example.com ให้ไคลเอนต์ต่อไปยังโฮสต์ mc.example.com ที่พอร์ต 25577 โดยมี priority 0 และ weight 5 สังเกตว่า target ลงท้ายด้วยจุด (.) เสมอเพื่อบอกว่าเป็นชื่อเต็ม (FQDN)

ความหมายของแต่ละฟิลด์ใน SRV record

ฟิลด์ตัวอย่างค่าความหมาย
Service_minecraftชื่อบริการ นำหน้าด้วยขีดล่างเสมอ สำหรับ Minecraft ใช้ค่านี้ตายตัว
Proto_tcpโปรโตคอล Java ใช้ _tcp (Bedrock ใช้ _udp)
Nameplaysubdomain ที่ผู้เล่นพิมพ์ ถ้าต้องการที่โดเมนหลักให้ปล่อยว่างหรือใช้ @
TTL3600เวลาแคช (วินาที) ยิ่งต่ำยิ่งอัปเดตไว แต่ query บ่อยขึ้น
Priority0เลขต่ำมาก่อน ใช้จัดลำดับหลายเซิร์ฟเวอร์ ทั่วไปตั้ง 0
Weight5ถ่วงน้ำหนักเมื่อ priority เท่ากัน ใช้กระจายโหลด ทั่วไปตั้ง 5
Port25577พอร์ตจริงที่เซิร์ฟเวอร์รันอยู่
Targetmc.example.com.ชื่อโฮสต์ปลายทาง ต้องมี A/AAAA record และลงท้ายด้วยจุด

กฎทองของ SRV record สำหรับ Minecraft: Service = _minecraft, Proto = _tcp (Java), Target = ชื่อโฮสต์ที่ resolve ได้ ไม่ใช่ IP เพียงจำสามข้อนี้ ที่เหลือคือรายละเอียดของแต่ละแผงควบคุม DNS

วิธีกรอกใน DirectAdmin, Cloudflare และผู้ให้บริการโดเมน

แต่ละแผงควบคุม DNS แสดงฟิลด์ SRV ต่างกัน บางที่แยกเป็นช่องย่อย บางที่รวมเป็นบรรทัดเดียว จึงมักเป็นจุดที่คนตั้งผิดบ่อย

DirectAdmin

ใน DirectAdmin ไปที่ DNS Management แล้วเลือกชนิดเรคคอร์ดเป็น SRV โดยทั่วไปช่อง Name ให้กรอก _minecraft._tcp.play และช่อง Value กรอก 0 5 25577 mc.example.com. (priority weight port target) บางเวอร์ชันแยกช่อง Priority ออกมาต่างหาก ให้กรอกเฉพาะ 5 25577 mc.example.com. ในช่อง Value

Cloudflare

Cloudflare แยกฟิลด์ชัดเจน โดยมีช่อง Service (_minecraft), Protocol (TCP), Name (play หรือ @), TTL, Priority, Weight, Port และ Target แยกกัน กรอกทีละช่องได้ตรง ๆ และควรตั้งเรคคอร์ดเป็น DNS only (เมฆสีเทา) เพราะ Cloudflare proxy ไม่รองรับพอร์ต Minecraft

ผู้ให้บริการโดเมน/รีจิสตราร์ทั่วไป

รีจิสตราร์หลายรายรวมทุกอย่างไว้ในบรรทัดเดียว หรือให้กรอก Name แบบเต็ม บางรายเติม service/proto ให้อัตโนมัติเมื่อเลือกชนิด SRV ควรอ่านตัวอย่างของแต่ละแผงและอย่าใส่ _minecraft._tcp ซ้ำถ้าระบบเติมให้แล้ว

ที่ AsiaGB เราจัดการ DNS ผ่าน DirectAdmin และไม่บังคับให้ใช้ Cloudflare คุณจึงเพิ่ม SRV record ได้เองจากแผง DNS Management ได้ทันที VPS Linux เริ่มต้น 500 บาท/เดือน ใช้ SSD และการันตี uptime 99%

ตรวจสอบว่า SRV record ทำงานด้วย dig หรือ nslookup

หลังตั้งค่าแล้วอย่าเพิ่งเชื่อว่าใช้ได้ ให้ query ตรวจสอบก่อนเสมอ บน Linux/macOS ใช้ dig

$ dig SRV _minecraft._tcp.play.example.com +short
0 5 25577 mc.example.com.

# หรือดูแบบเต็ม
$ dig SRV _minecraft._tcp.play.example.com

# บน Windows ใช้ nslookup
> nslookup -type=srv _minecraft._tcp.play.example.com

ถ้าผลลัพธ์แสดง priority weight port target ครบถ้วนตามที่ตั้ง แสดงว่า SRV record ถูกเผยแพร่แล้ว จากนั้นลอง dig A mc.example.com เพื่อยืนยันว่า target ชี้ไป IP ถูกต้องด้วย

เรื่อง DNS propagation และ TTL

เรคคอร์ดใหม่หรือที่แก้ไขต้องใช้เวลากระจายไปทั่วโลก โดยขึ้นกับค่า TTL อาจใช้เวลาตั้งแต่ไม่กี่นาทีจนถึง 48 ชั่วโมง ถ้าคาดว่าจะแก้บ่อยควรตั้ง TTL ต่ำ (เช่น 300 วินาที) ไว้ก่อน แล้วค่อยเพิ่มเมื่อค่านิ่งแล้ว ระหว่างรอถ้า dig ยังไม่เห็นเรคคอร์ด ให้ลอง query ตรงไปยัง resolver สาธารณะ เช่น dig SRV _minecraft._tcp.play.example.com @1.1.1.1

Bedrock Edition ต่างจาก Java อย่างไร

Bedrock Edition รองรับ SRV record เช่นกันแต่ใช้โปรโตคอล _udp และพอร์ตเริ่มต้น 19132 รูปแบบคือ _minecraft._udp.play อย่างไรก็ตามต้องพูดตามตรงว่า ไคลเอนต์ Bedrock จำนวนมากไม่สนใจ SRV record โดยเฉพาะบนคอนโซลและมือถือ ทำให้พฤติกรรมไม่แน่นอน ทางเลือกที่เชื่อถือได้กว่าคือให้ผู้เล่น Bedrock กรอกพอร์ตในช่อง Port ของหน้าเพิ่มเซิร์ฟเวอร์โดยตรง

; ตัวอย่าง SRV สำหรับ Bedrock (ไม่รับประกันทุกไคลเอนต์)
_minecraft._udp.play   IN  SRV  0 5 19133 mc.example.com.

ข้อควรระวังและความเข้าใจผิดที่พบบ่อย

SRV record ไม่ได้ซ่อน IP ของเซิร์ฟเวอร์ ใครก็ตามที่ query DNS จะเห็น target และ resolve เป็น IP จริงได้ทันที ดังนั้น SRV ไม่ใช่การป้องกัน DDoS การซ่อน IP จริงต้องใช้บริการ proxy/anti-DDoS แยกต่างหาก ซึ่งเป็นคนละเรื่องกัน

สรุปขั้นตอนแบบย่อ

  1. สร้าง A record ให้ mc.example.com ชี้ไปยัง IP ของเซิร์ฟเวอร์
  2. สร้าง SRV record _minecraft._tcp.play ชี้ไปยัง target mc.example.com. พร้อมพอร์ตจริง
  3. ตรวจสอบด้วย dig SRV หรือ nslookup -type=srv
  4. รอ propagation ตาม TTL แล้วให้ผู้เล่นพิมพ์แค่ play.example.com

เพียงเท่านี้ผู้เล่นก็เชื่อมต่อเซิร์ฟเวอร์ Java Edition ของคุณได้ด้วยชื่อโดเมนสั้น ๆ โดยไม่ต้องจำหมายเลขพอร์ตอีกต่อไป

คำถามที่พบบ่อย (FAQ)

ต้องสร้าง A record ก่อนสร้าง SRV record ไหม

ต้องสร้างก่อนเสมอ เพราะ SRV record ชี้ไปที่ "ชื่อโฮสต์" (target) ไม่ใช่ IP โดยตรง ชื่อโฮสต์นั้น เช่น mc.example.com จำเป็นต้องมี A record (หรือ AAAA สำหรับ IPv6) ที่ resolve เป็น IP จริงได้ ไม่เช่นนั้นไคลเอนต์จะต่อไม่ติดแม้ SRV จะถูกต้อง

ทำไมตั้ง SRV record แล้วผู้เล่นยังต้องพิมพ์พอร์ตอยู่

สาเหตุที่พบบ่อยคือ target ใส่เป็น IP แทนชื่อโฮสต์ ลืมจุดท้าย target ในไฟล์ zone ใส่ service/proto ซ้ำ หรือ DNS ยังไม่ propagate ให้ตรวจด้วย dig SRV _minecraft._tcp.play.example.com ก่อน ถ้ายังไม่เห็นเรคคอร์ดให้รอตาม TTL หรือ query ตรงไปที่ 1.1.1.1

SRV record ช่วยซ่อน IP เพื่อกัน DDoS ได้ไหม

ไม่ได้ SRV record เปิดเผย target ซึ่ง resolve เป็น IP จริงได้ทันทีผ่าน query DNS ธรรมดา จึงไม่ใช่การป้องกัน DDoS หากต้องการซ่อน IP จริงต้องใช้บริการ proxy หรือ anti-DDoS แยกต่างหากซึ่งเป็นคนละกลไกกับ SRV

Bedrock Edition ใช้ SRV record ได้เหมือน Java ไหม

Bedrock รองรับในทางทฤษฎีโดยใช้ _minecraft._udp และพอร์ตเริ่มต้น 19132 แต่ไคลเอนต์ Bedrock จำนวนมาก โดยเฉพาะบนคอนโซลและมือถือ ไม่สนใจ SRV record จึงไม่น่าเชื่อถือ ทางที่ชัวร์กว่าคือให้ผู้เล่น Bedrock กรอกหมายเลขพอร์ตในช่อง Port ตอนเพิ่มเซิร์ฟเวอร์เอง

พร้อมเปิดเซิร์ฟเวอร์ Minecraft ของคุณแล้วหรือยัง?

AsiaGB VPS Linux (SSD, DirectAdmin, uptime 99%) เริ่มต้น 500 บาท/เดือน ดาต้าเซ็นเตอร์ไทย/สิงคโปร์ ปิงต่ำ เหมาะกับเซิร์ฟ Minecraft ทุกขนาด

ดูแพ็กเกจ VPS