在 Ubuntu 22.04 中监控服务器服务访问外网并显示目标外网 IP,可通过以下几种方法实现,覆盖实时监控、进程关联、流量抓包和日志记录等场景:

方法 1:使用 ss 实时查看当前外网连接(推荐)

ss 是 Linux 系统中高效的网络连接查看工具(替代传统的 netstat),可结合过滤规则筛选外网流量,并显示关联的进程信息。

步骤:

  1. 安装 ss(通常已预装)
    Ubuntu 22.04 默认已安装 ss,若未安装可通过 net-tools 包获取(但 ss 属于 iproute2,通常无需额外安装)。

  2. 实时监控外网连接
    执行以下命令,显示所有 TCP/UDP 外网连接(排除本地私有 IP 和回环地址),并关联进程:

    1. ss -tunap | grep -vE '127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])|::1'
    • 参数说明:
      • -t:仅显示 TCP 连接;-u:仅显示 UDP 连接;-n:不解析域名(直接显示 IP);-a:显示所有连接(包括监听);-p:显示关联的进程 PID/名称。
      • grep -vE:反向过滤,排除本地私有 IP(如 127.x.x.x192.168.x.x10.x.x.x172.16-31.x.x)和 IPv6 回环 ::1

    输出示例

    1. ESTAB 0 0 10.0.0.2:54321 172.217.16.142:443 users:(("curl",pid=1234,fd=3))
    2. UNCONN 0 0 192.168.1.100:53 0.0.0.0:* users:(("systemd-resolve",pid=567,fd=12))

    其中 172.217.16.142 即为访问的外网 IP。

方法 2(推荐):使用 nethogs 按进程监控网络流量(实时)

nethogs 可按进程维度显示网络流量(上传/下载速率),直接关联进程名和目标 IP。

步骤:

  1. 安装 nethogs

    1. sudo apt update && sudo apt install nethogs -y
  2. 运行监控
    以 root 权限启动(需监控所有进程):

    1. sudo nethogs
    2. # 捕获 TCP 和 UDP (推荐使用)
    3. nethogs -C
    • 输出示例:
      1. PID USER PROGRAM DEV SENT RECEIVED
      2. 1234 root curl eth0 0.000 1.234KB/s
      3. 5678 www-data nginx eth0 2.345KB/s 0.000
    • q 退出。若需查看具体目标 IP,可结合 sslsof(见下文)。
  3. 常用命令

    1. -v : 打印版本。
    2. -h : 打印本帮助。
    3. -b : 跟踪模式 - 意味着跟踪模式。
    4. -d:以秒为单位的更新刷新率延迟,默认为 1。
    5. -v:查看模式(0 = KB/s,1 = KB 总数,2 = B 总数,3 = MB 总数,4 = MB/s,5 = GB/s)。
    6. -c:更新次数。默认为 0(无限制)。
    7. -t:跟踪模式。
    8. -p:嗅探模式(不推荐)。
    9. -s:按发送列对输出排序。
    10. -l:显示命令行。
    11. -a:监控所有设备,甚至环回/停止的设备。
    12. -C:捕获 TCP 和 UDP。
    13. -f : 实验:指定 pcap 过滤器字符串(类似于 tcpdump)。设备:要监控的设备。默认为所有正常运行的接口,不包括环回接口。
  4. 运行模式下按键说明
    1. q 退出
    2. s 按照发送流量排序
    3. r 按照授受流量排序 # 默认此模式
    4. m 切换端口流量单位显示模式在B,KB,MB之间切换

方法 3:使用 tcpdump 抓包分析外网目标 IP

tcpdump 可捕获网络流量并过滤外网目标 IP,适合深度分析流量内容。

步骤:

  1. 安装 tcpdump(若未安装)

    1. sudo apt install tcpdump -y
  2. 捕获外网流量并显示目标 IP
    执行以下命令,捕获所有发往外网(非本地)的流量,并打印目标 IP 和端口:

    1. sudo tcpdump -i any 'dst net not 127.0.0.0/8 and dst net not 192.168.0.0/16 and dst net not 10.0.0.0/8 and dst net not 172.16.0.0/12'
    • 参数说明:
      • -i any:监听所有网络接口;
      • dst net not ...:排除本地私有 IP 段(可根据实际环境调整)。

    输出示例

    1. 14:23:45.123456 IP 10.0.0.2.54321 > 172.217.16.142.443: Flags [S], seq 123456789, win 65535, options [mss 1460], length 0

    其中 172.217.16.142 是目标外网 IP。

方法 4:结合 lsof 查看具体连接的进程

lsof 可列出所有打开的网络连接,并关联进程 PID 和名称,适合定位具体服务。

步骤:

  1. 安装 lsof(若未安装)

    1. sudo apt install lsof -y
  2. 查看外网连接及对应进程
    执行以下命令,显示所有连接到外网(非本地)的进程:

    1. sudo lsof -i | grep -vE '127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])'

    输出示例

    1. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    2. curl 1234 root 3u IPv4 123456 0t0 TCP 10.0.0.2:54321->172.217.16.142:443 (ESTABLISHED)

    其中 172.217.16.142 是目标外网 IP,curl 是发起连接的进程。

总结

  • 实时快速查看:优先使用 ss -tunapnethogs
  • 深度流量分析:使用 tcpdump 抓包。
  • 进程关联:结合 lsofss -p 定位具体服务。

根据需求选择合适的方法,若需自动化监控,可将命令写入脚本(如 cron 定时任务)或集成到监控系统(如 Prometheus)。