ไม่รู้ว่ากำลังฟังอะไรที่พอร์ต 80 ใน OS X


34

ฉันใช้ OSX Mountain Lion 10.8.3 และฉันได้รีบูตเครื่อง Mac ใหม่

ฉันต้องการเริ่มบริการ (เช่น Apache บนพอร์ต 80) แต่มีบางอย่างเกิดขึ้นกับพอร์ต 80:

telnet localhost 80

Trying ::1...
Connected to localhost.
Escape character is '^]'.

เดี๋ยวก่อนฉันได้ยินคุณพูดแล้วคุณจะพบว่าด้วย lsof หรือ netstat ยกเว้นว่าไม่มีอะไรอยู่ที่นั่น

netstat -an | grep LISTEN | grep '\.80'

*comes back blank*

lsof -i :80 | grep LISTEN

*comes back blank

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

ipfw show

65535 0 0 allow ip from any to any

อืมไม่มีอะไรผิดปกติที่นั่น

pfctl -s nat

No ALTQ support in kernel
ALTQ related functions disabled

ไม่มีอะไรผิดปกติที่นั่น

คำถามของฉันคือฉันจะแสดงกฎการส่งต่อแพ็คเก็ตได้อย่างไร ... บน Linux ฉันอาจทำ iptables -L -t NAT หรือ iptables -L หรืออีกวิธีหนึ่งผู้เชี่ยวชาญ OSX สามารถช่วยฉันวินิจฉัยปัญหานี้ได้หรือไม่


ไม่ได้เป็นคำตอบที่ตรงไปยังคำถามที่น่าสนใจของคุณ แต่สิ่งที่ถ้าคุณเบราว์เซอร์ของคุณเพื่อhttp: // localhost ?
Arjan

lsofgrep ที่คุณใช้จะมาว่างเปล่ากลับ หมายเลขพอร์ตถูกแมปกับ/etc/servicesชื่อ ลองlsof -i | grep http...
เนวินวิลเลียมส์

1
ที่จริงแล้วการแมป / etc / services ไม่ได้เป็นปัญหาหากคุณใช้-i :portรูปแบบเฉพาะในกรณีที่คุณ grep สิ่งที่จะเป็นปัญหาคือlsofต้องใช้รูทส่วนตัวเพื่อดูกระบวนการของผู้ใช้คนอื่นดังนั้นคุณควรใช้sudo lsof -i :80(และฉันจะลองโดยไม่ต้องgrepทำเพื่อให้แน่ใจว่า ... )
Gordon Davisson

1
สวัสดีทุกคนขอขอบคุณสำหรับคำแนะนำจนถึงขณะนี้ แต่ยังไม่ปรากฏอะไรเลยแม้แต่ในฐานะที่เป็น root และไม่มี greps ไม่มีสิ่งใดที่แสดงรายการเหมือนฟังพอร์ต 80 อยู่จริง
geoff

คุณลองlsof -i :80ขณะที่ยังเชื่อมต่ออยู่ในเซสชัน Telnet หรือไม่? และนอกเหนือจากการลองhttp: // localhost /แล้วอาจพิมพ์บางอย่างที่ Telnet prompt แสดงบางสิ่ง ... (อีกครั้งฉันรู้: แม้ว่าคุณจะคิดออกวิธีการที่มันจะไม่เป็นคำตอบให้กับคำถามของคุณ ... )
Arjan

คำตอบ:


45

คุณต้องรันคำสั่งเหล่านี้rootเพื่อแสดงกระบวนการของผู้ใช้รายอื่นตัวอย่างเช่น

sudo lsof -i ':80'

Mac OS X รวมถึง Apache เว็บเซิร์ฟเวอร์ที่สามารถควบคุมการใช้เป็นapachectl rootมันเริ่มต้นมักจะผ่านแฟ้มการกำหนดค่าที่สอดคล้องกันคือlaunchd /System/Library/LaunchAgents/org.apache.httpd.plistหากไม่ใช่ Apache นี้ทำงานบนพอร์ต 80 อาจเป็นlaunchdซึ่งเป็นการนำ Daemon ไปใช้ของ Apple ตามที่Wikipedia :

เมื่อ launchd สแกนผ่านตัววางแผนงานในเวลาบูตมันจะสำรองและฟังพอร์ตทั้งหมดที่ร้องขอโดยงานเหล่านั้น หากระบุไว้ใน plist ด้วยปุ่ม "OnDemand" daemon จะไม่ถูกโหลดในเวลาจริง แต่ launchd จะฟังบนพอร์ตเริ่ม daemon เมื่อต้องการและปิดลงเมื่อไม่ได้ทำงาน หลังจากโหลด daemon แล้ว launchd จะติดตามมันและตรวจสอบให้แน่ใจว่ามันกำลังทำงานอยู่หากจำเป็น


ดังนั้นฉันเดาว่าความคิดของฉันถูกต้องที่จริง ๆ แล้วsudo lsof -i ':80' อาจไม่ส่งคืนสิ่งใดเลยเว้นแต่ว่ามีสิ่งใดที่ทำงานในขณะที่เชื่อมต่อในเซสชัน Telnet แต่ถึงแม้จะไม่มีคำสั่งเหล่านั้นhttp: // localhost /อาจจะยังคงแสดงหน้าต้อนรับของ Apache บ้าง
Arjan

(ผมเชื่อว่าคำตอบของคุณอาจจะเป็นวิธีการแก้มันก็ไม่ตรงกับความคิดเห็นทั้งหมดจากสหกรณ์.)
Arjan

1
ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ ตอนนี้ฉันสามารถแก้ไขได้: 1. มีข้อผิดพลาดใน httpd.conf ดังนั้นการเริ่ม sudo apachectl จึงไม่เริ่มต้น apache 2. แต่ launchd กำลังฟังบนพอร์ต 80 พร้อมที่จะส่งต่อคำขอไปยังเซิร์ฟเวอร์ที่ไม่มีอยู่จริง 3. อย่างไรก็ตามการเปิดตัวไม่ได้ฟังในความหมายทั่วไป - นั่นคือ - ผลลัพธ์ของ sudo lsof -i: 80 ว่างเปล่าเช่นเดียวกันกับ netstat 4. ฉันเดาว่า launchd จะใช้เวทย์มนตร์แบบ xinetd ซึ่งไม่ฟังอย่างเป็นทางการ พอร์ต แต่อย่างใดจัดการเพื่ออนุญาตการเชื่อมต่อกับพอร์ตโดยติดสินบนเคอร์เนล
geoff

2
สำหรับฉันสิ่งที่แก้ไขปัญหากำลังทำงานsudo apachectl stopอยู่ในสถานี
MikeiLL

นี้ไม่ได้ผลสำหรับฉัน แต่รุ่นนี้ไม่แสดงสิ่งที่กำลังวิ่ง (OS High Sierra 10.13.6) sudo lsof -i -P | grep -i "80"จากsuperuser.com/questions/984919/...
RoboBear

7

เพียงเพื่อให้คำตอบที่ชัดเจนในกรณีที่ผู้ใช้กำลังค้นหาสิ่งนี้

  1. launchd จะสแกน/System/Library/LaunchDaemons/เมื่อทำการบูทและทำงานออกมาจากorg.apache.httpd.plistมันเมื่อ apache เริ่มทำงานมันต้องส่งต่อพอร์ต 80 ไปยังมัน

  2. sudo apachectl start ได้ทำ

  3. อย่างไรก็ตามมีข้อผิดพลาดในhttpd.confไฟล์หมายถึง apache ไม่ได้เริ่มต้นแม้ว่าสิ่งนี้จะไม่ถูกรายงานผ่านapachectlคำสั่ง

  4. Launchd ตัดสินใจที่จะฟังบนพอร์ต 80 เพราะคิดว่าอะแพชเพิ่มขึ้น

  5. แต่เนื้อหาของคำขอ HTTP ใด ๆ ก็ส่งผลให้การเชื่อมต่อปิดทันที

  6. sudo lsof -i :80 ไม่ยอมตอบ

  7. sudo netstat -an | grep LISTEN ไม่ได้รับคำตอบสำหรับพอร์ต 80

  8. ไม่มีข้อมูลเท่าที่ฉันสามารถบอกได้ในเครื่องมือวินิจฉัยใด ๆ ที่แสดงว่าพอร์ต 80 ใช้งานหรือฟังอยู่

  9. การแก้ไข httpd.conf ของ apache และการรีสตาร์ท apache เป็นผลสำเร็จดังนั้น httpd อยู่ในตาราง ps ทำให้การร้องขอ HTTP เป็นผลสำเร็จ

  10. ฉันจึงเข้าใจผิดว่าฉันไม่สามารถเรียกใช้ apache ได้เพราะมีบางอย่างที่รับฟังในพอร์ต 80 แทนที่จะเป็นสาเหตุของ apache conf เอง


httpd.conf เกิดอะไรขึ้น ฉันมีปัญหานี้แล้วและฉันไม่แน่ใจว่าจะดำเนินการตามคำตอบของคุณได้ที่นี่ .. ??
Drew Angell

0

ฉันเพิ่งพบปัญหาเดียวกันนี้กับโปรแกรมป้องกันไวรัส OSX El Capitan และ Avast sudo lsof -i ':80'แสดงให้เห็นถึงการเชื่อมต่อกับ avast.com

me@destop ~|master$ sudo lsof -i ':80'
Password:
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.avast 7964 root   58u  IPv4 0xc4c1bba31fcc2c7f      0t0  TCP 192.168.100.111:52381->mia04-004.ff.avast.com:http (ESTABLISHED)

ฉันต้อง

  1. ถอนการติดตั้ง Avast ด้วย /Applications/Uninstall Avast.app
  2. sudo rm -rf "/Library/Application Support/Avast" "/Applications/Avast Business Security.app" "/Applications/Uninstall Avast.app"
  3. เริ่มต้นใหม่

เพื่อป้องกันไม่ให้ใช้พอร์ต 80

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