rpcbind ทำหน้าที่อะไร


39

ตามเอกสาร:

ยูทิลิตี้ rpcbind [3] จับคู่บริการ RPC กับพอร์ตที่พวกเขารับฟัง กระบวนการ RPC แจ้งเตือน rpcbind เมื่อเริ่มทำงานการลงทะเบียนพอร์ตที่กำลังรับฟังและหมายเลขโปรแกรม RPC ที่คาดว่าจะให้บริการ จากนั้นระบบไคลเอ็นต์จะติดต่อ rpcbind บนเซิร์ฟเวอร์ด้วยหมายเลขโปรแกรม RPC เฉพาะ บริการ rpcbind เปลี่ยนเส้นทางลูกค้าไปยังหมายเลขพอร์ตที่เหมาะสมเพื่อให้สามารถสื่อสารกับบริการที่ร้องขอ

เพื่อทดสอบสิ่งนี้ฉันตั้งค่าเซิร์ฟเวอร์ NFS และไคลเอนต์และตรวจสอบการรับส่งข้อมูลระหว่างพวกเขา จากสิ่งที่ฉันเห็นลูกค้ารู้อยู่แล้วว่าบริการ NFS บนเซิร์ฟเวอร์กำลังฟังพอร์ต 2049

แล้ว rcpbind จะเริ่มเล่นเมื่อไหร่? เมื่อฉันทำrpcinfoบนเซิร์ฟเวอร์ฉันได้รับต่อไปนี้:

100003    2    udp       0.0.0.0.8.1            nfs        superuser
100003    3    udp       0.0.0.0.8.1            nfs        superuser
100003    2    udp6      ::.8.1                 nfs        superuser
100003    3    udp6      ::.8.1                 nfs        superuser
100003    2    tcp       0.0.0.0.8.1            nfs        superuser
100003    3    tcp       0.0.0.0.8.1            nfs        superuser
100003    2    tcp6      ::.8.1                 nfs        superuser
100003    3    tcp6      ::.8.1                 nfs        superuser

สิ่งที่ไม่0.0.0.0.8.1ได้หมายความว่าในกรณีนี้หรือไม่? และนี่แปลเป็นพอร์ต 2049 อย่างไร

คำตอบ:


23

rpcbindเป็นอะนาล็อกใกล้ชิดของ BIND หรือเซิร์ฟเวอร์ DNS ใด ๆ ถ้าผมจำได้อย่างถูกต้องคุณเลือกหรือจะได้รับจำนวนโปรโตคอลเมื่อคุณรวบรวมประกาศอินเตอร์เฟซของ RPC rpcgenในเซิร์ฟเวอร์และต้นขั้วรหัสลูกค้าด้วย

เมื่อไคลเอนต์ลงทะเบียนสำหรับอินเทอร์เฟซที่กำหนดในโฮสต์เฉพาะมักจะมีการclnt_create()เรียกรหัส stub ถามrpcbindคำถามโฮสต์ที่บางอย่างเช่น "ในสิ่งที่ UDP หรือพอร์ต TCP เป็นหมายเลขโปรโตคอล X ฟัง?" rpcbindซึ่งแตกต่างจากบริการ ONC อื่น ๆ ส่วนใหญ่ฟังบนพอร์ต TCP และ UDP 111 ดังนั้นเมื่อกำหนดชื่อโฮสต์หรือที่อยู่ IP โปรแกรมก็สามารถถามrpcbindโฮสต์หรือที่อยู่ IP นั้นได้ rpcbindตอบสนองด้วยหมายเลขพอร์ตที่เหมาะสมหากเซิร์ฟเวอร์ได้ลงทะเบียนกับเซิร์ฟเวอร์บนโฮสต์นั้น svc_create()การลงทะเบียนที่ทำโดยกระบวนการเซิร์ฟเวอร์เมื่อมันสาย

ในตัวอย่างของคุณ 100003 คือหมายเลขโปรโตคอลสำหรับ NFS กระบวนการบางอย่างได้ลงทะเบียนด้วยrpcbindโดยระบุหมายเลขโปรโตคอล (100003) และพอร์ต TCP หรือ UDP ใดก็ตามที่ได้รับมา มันขึ้นอยู่กับrpcbindการให้หมายเลขพอร์ตนั้นอย่างถูกต้องในปี 2049 ในกรณีของคุณสำหรับการโทรใด ๆ สำหรับ "พอร์ตใดที่ฉันควรใช้สำหรับโปรโตคอลหมายเลข 100003"

ตอนนี้เรากำลังเข้าสู่ดินแดนที่น่ากลัว "0.0.0.0.8.1" อยู่ในคอลัมน์ "ที่อยู่" ของrpcinfoเอาต์พุต เนื่องจากนั่นคือ "ที่อยู่สากล" ของกระบวนการเซิร์ฟเวอร์ NFS ฉันจึงเดิมพันคำนำหน้า "0.0.0.0" เป็นที่อยู่ IP (INADDR_ANY ในกรณีนี้) ที่เซิร์ฟเวอร์ที่ใช้ในการbind()เรียกระบบเมื่อรับหมายเลขพอร์ต ฉันไม่แน่ใจว่าคำต่อท้าย "8.1" คืออะไร แต่การดูrpcinfoผลลัพธ์มันต้องมีบางสิ่งที่เกี่ยวข้องกับเซิร์ฟเวอร์ NFS โดยทั่วไปคือเคอร์เนลเธรด


ปัญหาที่ใหญ่ที่สุดในกรณีของฉันคือ II ไม่เห็นข้อความค้นหาเพื่อ rcpbind บนเซิร์ฟเวอร์โดยไคลเอนต์เมื่อฉันตรวจสอบปริมาณการใช้เครือข่าย คุณรู้หรือไม่เมื่อมีการสอบถามหมายเลขพอร์ตนี้เกิดขึ้น
SivaDotRender

@SivaDotRender - ฉันไม่แน่ใจ 100% แต่ฉันเชื่อว่าเมื่อรหัสลูกค้าเรียก clnt_create () เพื่อรับหมายเลขอ้างอิงสำหรับโปรโตคอลและโฮสต์ มันอาจจะทำผ่าน UDP เว้นแต่ว่าคุณจะตั้งค่าสิ่งทั้งหมดให้ใช้ TCP
Bruce Ediger

29
"8.1" คือสองไบต์ของหมายเลขพอร์ต 2049 = (8 * 256) + 1
Kenster

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