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


46

ฉันต้องการเรียกใช้เว็บเซิร์ฟเวอร์บน Mac ของฉันเป็นกระบวนการที่ไม่ใช่รูท โดยปกติกระบวนการรูทเท่านั้นที่สามารถผูกกับพอร์ต 80 (หรือพอร์ตใดก็ได้ที่ต่ำกว่า 1024)

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


ที่เกี่ยวข้อง: link1 , link2
นาธานฟาร์ริงตัน

ชอบคำถามunix.stackexchange.com มากกว่านี้ใช่ไหม
Filip Bartuzi

1
ทำไม unix หากอยู่ในระบบ macos
nhed

คำตอบ:


27

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

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

ชี้พอร์ต 80 ไปยังพอร์ตอื่นเช่น 8080

โดยการกำหนดค่าเครื่องของคุณใหม่เพื่อส่งทราฟฟิกพอร์ต 80 ไปยังพอร์ต 8080 หรือพอร์ตใด ๆ ที่คุณเลือกจากนั้นคุณสามารถอนุญาตให้เซิร์ฟเวอร์พื้นที่ผู้ใช้รับพอร์ตสิทธิ์พิเศษในพื้นที่ที่ได้รับการเข้าถึง

กระบวนการตรงไปตรงมา:

ขั้นตอนที่ 1: ดูกฎไฟร์วอลล์ปัจจุบัน

sudo ipfw show

ขั้นตอนที่ 2: เพิ่มกฎการส่งต่อพอร์ต (80 ถึง 8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

หากคุณต้องการลบกฎไฟร์วอลล์ที่รันอยู่

sudo ipfw flush

(ที่มา )

นี่เป็นการเปลี่ยนแปลงชั่วคราวและจะคืนค่าเมื่อคุณรีบูทหรือล้างข้อมูลตามที่ระบุไว้ในบรรทัดสุดท้าย

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

ใช้ Authbind

Authbind ได้รับการออกแบบมาโดยเฉพาะเพื่อให้โปรแกรมหนึ่งเข้าถึงพอร์ตระดับต่ำกว่าโดยไม่ต้องให้สิทธิ์เข้าถึงแบบเต็ม

มีพอร์ต OS X:

https://github.com/Castaglia/MacOSX-authbind

มันอาจยัง จำกัด การรับส่งข้อมูล IPv4 แต่คุณอาจต้องทำการตรวจสอบเพิ่มเติมเพื่อค้นหาว่าตรงกับความต้องการของคุณหรือไม่


รัก MacOSX-authbind ... มันช่วยให้คุณสามารถรันตัวอย่างเช่นเว็บเซิร์ฟเวอร์บนพอร์ต 80 - ในฐานะ "ผู้ดูแลระบบปกติ" นั่นคือในของคุณlaunchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
alex grey

13
ipfwเอา OS X โยเซมิตี สรุปสาระสำคัญนี้pfอธิบายถึงวิธีการแก้ปัญหาโดยใช้ทางเลือก
lyschoening

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

authbind เป็นทางออกที่ดีจริงๆขอบคุณ!
favo

7

คุณสามารถใช้ncatเพื่อส่งต่อปริมาณข้อมูลจากเว็บเซิร์ฟเวอร์ที่ทำงานบนพอร์ตอื่น:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

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

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


2
นี่เป็นวิธีแก้ปัญหาที่ดี NB ncatมาพร้อมกับnmapที่สามารถติดตั้งผ่านทางพอร์ต Mac sudo port install nmapกับ MacPorts ตัวเองสามารถติดตั้งจากmacports.org/install.php
William Denniss

นี่เพิ่งทำให้ฉันผูก: ที่อยู่มีข้อผิดพลาดในการใช้งาน
Matt Joiner

เหมือนกันที่นี่ - ไม่ทำงาน นี่เป็นกลอุบาย: unix.stackexchange.com/a/187038
เซบาสเตียนเจ.

2

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

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh user@127.0.0.1 -L 80:127.0.0.1:8080

การส่งต่อพอร์ต Ssh อาจมีประสิทธิภาพค่อนข้างต่ำและคุณลักษณะด้านความปลอดภัยไม่ได้ทำให้รู้สึกมากในสภาพแวดล้อมท้องถิ่น -> ท้องถิ่น ดีกว่าที่จะใช้การส่งต่อพอร์ตในตัวของ osx หรือบางอย่างเช่น ncat
เชน

-3

สิ่งที่คุณควรทำคือเปิดพอร์ต 80 บนเราเตอร์ของคุณแล้วชี้ไปยังที่อยู่ IP ในเครื่องของเว็บเซิร์ฟเวอร์ของคุณ จากนั้นใน Mac ของคุณเปิดใช้งาน Web Sharing จากบานหน้าต่างการตั้งค่าระบบ> การตั้งค่าการแชร์และชี้ไปที่ไดเรกทอรีที่คุณเลือก สิ่งนี้ได้ผลสำหรับฉันในอดีตจนกระทั่งสลับไปยังเซิร์ฟเวอร์ 10.6


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

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

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