Không biết cái gì đang nghe trên cổng 80 trong OS X


34

Tôi đang dùng OSX Mountain Lion 10.8.3 và tôi mới khởi động lại máy Mac của mình.

Tôi muốn bắt đầu một dịch vụ (như Apache trên cổng 80), nhưng đã có điều gì đó xảy ra với cổng 80:

telnet localhost 80

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

Đợi đã, tôi nghe bạn nói, bạn có thể tìm thấy điều đó với lsof hoặc netstat. Ngoại trừ không có gì ở đó

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

*comes back blank*

lsof -i :80 | grep LISTEN

*comes back blank

Vậy từ những gì tôi biết về các hệ thống unix, tôi nghĩ đây phải là một quy tắc chuyển tiếp gói? Các gói tin đang được chuyển tiếp từ cổng 80 đến một thứ khác đang lắng nghe trên dịch vụ đó.

ipfw show

65535 0 0 allow ip from any to any

Hmm, không có gì bất thường ở đó

pfctl -s nat

No ALTQ support in kernel
ALTQ related functions disabled

Không có gì bất thường ở đó

Câu hỏi của tôi là, làm thế nào tôi có thể hiển thị bất kỳ quy tắc chuyển tiếp gói nào ... Trên Linux tôi có thể chỉ cần làm iptables -L -t NAT hoặc iptables -L. Hoặc cách khác, bất kỳ chuyên gia OSX có thể giúp tôi chẩn đoán vấn đề này?


Không phải là câu trả lời trực tiếp cho câu hỏi thú vị của bạn, nhưng: nếu bạn trỏ trình duyệt của mình tới http: // localhost thì sao?
Arjan

Các lsofgrep bạn sử dụng sẽ đến trống trở lại; số cổng được ánh xạ tới /etc/servicestên. Hãy thử lsof -i | grep http...
Nevin Williams

1
Trên thực tế, ánh xạ / etc / services không phải là vấn đề nếu bạn sử dụng -i :portđịnh dạng, chỉ khi bạn grep. Điều gì sẽ là một vấn đề là lsofcần có quyền riêng tư để xem các quy trình của người dùng khác, vì vậy bạn nên sử dụng sudo lsof -i :80(và tôi sẽ thử mà không cần grep, chỉ để đảm bảo ...)
Gordon Davisson

1
Xin chào tất cả, cảm ơn vì những lời đề nghị cho đến nay, nhưng không bật lên bất cứ điều gì - ngay cả khi đã root, và không có greps, không có gì được liệt kê là thực sự lắng nghe cổng 80.
geoff

Bạn đã thử lsof -i :80trong khi vẫn kết nối trong phiên Telnet đó chưa? Và ngoài việc thử http: // localhost / , có thể nhập nội dung nào đó tại dấu nhắc Telnet đó sẽ tiết lộ điều gì đó ...? (Một lần nữa, tôi biết: ngay cả khi bạn tìm ra nó theo cách đó, nó sẽ không phải là câu trả lời cho câu hỏi của bạn ...)
Arjan

Câu trả lời:


45

Bạn cần chạy các lệnh này rootđể hiển thị các quy trình của người dùng khác, ví dụ:

sudo lsof -i ':80'

Mac OS X bao gồm một máy chủ web Apache có thể được điều khiển bằng apachectlnhư root. Nó thường được bắt đầu thông qua launchd, tập tin cấu hình tương ứng là /System/Library/LaunchAgents/org.apache.httpd.plist. Nếu đó không phải là Apache này chạy trên cổng 80, thì có lẽ nó là launchd , do Apple thực hiện trình quản lý trình nền. Theo Wikipedia :

Khi launchd quét qua công việc, lúc khởi động, nó sẽ dự trữ và lắng nghe tất cả các cổng được yêu cầu bởi các công việc đó. Nếu được chỉ định trong phần chính bởi phím "OnDemand", thì daemon không thực sự được tải vào thời điểm đó. Thay vào đó, launchd sẽ lắng nghe trên cổng, khởi động daemon khi cần và tắt nó khi không. Sau khi một daemon được tải, launchd sẽ theo dõi nó và đảm bảo nó đang chạy nếu cần.


Vì vậy, sau đó tôi đoán ý tưởng của tôi là đúng mà sudo lsof -i ':80' có thể không thực sự trả lại bất cứ điều gì, trừ khi một người chạy nó trong khi được kết nối trong phiên Telnet? Nhưng ngay cả khi không có các lệnh đó, http: // localhost / có thể vẫn hiển thị một số trang chào mừng Apache?
Arjan

(Tôi tin rằng câu trả lời của bạn có lẽ là giải pháp; nó chỉ không phù hợp với tất cả các nhận xét từ OP.)
Arjan

1
Cảm ơn câu trả lời tuyệt vời này. Bây giờ tôi đã có thể giải quyết nó: 1. Có một lỗi trong httpd.conf, vì vậy bắt đầu sudo apachectl không bắt đầu apache. 2. Nhưng launchd đã lắng nghe trên cổng 80, sẵn sàng chuyển tiếp yêu cầu đến một máy chủ không tồn tại. 3. Tuy nhiên, launchd không nghe theo nghĩa thông thường - nghĩa là - kết quả của sudo lsof -i: 80 trống, tương tự như vậy đối với netstat 4. Tôi đoán launchd thực hiện một số phép thuật như xinetd ở chỗ nó không nghe chính thức một cổng, nhưng bằng cách nào đó quản lý để cho phép các kết nối đến cổng bằng cách mua chuộc kernel.
geoff

2
Đối với tôi những gì đã giải quyết vấn đề đang chạy sudo apachectl stoptrong thiết bị đầu cuối.
MikeiLL

Điều này không hiệu quả với tôi, nhưng phiên bản này đã cho thấy những gì đang chạy (OS High Sierra 10.13.6) sudo lsof -i -P | grep -i "80"từ superuser.com/questions/984919/
Kẻ

7

Chỉ để làm cho câu trả lời thực sự rõ ràng trong trường hợp người dùng đang tìm kiếm này.

  1. launchd quét /System/Library/LaunchDaemons/boot khi khởi động và hoạt động từ org.apache.httpd.plistđó khi apache được khởi động, nó cần chuyển tiếp cổng 80 lên nó.

  2. sudo apachectl start đã được thực hiện

  3. Tuy nhiên, có một lỗi trong httpd.conftệp có nghĩa là apache chưa được khởi động, mặc dù điều này không được báo cáo qua apachectllệnh.

  4. Launchd quyết định nghe trên cổng 80 vì nghĩ rằng apache đã lên.

  5. Nhưng nội dung của bất kỳ yêu cầu HTTP nào dẫn đến kết nối ngay lập tức.

  6. sudo lsof -i :80 không có câu trả lời

  7. sudo netstat -an | grep LISTEN không mang lại câu trả lời nào cho cổng 80

  8. không có thông tin nào cho đến nay tôi có thể nói trong bất kỳ công cụ chẩn đoán nào cho thấy cổng 80 đang được sử dụng hoặc nghe.

  9. sửa lỗi httpd.conf của apache và khởi động lại apache thành công để httpd nằm trong bảng ps, dẫn đến các yêu cầu HTTP thành công.

  10. Do đó, tôi đã nhầm lẫn rằng tôi không thể chạy apache vì đã có một cái gì đó lắng nghe trên cổng 80, thay vì chính apache conf là nguyên nhân


Vậy điều gì đã xảy ra với httpd.conf? Bây giờ tôi đang gặp vấn đề này và tôi không biết phải tiến hành như thế nào dựa trên câu trả lời của bạn ở đây .. ??
vẽ Angell

0

Tôi vừa gặp vấn đề tương tự với phần mềm diệt virus OSX El Capitan và Avast. sudo lsof -i ':80'cho thấy một kết nối đến 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)

tôi phải

  1. gỡ cài đặt Avast với /Applications/Uninstall Avast.app
  2. sudo rm -rf "/Library/Application Support/Avast" "/Applications/Avast Business Security.app" "/Applications/Uninstall Avast.app"
  3. khởi động lại

để ngăn chặn nó sử dụng cổng 80.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.