我正在测试一个打开其自己的端口的应用程序(充当这些端口的服务器,因此监听这些端口)并且同一个应用程序连接到其他应用程序绑定的端口(充当这些端口的客户端)。
我想了解该应用程序创建了哪些端口以及它连接到哪些应用程序和端口。
我怎样才能做到这一点?
答案1
你可以使用netstat
它。参见示例(我搜索了ssh
):
netstat -putan | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1725/sshd
tcp 0 0 1.2.3.4:45734 1.2.3.5:22 ESTABLISHED 2491/ssh
tcp6 0 0 :::22 :::* LISTEN 1725/sshd
解释:
我经常使用这些参数-putan
(因为它们容易记住)。
-p
:显示应用程序/进程的 PID-u
:显示 udp 端口/连接-t
:显示 tcp 端口/连接-a
:显示监听和非监听套接字-n
:数字输出(不进行主机名等的 DNS 查找)
在上面的输出中,你会看到有一个 ssh 守护进程 ( sshd
),其 PID在所有网络接口 ( ) 上的1725
端口处监听。此外,还有一个 ssh 客户端进程 (PID ) 连接到端口号为 的IP 地址,我的 IP 地址是,我的外部端口是。你会看到连接已建立。因此我通过 登录。22
0.0.0.0
2491
1.2.3.5
22
1.2.3.4
45734
ssh
答案2
另一个可以做到这一点的工具是lsof
:
# lsof -i -a -p 1981
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1981 root 3u IPv4 917 0t0 TCP host.example.com:ssh (LISTEN)
# lsof -i -a -p 1981 -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1981 root 3u IPv4 917 0t0 TCP 10.1.2.3:ssh (LISTEN)
# lsof -i -a -p 1981 -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1981 root 3u IPv4 917 0t0 TCP 10.1.2.3:22 (LISTEN)
#
使用的选项如下:
-i
打印出某个进程打开的互联网端口-a
使所有选项进行 AND 运算-p 1981
显示进程 1981 的输出-n
禁止主机名查找并显示 IP-P
禁止服务查找并显示端口号
lsof
其优点在于您可以指定要检查的进程,而不必从更大的输出中将其 grep 出来。 netstat
在系统上更可靠地可用,尽管lsof
它比以前变得更加标准化。
答案3
我们已经有了很好的答案,但它们只列出了命令运行时打开的端口。
strace
是监视应用程序生命周期内打开的连接的正确工具:
strace -e socket,connect,close -f -o hipchat.strace.txt hipchat
输出将显示其他信息,例如 UDP 请求和已打开但已关闭的连接。
答案4
ss -a4 | less
我假设您说的是 IPv4...如果不是,您可以将前面命令中的 4 替换为 6。-a 参数用于显示所有端口(监听和非监听)。如果您不想在显示中解析名称,则可以将 -n 添加到参数中。