วิธีใช้ DNS / ชื่อโฮสต์หรือวิธีอื่น ๆ ในการแก้ไข IP ที่เฉพาะเจาะจง: พอร์ต


51

นี่เป็นคำถามที่ยอมรับได้เกี่ยวกับการแก้ปัญหา DNS / ชื่อโฮสต์เป็น IP / พอร์ต

ตัวอย่างที่ 1

ฉันใช้งานเว็บเซิร์ฟเวอร์ที่พอร์ต 80 และอีกพอร์ตหนึ่งที่พอร์ต 87 ฉันต้องการใช้ DNS เพื่อให้ www.example.com ไปที่พอร์ต 87 ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไรโดยใช้ DNS เท่านั้น

ตัวอย่างที่ 2

ฉันใช้บริการบนเซิร์ฟเวอร์ของฉันบนพอร์ตที่ไม่ได้มาตรฐาน ฉันจะให้ลูกค้าเชื่อมต่อกับพอร์ตที่ไม่ได้มาตรฐานนี้โดยอัตโนมัติได้อย่างไร ฉันสามารถใช้ DNS ได้หรือไม่ มีการสนับสนุนเฉพาะแอปพลิเคชันที่ DNS สามารถระบุ IP และพอร์ตได้หรือไม่

ตัวอย่างที่ 3

แอปพลิเคชั่นโปรโตคอลบางอย่างสนับสนุนการรับรู้ชื่อโฮสต์และอนุญาตให้มีการดำเนินการพิเศษตามข้อมูลนี้หรือไม่? มีคำถามอื่น ๆ เกี่ยวกับข้อบกพร่องของเซิร์ฟเวอร์ที่ครอบคลุมบางส่วนหรือไม่

Commandeering:แต่เดิมคำถามนี้ถามเกี่ยวกับการเรียกใช้ IIS และ Apache บนเซิร์ฟเวอร์เดียวกัน แต่แนวคิดเดียวกันนี้สามารถนำไปใช้กับซอฟต์แวร์เซิร์ฟเวอร์ใดก็ได้ที่รับการเชื่อมต่อจากไคลเอนต์ คำตอบด้านล่างอธิบายถึงปัญหาทางเทคนิคและวิธีแก้ปัญหาของการใช้ DNS และการสนับสนุนโปรโตคอลแอปพลิเคชันเพื่อกำหนดหมายเลขพอร์ตสำหรับไคลเอนต์ที่จะเชื่อมต่อ


เกี่ยวกับตัวอย่างที่สามผู้อ่านอาจต้องการตรวจสอบคำถามมาตรฐานของเราเกี่ยวกับการสร้างชื่อโฮสต์ที่รับรู้ด้วยโปรโตคอล
MadHatter

คำตอบ:


34

คุณไม่สามารถใช้ DNS เพื่อชี้ไปที่พอร์ต (เว้นแต่ลูกค้าจะสนับสนุนระเบียน SRV ส่วนใหญ่ไม่ได้)

เว็บไซต์และโปรโตคอลด้วย Host Headers

คุณจะต้องวางวิธีการส่วนหน้าไว้เพื่อทำสิ่งนี้ โดยทั่วไปคุณจะใช้เว็บเซิร์ฟเวอร์หรือซอฟต์แวร์พร็อกซี่เฉพาะเพื่อส่งต่อการเชื่อมต่อจากพอร์ต 80 ไปยังพอร์ต! 80 ตามชื่อของเซิร์ฟเวอร์ที่ถูกร้องขอในส่วนหัว ไฟร์วอลล์บางตัวยังสามารถส่งต่อตามส่วนหัวของโฮสต์ด้วย

ระเบียน SRV

ลูกค้าบางรายสนับสนุนการค้นหาระเบียน SRV ซึ่งระบุชื่อโฮสต์และหมายเลขพอร์ตของเซิร์ฟเวอร์สำหรับบริการที่ระบุ (เช่นผู้ใช้ระบุ "example.com" ลูกค้าค้นหาระเบียน SRV และรับ "server101.example.com" บนพอร์ต "255 "; เชื่อมต่อกับนั้น) ลูกค้าบางรายใช้สิ่งนี้ในที่ที่ไม่จำเป็น (สมาร์ทโฟนเครื่องสุดท้ายของฉันจะค้นหาเรคคอร์ด SRV เมื่อตั้งค่าบัญชีอีเมลใหม่เช่น)

น่าเสียดายที่การรองรับเรคคอร์ด SRV นั้นไม่ธรรมดาอย่างมาก มีโปรโตคอลที่โดดเด่นเพียงไม่กี่แห่งเท่านั้นที่รองรับ (Jabber / XMPP, Kerberos, LDAP, SIP) และไม่ใช่ว่าทุกไคลเอ็นต์จะรองรับแม้ว่าจะได้รับคำสั่งก็ตาม


15

เมื่อคุณพิมพ์http://www.domain.comลงในเบราว์เซอร์ของคุณเป็นที่เข้าใจกันว่าพอร์ต HTTP นั้นอยู่ที่ 80 ดังนั้นจึงไม่มีวิธีโดยตรงที่จะชี้ www.domain.com ไปที่พอร์ต 87 หากคุณมีบริการอยู่แล้ว ทำงานบนพอร์ตนั้นใน IIS

ที่ถูกกล่าวว่ามี "การแก้ไขปัญหา" ไม่กี่

  • เพียงใช้http://www.domain.com:87/ - สิ่งนี้จะเชื่อมต่อกับพอร์ต 87 (apache) บนเซิร์ฟเวอร์ของคุณ
  • คุณสามารถตั้งค่าการเปลี่ยนเส้นทางเพื่อให้http://www.domain.com/apacheส่งต่อ (หรือพร็อกซีหากคุณต้องการจินตนาการ) ไปที่ www.domain.com:87
  • คุณสามารถตั้งค่า "VirtualHost" เพื่อให้ www.domain2.com ยังคงอยู่ในพอร์ต 80 ที่แชร์กับ www.domain.com คุณไม่สามารถตั้งค่านี้ได้โดยไม่ต้องแก้ไข IIS

แซมถูกต้อง DNS ไม่เชื่อเรื่องพระเจ้าเมื่อพูดถึงพอร์ต การเปลี่ยนเส้นทางพอร์ตใด ๆ เกิดขึ้นโดยบริการที่ใช้งานบนพอร์ตนั้น ดังนั้นคุณจะต้องทำอะไรกับ IIS เพื่อให้สิ่งนี้เกิดขึ้นถ้าคุณไม่มีทางเลือกนอกจากปล่อยไว้ที่พอร์ต 80

ฉันยังได้รับสถานการณ์ของคุณโดยใช้ mod_proxy ใน Apache ไม่แน่ใจว่ามีวิธีในการทำเช่นนี้กับ IIS


ตกลงดังนั้นจะตั้งค่าพร็อกซีบน IIS ได้อย่างไร
Tomasz Smykowski

2
ถ้าเป็น IIS7 คุณสามารถใช้ Application Request Routing (ARR)
Scott Forsyth - MVP

1
สกอตต์คุณมีลิงค์ที่ดีสำหรับเอกสารเกี่ยวกับ ARR หรือไม่?
Jacques

12

ฉันเกรงว่าชื่อโดเมนจะเชื่อมโยงกับที่อยู่ IP เท่านั้นไม่ใช่พอร์ต

เว็บเซิร์ฟเวอร์ส่วนใหญ่เช่น (Apache, IIS ฯลฯ ) อนุญาตให้คุณมีสองโดเมนที่โฮสต์บนที่อยู่ IP เดียวกันโดยใช้ข้อเท็จจริงที่ว่าคำขอของเว็บมีฟิลด์ส่วนหัวของโฮสต์ที่ระบุโดเมนในคำขอของตัวเอง

ถ้าคุณบอกว่าเว็บเซิร์ฟเวอร์คืออะไรที่คุณใช้อยู่ฉันมั่นใจว่าผู้คนสามารถชี้ให้คุณไปยังเอกสารที่เกี่ยวข้องเพื่อตั้งค่าเซิร์ฟเวอร์ของคุณตามที่คุณต้องการ


นั่นคือประเด็น ฉันใช้เว็บเซิร์ฟเวอร์สองเครื่อง
โอมาร์อิดอิด

12

ในทางเทคนิคคุณสามารถใช้ระเบียน SRVบนเซิร์ฟเวอร์ DNS ตามที่กำหนดไว้ในRFC 2782 เพื่อบอกเบราว์เซอร์ว่าเซิร์ฟเวอร์ใดจัดการ http ที่พอร์ตสำหรับโดเมน (ย่อย -):

_http._tcp.www.example.com.  IN      SRV 0    5      80   www.example.com.
_http._tcp.www2.example.com. IN      SRV 0    5      87   www.example.com.

วิธีนี้ใช้ได้ดีสำหรับโปรโตคอล / บริการจำนวนมากโดยเฉพาะอย่างยิ่งเมื่อมีการกำหนดระเบียน SRV ไว้แล้วในข้อกำหนดคุณสมบัติโปรโตคอล

อย่างไรก็ตามเนื่องจากสถานะ " Hall of Shame " นี้เว็บเบราว์เซอร์ / ไคลเอนต์ส่วนใหญ่ไม่สนับสนุนสิ่งนี้ (สำหรับ HTTP) นอกจากนี้ยังเห็นว่าทำไมต้องทำเบราว์เซอร์ที่ไม่ใช้ srv ระเบียน

โดยทั่วไปดีลนั้น SRV จะไม่รวมอยู่ในโปรโตคอล http เนื่องจากทุกเบราว์เซอร์ที่ใช้จะแก้ไข URL ต่างจากเบราว์เซอร์ที่ไม่ได้ใช้

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


6

DNS ไม่มีความสามารถในการเปลี่ยนเส้นทางไปยังพอร์ตเฉพาะ DNS ทั้งหมดใส่ใจคือการแก้ปัญหาที่อยู่ IP ของชื่อและในทางกลับกัน

บริการบางอย่างเช่นผู้ให้บริการ Dynamic IP DNS เช่นNO-IPมีบริการที่สามารถช่วยคุณทำสิ่งที่คล้ายกันเพื่อรับการบล็อก IP ของบริการ DNS ภายในบ้าน


ผู้รับจดทะเบียนบางราย (GoDaddy) เสนอการส่งต่อโดเมนผ่านเซิร์ฟเวอร์ที่จอดไว้ คุณสามารถให้ช็อตนั้นได้ แต่มันเป็นเรื่องเล็กน้อย หรือคุณสามารถเขียนเว็บเบราว์เซอร์ของคุณเองที่มีลักษณะขึ้นระเบียน SRV และพยายามที่จะโน้มน้าวให้โลกที่จะใช้มัน :)
เจสัน Antman

6

เพื่อใช้บริการ(TBT) ใด ๆบนพอร์ตที่ไม่ได้มาตรฐานและไม่เขียนพอร์ตใน URI ทุกคนสามารถใช้เรคคอร์ด SRV ที่กำหนดใน RFC 2782

_http._tcp.www.example.com. IN      SRV 0    5      87   www.example.com.

http โฮสต์อื่น ๆ ทั้งหมดในโซนจะยังคงให้บริการในพอร์ตเริ่มต้น 80


3
+1 สำหรับการชี้ให้เห็นว่าข้อความด้านล่างหลายรายการไม่ถูกต้องตราบใดที่ข้อมูลจำเพาะไป - DNS สามารถระบุพอร์ตบริการผ่านเรคคอร์ด SRV ได้ แต่ก็ถือว่าลูกค้ารู้ว่าจะขอบันทึก SRV ก่อน
mcauth

2

วิธีที่ง่ายที่สุดคือการใช้ reverse proxy และตั้งเป็น proxy เว็บของคุณ คุณสามารถกำหนดค่าnginxหรือapacheเพื่อ ฉันมีปัญหาเดียวกันโดยทั่วไปในอดีตและสร้างเครื่องมือเพื่อให้บรรลุการกำหนดค่าดังกล่าวในวิธีที่ง่าย Ergo: https://github.com/cristianoliveira/ergo

ฉันเคยใช้สิ่งนี้และโดยพื้นฐานแล้วทำงานเหมือนมีเสน่ห์ :)


0

วิธีหนึ่งในการปรับใช้เว็บเซิร์ฟเวอร์สองเครื่องบนโฮสต์เดียวกันคือให้ทั้งคู่ฟังพอร์ต 80 บนที่อยู่ IPv6 สองที่แตกต่างกัน IPv6 ระบุอย่างเป็นทางการว่าคุณสามารถกำหนดที่อยู่สองแห่งให้กับอินเทอร์เฟซและมีที่อยู่ IPv6 เพียงพอที่คุณสามารถทำได้โดยไม่ต้องมีที่อยู่ไม่เพียงพอ

นี่เป็นข้อพิสูจน์ในอนาคตและโดเมนทั้งสองของคุณสามารถมีระเบียน AAAA ที่ชี้ไปยังที่อยู่ IP ที่แตกต่างกันดังนั้นโดเมนจึงลงเอยด้วยการที่เว็บเซิร์ฟเวอร์ต่างๆ

หากคุณมีที่อยู่ IPv4 เดียวเช่นกันคุณสามารถใช้พอร์ต 80 บนที่อยู่ IPv4 เพื่อเรียกใช้พร็อกซีย้อนกลับ วิธีนี้ลูกค้า IPv4 เท่านั้นสามารถเข้าถึงได้ทั้งเว็บเซิร์ฟเวอร์ของคุณ วิธีย้อนกลับของพร็อกซีใช้งานได้แม้ว่าเว็บเซิร์ฟเวอร์บางแห่งอยู่บนโฮสต์เดียวกันกับพร็อกซีย้อนกลับและบางเว็บเซิร์ฟเวอร์อยู่ในโฮสต์อื่น

เช่นในการติดตั้งexample.orgอาจจะมีที่อยู่192.0.2.1และ2001:db8::1ในขณะที่example.netมีที่อยู่และ192.0.2.12001:db8::2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.