Как я могу составить список открытых сетевых портов с помощью netstat?

Я хотел бы перечислить мои открытые сетевые порты в Терминале со встроенными командами. Насколько я знаю, netstatэто команда для использования. Но я изо всех сил пытаюсь получить какую-либо полезную информацию из него.

Как я могу перечислить свои открытые порты с помощью netstat? Любые конкретные флаги, которые помогают мне в этом случае?

Ответы (5)

netstat -anvp tcp | awk 'NR<3 || /LISTEN/'

Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)     rhiwat shiwat    pid   epid  state    options
tcp46      0      0  *.62981                *.*                    LISTEN      131072 131072  34548      0 0x0100 0x00000006

sudo lsof -PiTCP -sTCP:LISTEN

COMMAND     PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
BetterTou 34548 grgarside   20u  IPv4 0xa42a1d0ade5d3585      0t0  TCP *:62981 (LISTEN)
BetterTou 34548 grgarside   21u  IPv6 0xa42a1d0ad67f7a5d      0t0  TCP *:62981 (LISTEN)
lsofliner прекрасен, поскольку он также раскрывает метаданные процесса и пользователя и может выполняться без sudoсужения области действия.

возможно, вы можете использовать lsof:

lsof -Pn -i4

-i4 означает показывать только адреса и порты ipv4 -P и -n быстрый вывод

вывод такой

➜  lsof -Pn -i4 | grep LISTEN
QQPlatfor 22767 xxxx   15u  IPv4 0x36c2bfa04e49385d      0t0  TCP *:49969 (LISTEN)
GoAgentX  33377 xxxx    4u  IPv4 0x36c2bfa06e68b12d      0t0  TCP *:56154 (LISTEN)
GoAgentX  33377 xxxx   20u  IPv4 0x36c2bfa04e492f8d      0t0  TCP 127.0.0.1:56155 (LISTEN)
lsofперечисляет открытые файлы. Сетевые сокеты считаются файлами, поэтому каждый открытый сетевой сокет (слушающий или активно используемый) будет указан в файле lsof.

Во-первых, я не эксперт BSD, но, как и в случае с OP, мне нужен был грубый эквивалент запуска следующего на * nix-боксе или что-то близкое:

netstat -tulpn

Я читал другие вопросы/ответы, предлагающие lsof* и netstat* на MacOS, и мне все еще хотелось что-то с более компактным выводом. Итак, вот что я быстро собрал:

netstat -Watnlv | grep LISTEN | awk '{"ps -o comm= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print cred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname;  }' | column -t -s "|"

Это немного излишество, поэтому я добавил цвет на выходе для хорошей меры. Так как я не смогу вспомнить или захотеть напечатать этого бегемота. Я помещаю его в функцию bash, а затем просто вызываю ее, когда это необходимо. Вот указанная функция bash:

macnst (){
    netstat -Watnlv | grep LISTEN | awk '{"ps -o comm= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print colred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname;  }' | column -t -s "|"
}

У меня есть небольшая коллекция этих удобных функций в файле, который я беру из ~/.bash_profile или ~/.zshrc. Это добавляется в коллекцию. Было бы интересно увидеть другие возможности сделать это лучше/тоньше.

Пример вывода:

> macns
proto: tcp4     addr.port: 127.0.0.1.9999     pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.35729            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62087            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62070            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp46    addr.port: *.62085            pid: 70078    name:  /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java
proto: tcp4     addr.port: *.61993            pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
proto: tcp46    addr.port: *.61992            pid: 70065    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.42329    pid: 70065    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.61983    pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.63342    pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.6942     pid: 70043    name:  /Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre/bin/java
proto: tcp4     addr.port: 127.0.0.1.3075     pid: 67931    name:  /Applications/electerm.app/Contents/Frameworks/electerm Helper.app/Contents/MacOS/electerm Helper
proto: tcp6     addr.port: *.58640            pid: 320      name:  /usr/libexec/rapportd
proto: tcp4     addr.port: *.58640            pid: 320      name:  /usr/libexec/rapportd
proto: tcp4     addr.port: 127.0.0.1.9770     pid: 71       name:  /Applications/Pritunl.app/Contents/Resources/pritunl-service

Самый простой метод заключается в использовании netstat:

$ netstat -ap tcp
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  10.0.2.23.58792        17.172.233.109.5223    ESTABLISHED
tcp4      87      0  my_iMac__at_home.55481 stackoverflow.co.http  ESTABLISHED
tcp4     116      0  my_iMac__at_home.55478 stackoverflow.co.http  ESTABLISHED
tcp4      58      0  my_iMac__at_home.63452 stackoverflow.co.http  ESTABLISHED
tcp4      87      0  my_iMac__at_home.63429 stackoverflow.co.http  ESTABLISHED
tcp4       0      0  localhost.63173        localhost.773          ESTABLISHED
tcp4       0      0  localhost.773          localhost.63173        ESTABLISHED
tcp4       0      0  localhost.63173        *.*                    LISTEN     
tcp4       0      0  localhost.63172        *.*                    LISTEN     
tcp4       0      0  localhost.ipp          *.*                    LISTEN     
tcp6       0      0  localhost.ipp          *.*                    LISTEN     

… без какой-либо дополнительной фильтрации, чтобы получить правильные заголовки и увидеть, как прослушивающие серверы, так и уже установленные соединения в обоих направлениях. В этом примере 1-я строка показывает связь от моего Mac к 17.172.233.109, что далее:

whois 17.172.233.109

научил меня, что он находится в Apple.

Этот ответ идентичен уже принятому ответу
Если вы не понимаете ключевого отличия, просто попробуйте его в реальном случае атаки, и вы увидите, какой из них лучше всего подходит для вашей защиты.
Я понимаю ключевое отличие, которое заключается в принятых фильтрах ответов только для портов прослушивания, и это лучший ответ на вопрос «как я могу перечислить свои открытые порты?» Просмотр всех соединений имеет значение в других случаях (например, при атаке), но это не то, что обсуждается здесь.
Вы видите один порт, который не открыт в выводе netstat, который я привел здесь?
вывод netstat будет значительно различаться. Например, я запустил вашу версию прямо сейчас, и она показывает все прослушиваемые порты, а также около 100 УСТАНОВЛЕННЫХ соединений. Поэтому, если моя цель состоит в том, чтобы составить список моих открытых портов, фильтрация всего остального — просто лучшее решение.
Разве вы не знаете, что ваши установленные соединения находятся на открытых портах? Или вы подразумеваете под «открытым» порт, который открыт, но еще не используется? С моей точки зрения, это еще один интересный вопрос: «Как я могу перечислить свои открытые сетевые порты, которые не используются». Возможно, вам следует провести тест nmap, чтобы понять, почему я считаю важным видеть, что действительно открыто, а не просто пассивные порты, ожидающие соединения.

Основываясь на отличном ответе @kroolk, я бы предложил этот однострочник:

netstat -Watnlv | grep LISTEN | awk '{"ps -ww -o args= -p " $9 | getline procname;colred="\033[01;31m";colclr="\033[0m"; print colred "proto: " colclr $1 colred " | addr.port: " colclr $4 colred " | pid: " colclr $9 colred " | name: " colclr procname; }' | column -t -s "|"

... который не будет обрезать вывод ps(по крайней мере, на моем Mac) и даст полную команду, включая аргументы :-)