Tidak tahu apa yang sedang mendengarkan pada port 80 di OS X

34

Saya menggunakan OSX Mountain Lion 10.8.3, dan saya baru saja mem-boot ulang Mac saya.

Saya ingin memulai layanan (seperti Apache pada port 80), tetapi sudah ada sesuatu yang terjadi dengan port 80:

telnet localhost 80

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

Tunggu, saya mendengar Anda berkata, Anda dapat menemukannya dengan lsof atau netstat. Kecuali tidak ada apa pun di sana

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

*comes back blank*

lsof -i :80 | grep LISTEN

*comes back blank

Jadi dari apa yang saya ketahui tentang sistem unix, saya pikir ini harus menjadi aturan penerusan paket? Yaitu paket sedang diteruskan dari port masuk 80 ke sesuatu yang lain, yang mendengarkan layanan itu.

ipfw show

65535 0 0 allow ip from any to any

Hmm, tidak ada yang aneh di sana

pfctl -s nat

No ALTQ support in kernel
ALTQ related functions disabled

Tidak ada yang aneh di sana

Pertanyaan saya adalah, bagaimana saya bisa menampilkan aturan penerusan paket ... Di Linux saya mungkin hanya melakukan iptables -L -t NAT, atau iptables -L. Atau sebagai alternatif, dapatkah pakar OSX membantu saya mendiagnosis masalah ini?

geoff
sumber
Bukan jawaban langsung untuk pertanyaan menarik Anda, tetapi: bagaimana jika Anda mengarahkan browser Anda ke http: // localhost ?
Arjan
The lsofgrep Anda digunakan akan datang kosong kembali; nomor port dipetakan ke /etc/servicesnama. Coba lsof -i | grep http...
Nevin Williams
1
Sebenarnya, pemetaan / etc / services tidak menjadi masalah jika Anda menggunakan -i :portformat, hanya jika Anda mau. Apa yang akan menjadi masalah adalah yang lsofmembutuhkan root privs untuk melihat proses pengguna lain, jadi Anda harus menggunakan sudo lsof -i :80(dan saya akan mencobanya tanpa grep, hanya untuk memastikan ...)
Gordon Davisson
1
Hai semua, terima kasih atas sarannya sejauh ini, tetapi belum menemukan apa pun - bahkan sebagai root, dan tanpa greps, tidak ada yang terdaftar sebagai benar-benar mendengarkan port 80.
geoff
Apakah Anda mencoba lsof -i :80saat masih terhubung di sesi Telnet itu? Dan selain mencoba http: // localhost / , mungkin mengetik sesuatu di prompt Telnet itu mengungkapkan sesuatu ...? (Sekali lagi, saya tahu: bahkan jika Anda mengetahuinya seperti itu, itu tidak akan menjadi jawaban untuk pertanyaan Anda ...)
Arjan

Jawaban:

45

Anda perlu menjalankan perintah ini rootuntuk menunjukkan proses pengguna lain, misalnya:

sudo lsof -i ':80'

Mac OS X menyertakan server web Apache yang dapat dikontrol menggunakan apachectlas root. Biasanya dimulai melalui launchd, file konfigurasi yang sesuai adalah /System/Library/LaunchAgents/org.apache.httpd.plist. Jika ini bukan Apache yang berjalan pada port 80, kemungkinan launchd , implementasi daemon manager dari Apple. Menurut Wikipedia :

Ketika launchd memindai melalui daftar pekerjaan pada saat boot, cadangan dan mendengarkan semua port yang diminta oleh pekerjaan itu. Jika demikian ditunjukkan dalam plist oleh kunci "OnDemand", daemon sebenarnya tidak dimuat pada saat itu. Sebaliknya, launchd akan mendengarkan pada port, memulai daemon saat dibutuhkan, dan mematikannya saat tidak. Setelah daemon dimuat, launchd akan melacaknya dan memastikannya berjalan jika diperlukan.

Daniel Beck
sumber
Jadi saya kira ide saya benar yang sudo lsof -i ':80' mungkin tidak benar-benar mengembalikan apa pun, kecuali ada yang menjalankannya saat terhubung dalam sesi Telnet? Tetapi bahkan tanpa perintah-perintah itu, http: // localhost / mungkin masih akan menampilkan halaman selamat datang di Apache?
Arjan
(Saya percaya jawaban Anda mungkin solusinya; tidak cocok dengan semua komentar dari OP.)
Arjan
1
Terima kasih atas jawaban yang brilian ini. Saya sekarang telah berhasil menyelesaikannya: 1. Ada kesalahan di httpd.conf, jadi sudo apachectl start tidak memulai apache. 2. Tetapi launchd mendengarkan pada port 80, siap untuk meneruskan permintaan ke server yang tidak ada. 3. Namun launchd tidak mendengarkan dalam pengertian konvensional - yaitu - hasil dari sudo lsof -i: 80 kosong, demikian juga untuk netstat 4. Saya kira launchd melakukan beberapa keajaiban seperti xinetd karena tidak secara resmi mendengarkan pada sebuah port, tetapi entah bagaimana berhasil mengizinkan koneksi ke port dengan menyuap kernel.
geoff
2
Bagi saya yang memecahkan masalah adalah menjalankan sudo apachectl stopdi terminal.
MikeiLL
Ini tidak berfungsi untuk saya, tetapi versi ini memang menunjukkan apa yang sedang berjalan (OS High Sierra 10.13.6) sudo lsof -i -P | grep -i "80"dari superuser.com/questions/984919/…
RoboBear
7

Hanya untuk memperjelas jawaban yang sebenarnya jika pengguna mencari ini.

  1. launchd memindai /System/Library/LaunchDaemons/boot saat dan berhasil dari org.apache.httpd.plistitu ketika apache dimulai ia perlu meneruskan port 80 ke sana.

  2. sudo apachectl start selesai

  3. Namun ada kesalahan dalam httpd.conffile yang berarti apache tidak dimulai, meskipun ini tidak dilaporkan melalui apachectlperintah.

  4. Launchd memutuskan untuk mendengarkan pada port 80 karena dianggap apache naik.

  5. Tetapi isi dari setiap permintaan HTTP menghasilkan penutupan koneksi segera.

  6. sudo lsof -i :80 tidak menghasilkan jawaban

  7. sudo netstat -an | grep LISTEN tidak menghasilkan jawaban untuk port 80

  8. tidak ada informasi sejauh yang saya tahu dalam alat diagnostik yang menunjukkan bahwa port 80 sedang digunakan atau mendengarkan.

  9. memperbaiki httpd.conf apache dan me-restart apache dengan sukses sehingga httpd ada di tabel ps, membuat permintaan HTTP berhasil.

  10. Karena itu saya salah bahwa saya tidak dapat menjalankan apache karena sudah ada sesuatu yang mendengarkan pada port 80, daripada apache conf itu sendiri yang menjadi penyebabnya.

geoff
sumber
Jadi apa yang salah dengan httpd.conf? Saya mengalami masalah ini sekarang dan saya tidak yakin bagaimana untuk melanjutkan berdasarkan jawaban Anda di sini .. ??
Drew Angell
0

Saya baru saja mengalami masalah yang sama dengan OSX El Capitan dan Avast antivirus. sudo lsof -i ':80'menunjukkan koneksi ke 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)

saya harus

  1. uninstall Avast dengan /Applications/Uninstall Avast.app
  2. sudo rm -rf "/Library/Application Support/Avast" "/Applications/Avast Business Security.app" "/Applications/Uninstall Avast.app"
  3. mengulang kembali

untuk mencegahnya menggunakannya port 80.

spyle
sumber