Nie mam pojęcia, co nasłuchuje na porcie 80 w OS X.

34

Korzystam z systemu OSX Mountain Lion 10.8.3 i niedawno zrestartowałem komputer Mac.

Chcę uruchomić usługę (jak Apache na porcie 80), ale już coś się dzieje z portem 80:

telnet localhost 80

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

Czekaj, słyszę jak mówisz, możesz to znaleźć za pomocą lsof lub netstat. Tyle że nic tam nie ma

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

*comes back blank*

lsof -i :80 | grep LISTEN

*comes back blank

Więc z tego, co wiem o systemach uniksowych, uważam, że to musi być reguła przekazywania pakietów? Tj. Pakiety są przekazywane z portu wejściowego 80 do czegoś innego, który nasłuchuje w tej usłudze.

ipfw show

65535 0 0 allow ip from any to any

Hmm, nie ma w tym nic niezwykłego

pfctl -s nat

No ALTQ support in kernel
ALTQ related functions disabled

Nie ma w tym nic niezwykłego

Moje pytanie brzmi: w jaki sposób mogę wyświetlić dowolne reguły przekazywania pakietów ... W systemie Linux mogę po prostu zrobić iptables -L -t NAT lub iptables -L. Czy też eksperci OSX mogą pomóc mi zdiagnozować ten problem?

geoff
źródło
Nie bezpośrednia odpowiedź na interesujące pytanie, ale: co jeśli skierujesz przeglądarkę na http: // localhost ?
Arjan
lsofGrep użyłeś wróci puste; numery portów są mapowane na /etc/servicesnazwy. Spróbuj lsof -i | grep http...
Nevin Williams
1
W rzeczywistości mapowanie / etc / services nie stanowi problemu, jeśli używasz -i :portformatu, tylko jeśli grep. Problemem będzie to, że lsofpotrzebuje uprawnień roota, aby zobaczyć procesy innych użytkowników, więc powinieneś użyć sudo lsof -i :80(i spróbowałbym tego bez grep, tylko dla pewności ...)
Gordon Davisson
1
Cześć wszystkim, dziękuję za sugestie, ale jak dotąd nie znalazłem niczego - nawet jako root, i bez grepsów, nic nie jest wymienione jako słuchanie portu 80.
geoff
Czy próbowałeś, lsof -i :80będąc nadal połączonym w tej sesji Telnet? A poza próbą http: // localhost / , może wpisanie czegoś w wierszu polecenia Telnet ujawni coś ...? (Znów wiem: nawet jeśli wymyślisz to w ten sposób, nie byłaby to odpowiedź na twoje pytanie ...)
Arjan

Odpowiedzi:

45

Musisz uruchomić te polecenia, rootaby pokazać procesy innych użytkowników, na przykład:

sudo lsof -i ':80'

Mac OS X zawiera serwer WWW Apache, którym można sterować za pomocą apachectlas root. Zwykle jest uruchamiany za launchdpomocą odpowiedniego pliku konfiguracyjnego /System/Library/LaunchAgents/org.apache.httpd.plist. Jeśli nie jest to Apache działający na porcie 80, prawdopodobnie jest uruchomiony , implementacja menedżera demonów przez Apple. Według Wikipedii :

Po uruchomieniu skanuje za pośrednictwem list zadań w czasie rozruchu, rezerwuje i nasłuchuje na wszystkich portach wymaganych przez te zadania. Jeśli jest to zaznaczone na liście przez klawisz „OnDemand”, demon nie jest aktualnie ładowany. Raczej uruchomi nasłuchuje na porcie, uruchomi demona w razie potrzeby i wyłączy go, gdy nie będzie. Po załadowaniu demona uruchomione będzie go śledzić i w razie potrzeby upewni się, że działa.

Daniel Beck
źródło
Więc sądzę, że mój pomysł był słuszny, który sudo lsof -i ':80' może nic nie zwrócić, chyba że ktoś uruchomi to podczas połączenia w sesji Telnet? Ale nawet bez tych poleceń http: // localhost / prawdopodobnie nadal pokazywałby stronę powitalną Apache?
Arjan
(Wierzę, że twoja odpowiedź jest prawdopodobnie rozwiązaniem; po prostu nie pasuje do wszystkich komentarzy OP).
Arjan
1
Dzięki za tę genialną odpowiedź. Teraz udało mi się go rozwiązać: 1. Wystąpił błąd w httpd.conf, więc uruchomienie sudo apachectl nie uruchomiło apache. 2. Uruchomiono nasłuchiwanie na porcie 80, gotowe do przekazywania żądań do nieistniejącego serwera. 3. Jednak uruchomione nie nasłuchiwało w konwencjonalnym sensie - to znaczy - wyniki sudo lsof -i: 80 były puste, podobnie jak w przypadku netstat 4. Wydaje mi się, że uruchomione ma trochę magii jak xinetd, ponieważ oficjalnie nie słucha port, ale jakoś udaje mu się zezwolić na połączenia z portem przez przekupienie jądra.
geoff
2
Dla mnie to, co rozwiązało problem, działało sudo apachectl stopw terminalu.
MikeiLL
To nie dla mnie, ale ta wersja nie pokazać, co zostało uruchomione (OS High Sierra 10.13.6) sudo lsof -i -P | grep -i "80"od superuser.com/questions/984919/...
RoboBear
7

Aby wyjaśnić rzeczywistą odpowiedź na wypadek, gdyby użytkownicy tego szukali.

  1. launchd skanuje /System/Library/LaunchDaemons/przy starcie systemu i działa na org.apache.httpd.plisttym etapie , gdy apache jest uruchamiany, musi przekierować na niego port 80.

  2. sudo apachectl start zostało zrobione

  3. Jednak w httpd.confpliku wystąpił błąd , co oznacza, że ​​apache nie został uruchomiony, chociaż nie zostało to zgłoszone za pomocą apachectlpolecenia.

  4. Launchd postanowił nasłuchiwać na porcie 80, ponieważ myślał, że apache jest uruchomiony.

  5. Ale treść dowolnego żądania HTTP spowodowała natychmiastowe zamknięcie połączenia.

  6. sudo lsof -i :80 nie dał odpowiedzi

  7. sudo netstat -an | grep LISTEN nie przyniósł odpowiedzi dla portu 80

  8. o ile mogłem powiedzieć w żadnych narzędziach diagnostycznych, które wskazywałyby, że port 80 był w użyciu lub nasłuchiwał, nie było żadnych informacji.

  9. naprawienie httpd.conf apache i pomyślne zrestartowanie apache tak, aby httpd był w tabeli ps, doprowadził żądania HTTP do powodzenia.

  10. Dlatego myliłem się, że nie mogłem uruchomić apache, ponieważ już coś nasłuchiwało na porcie 80, a nie sama apache conf była przyczyną

geoff
źródło
Więc co było nie tak z httpd.conf? Mam teraz ten problem i nie jestem pewien, jak postępować w oparciu o twoją odpowiedź tutaj .. ??
Drew Angell,
0

Właśnie natrafiłem na ten sam problem z OSX El Capitan i programem antywirusowym Avast. sudo lsof -i ':80'pokazał połączenie z 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)

musiałem

  1. odinstaluj Avast za pomocą /Applications/Uninstall Avast.app
  2. sudo rm -rf "/Library/Application Support/Avast" "/Applications/Avast Business Security.app" "/Applications/Uninstall Avast.app"
  3. uruchom ponownie

aby zapobiec używaniu go przez port 80.

spyle
źródło