ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TCP/IP核心:从网络层到传输层,理解端口扫描与安全排查

TCP/IP核心:从网络层到传输层,理解端口扫描与安全排查 这次我们来看 TCP/IP 协议栈里出场率最高的两层网络层和传输层。这是《零基础入门到 SEC 挖洞实战》系列的第 32 讲但即使前面漏了几讲只要用过网线、连过 WiFi、见过“连接被重置”这一讲都能直接跟下来。先说为什么要单独拆这两层。搞安全的人日常做的端口扫描、抓包分析、服务识别、看防火墙日志、读漏洞报告几乎全部绕不开网络层和传输层的概念。你以为“知道 IP 地址和端口号”就够了但一打开 Wireshark 看到 SYN、ACK、FIN、RST 就分不清谁先谁后一看到扫描工具输出 open、filtered、closed 不知道怎么解释问题往往就出在两层协议的状态机没吃透。这一讲我会做三件事先讲清网络层和传输层各自负责什么把 IP、ICMP、端口、TCP/UDP 这些概念一次性理顺畅然后带你在自己电脑上做两组验证实验用命令行和抓包工具真实看一遍数据包最后把这些知识接到 SEC 挖洞的实际场景里告诉你“会看端口状态”到底意味着什么。全程只需要一台能联网的电脑Windows 或 Linux 都行不需要服务器不需要特殊硬件。1. 本讲核心能力速览维度本讲内容协议层网络层IP、ICMP、路由、传输层TCP、UDP、端口核心概念IP 地址、端口范围、三次握手、四次挥手、TCP 标志位实战价值端口扫描、服务识别、抓包分析、排查“端口开放”类问题硬件要求一台能联网的电脑Windows / Linux / macOS 均可常用工具ping、tracert/traceroute、netstat、ss、tcpdump、Wireshark、nmap适用读者零基础转安全、SRC 挖洞入门、准备安全岗面试的基础巩固合规边界所有扫描和抓包操作仅限自有环境、实验环境或已获授权的测试范围先给结论网络层负责“把数据从一台机器送到另一台机器”传输层负责“把数据交给这台机器上的哪个应用”。一个管跨网络的寻址和路由一个管本机的进程与数据分发。两者配合才算把一次通信链路完整串起来。2. 网络层IP、路由与 ICMP2.1 网络层在协议栈里的位置网络层在 OSI 模型里是第三层在 TCP/IP 模型里也处于承上启下的位置。它下面是以太网、WiFi 这类负责“在一个局域网内把帧送到邻居”的技术上面是 TCP、UDP 这样的传输层协议。也就是说网络层解决的是“跨网络怎么走”的问题而不仅限于隔壁几台机器。封装关系大概是这样应用数据 → TCP/UDP 段 → IP 数据报 → 以太网帧。你在网卡上抓到的一个以太网帧剥开链路层头部后首先看到的就是 IP 头。以后做流量分析时这个顺序会反复出现越早形成印象越好。2.2 IP 协议的基本职责IP 协议Internet Protocol的核心职责有三个编址、封装和选路。编址就是每个接口要有唯一的 IP 地址。IPv4 地址是 32 位通常写成 192.168.1.10 这种点分十进制IPv6 是 128 位写成 2001:db8::1 这种十六进制形式。搞安全的人最常接触的资产信息就是“IP:端口”所以第一件事就是把 IP 地址的构成搞明白哪些是网络位、哪些是主机位、子网掩码怎么影响判断这直接决定资产归属和攻击面划分。封装指上层数据要被打上 IP 头才能传输。IP 头里有一个字段做安全分析时会反复出现建议现在就记住源 IP、目的 IP一眼看出通信双方协议号标识上层是 TCP6、UDP17还是 ICMP1TTL每经过一个路由器减 1为 0 就丢弃用来防止环路也用来推断跳数标识、标志、分片偏移数据超过 MTU 时会分片分析异常流量时经常盯着这几个字段。选路就是路由器根据目的 IP 查路由表把数据报往下一跳送。路由表越精细路径越可控。安全视角下不需要你把路由协议全背下来但必须理解一条原则数据在网络上不是“直连”而是逐跳转发。中间每一跳都可能做检查、改包、拦截这也是网络层攻防的底层逻辑。2.3 ICMP 与 pingICMPInternet Control Message Protocol是网络层的辅助协议它不传输用户业务数据专门用来传递“诊断和错误信息”。最常见的就是 ping 用的 ICMP Echo Request类型 8和 Echo Reply类型 0。ping 通不通能反映几个意思通说明中间链路和目的主机 IP 栈在线不通可能是主机离线、防火墙禁 ICMP、路由不可达、TTL 超时等等需要结合具体返回码判断返回“Destination unreachable”和“Time to live exceeded”是两种完全不同的网络状态前者通常是路由或防火墙问题后者通常是 TTL 太小或者路径环路。tracertWindows 命令Linux 下是 traceroute利用的就是 ICMP 超时报告原理先发一个 TTL1 的包收到超时回复后就拿到第一跳地址再发 TTL2一步步把路径上每个路由器的地址列出来。这也是网络层知识最直观的一次应用做网络类问题时很好用。2.4 网络安全视角看网络层从挖洞或安全测试的角度看网络层能帮你做三件事第一是资产发现。知道目标有哪些 IP、哪些网段在线才能谈下一步。很多 SRC 任务的测试范围就是一张 IP 清单不会读地址段连测试边界都理解不了。第二是网络拓扑推测。通过 TTL、路由跳数、ICMP 返回类型可以粗略判断目标在网络里的位置以及前面是否有防护设备。第三是理解访问控制。防火墙规则、ACL 大多围绕 IP 和端口来写看不懂这些规则就说不清楚“为什么这个端口从外面扫显示过滤状态”。顺带提一句ARP 负责把 IP 地址解析成 MAC 地址严格说属于链路层和网络层之间的关键机制。在同一个局域网里做测试时ARP 相关实验是常见练习点但它属于链路层范畴这里不展开后面讲到链路层时会单独说。3. 传输层端口、TCP 与 UDP3.1 传输层在安全测试中的重要性如果说网络层解决“数据到哪台机器”传输层就解决“数据交给机器上的哪个进程”。这个“进程寻址”的机制就是端口。安全测试里整个“端口扫描”动作本质上就是在对一台机器的传输层做探测这台机器上哪些端口在监听监听的是什么协议对应的服务是什么所以传输层不熟端口扫描结果就只是摆设。你会看到一堆端口号却不知道 21、22、23、25、80、443、3306、6379、9200 各自代表什么类型的服务也就没法判断哪个端口值得深挖。3.2 端口体系TCP 和 UDP 的端口都是 16 位取值范围 0 到 65535。行业习惯上把端口分成三类端口范围类型代表服务0-1023公认端口Well-Known22 SSH、80 HTTP、443 HTTPS、53 DNS1024-49151注册端口Registered3306 MySQL、6379 Redis、8080 HTTP 代理49152-65535动态/私有端口客户端临时使用的源端口平时看漏洞报告最常出现的都是公认端口和注册端口。一个资产如果对外暴露了 22、3306、6379、9200 这类端口第一反应就应该是“默认口令、未授权访问”这两个方向。学习阶段把这些常见端口和对应服务记下来比死记任何工具参数都管用。3.3 TCP 的可靠传输TCP 是面向连接的、可靠的、基于字节流的传输协议。可靠性不是嘴上说说的它落实在一堆机制上序号和确认号每个字节都有序号接收端回 ACK 告诉发送端“我收到哪了”确认应答与重传没收到确认就超时重传滑动窗口与流量控制接收端通过窗口字段告诉发送端“你还能再塞多少”拥塞控制慢启动、拥塞避免等算法避免网络被打爆。安全测试里最有用的是前三个读懂 seq/ack 的变化很多异常流量分析题就能解一半。面试时如果被问“TCP 怎么保证可靠”至少要把序号和确认机制、重传机制打上来。3.4 三次握手与四次挥手TCP 建立连接要走三次握手。这个过程一定要熟练不管是面试还是看抓包都会反复遇到第一次客户端发送 SYN 包请求建立连接同时带上初始序号 第二次服务端回复 SYNACK表示“我收到了也可以建立连接” 第三次客户端再发 ACK连接建立完成。对应的抓包特征也很明显第一个包是 SYN第二个包是 SYNACK第三个包是 ACK。第三次握手的 ACK 不带数据时seq 等于对方 SYN 的 seq1。断开连接是四次挥手因为 TCP 是双工的两个方向要分别关闭。正常流程是一方发 FIN另一方回 ACK 并可能继续发数据等数据发完再回 FIN发起方最后回 ACK 关闭连接。这里不需要死记每一次挥手但看到 FIN、ACK 交替出现时要能认出这是正常关闭过程而不是异常重置。3.5 TCP 标志位TCP 头里的标志位是做过滤和判断的钥匙。最常用的是 6 个标志位含义SYN请求建立连接ACK确认序号有效FIN请求断开连接RST异常重置连接PSH数据应尽快交给应用层URG紧急指针有效安全场景里最典型的是 RST正常情况下关闭连接用 FIN但如果收到 RST通常表示端口不可达、服务崩溃、主动拦截或者防火墙直接重置了连接。扫描结果里的 filtered 状态很多时候就和 RST 丢失、超时这类响应特征有关。抓包时看到大量 RST第一步就应该怀疑是不是有人在干扰连接或者某台服务已经异常退出。3.6 UDP 的简单性UDP 的头部只有四个字段源端口、目的端口、长度、校验和一共 8 字节。它不保证送达、不保证顺序、不重传、不建连接发送方把数据扔出去就不管了。正因为简单UDP 被大量用在对实时性要求高、允许丢包的场景DNS 查询、DHCP、视频直播、游戏同步。安全测试里看到 UDP 开放端口注意力一般集中在 DNS、SNMP、TFTP、NTP 这类服务上它们的默认配置问题和放大攻击都很有名。UDP 没有握手过程意味着探测方式也和 TCP 完全不同不能靠“连一下看反应”来确认端口是否开放而要依赖 ICMP Port Unreachable 等间接信号。3.7 TCP 与 UDP 对比对比维度TCPUDP连接状态面向连接三次握手无连接可靠性可靠有确认和重传不可靠丢包不重传传输方式字节流报文典型端口22、80、443、330653通常、69、161、123抓包特征有握手过程、状态复杂一收一发没有状态机测试注意关注扫描状态和指纹关注 UDP 服务默认配置4. 本地实验一用命令行观察端口与服务这一部分开始动手。不需要任何安装Windows 和 Linux 都自带大部分命令。第一步查看本机当前监听了哪些端口。Windows 用netstat -ano | findstr LISTENINGLinux 用netstat -tunlp也可以直接用更新一点的ss -tunlp输出里每一行都对应一个监听端口主要看四列协议TCP/UDP、本地地址和端口、状态LISTENING 表示在监听、进程 PID。这一分钟你就能验证一件事一台机器上同时有大量端口在监听但要判断“哪个端口是给外部用的”就需要看监听地址是 0.0.0.0、127.0.0.1 还是具体内网 IP。监听在 127.0.0.1 上的服务外部通常访问不到监听在 0.0.0.0 上的服务外部就有访问条件。这也是很多“端口暴露”类漏洞排查的第一步。第二步启动一个本地服务再观察端口变化。在任意目录执行python -m http.server 8080然后用另一个终端看netstat -ano | findstr 8080输出里会出现一条 TCP 监听记录状态是 LISTENING监听地址是 0.0.0.0:8080。这说明传输层已经准备好接收 TCP 连接请求并会把请求交给 Python 的 HTTP 服务。如果你发现 8080 被占用可以换一个高位端口例如 18080。第三步自己连自己。浏览器打开 http://127.0.0.1:8080/或者用 curlcurl http://127.0.0.1:8080/这时候再执行 netstat会看到 TCP 状态从 LISTENING 变成 ESTABLISHED。所谓“连接建立”在传输层就是状态机从监听走到已连接。看到这里三次握手就不再是纸面概念了。5. 本地实验二抓包看 TCP 握手和 UDP 报文命令行能看状态抓包能看报文。这里推荐两条路轻量级用 tcpdump图形化用 Wireshark。本机回环抓包不需要额外条件Windows 下 Wireshark 首次使用需要安装 Npcap 驱动。tcpdump 抓回环口的 HTTP 服务流量sudo tcpdump -i lo -nn port 8080保持抓包运行另开一个终端执行curl http://127.0.0.1:8080/你会看到类似这样的输出IP 127.0.0.1.port 8080 127.0.0.1.port 8080: Flags [S] ... IP 127.0.0.1.port 8080 127.0.0.1.port 8080: Flags [S.] ... IP 127.0.0.1.port 8080 127.0.0.1.port 8080: Flags [.] ...Flags [S] 就是 SYNFlags [S.] 是 SYNACKFlags [.] 是 ACK。三次握手就这样真实地出现在屏幕上。之后还会看到 PSH、ACK 等带数据交互的包那就是 HTTP 请求和响应在传输层的表现。接着看 UDP。DNS 查询就是最标准的 UDP 流量。先跑抓包sudo tcpdump -i any -nn udp port 53再执行一次域名解析nslookup www.example.com抓包结果里会出现一条 UDP 报文源端口是随机高位端口目的端口是 53。UDP 没有握手过程一个请求包配一个响应包就结束了对比刚才 TCP 的三步握手差异一眼就能看出来。Wireshark 里建议直接学过滤语法。几个最常用的表达式ip.addr 192.168.1.10 tcp.port 8080 tcp.flags.syn 1 udp.port 53 icmp在过滤框里输入tcp.flags.syn 1 tcp.flags.ack 0可以直接只看 SYN 包。过滤面板本身就是对 TCP 标志位最直接的练习。建议拿浏览器随便访问一个网站同时抓包看 TCP 握手再看几条 HTTP 请求和响应基本就把传输层的行为坐实了。6. 从协议到实战这两层在 SEC 挖洞中的价值6.1 端口扫描的本质所谓“挖洞”的第一步绝大多数场景是资产发现和端口扫描。不管用的是什么工具端口扫描的核心逻辑都是用传输层的特性去探测目标对 TCP 端口通常依靠连接行为或响应特征判断端口是否开放对 UDP 端口通常靠 ICMP Port Unreachable 响应来判断端口是否关闭中间有防火墙时探测行为会被过滤表现为超时或特定响应这就是 filtered 的来源。能看懂扫描结果的状态分类基本就理解了网络层和传输层在安全测试里的位置。这个动作本身不构成漏洞但它决定了漏洞的暴露面。下面给一个只针对本机的验证命令注意必须限定在授权范围nmap -sT -p 22,80,8080 127.0.0.1输出会显示每个端口的 open、closed 或 filtered 状态。结合刚才 netstat 的结果你就能对照验证虚拟机里开了 SSH本机扫描就能看到 22 端口 open没开 80就会显示 closed 或有拒绝特征。6.2 服务识别与握手指纹端口开放在先服务识别在后。很多安全测试工具的 Banner 抓取本质上就是走一遍 TCP 连接然后读取服务端返回的第一段数据。比如连接 22 端口SSH 服务默认会返回版本字符串连接 80 端口HTTP 服务器会返回 Server 头或响应内容。这就看出传输层和应用层的关系了传输层只负责“打通管道”管道对面是什么服务要看应用层返回的内容。但“用哪个端口、什么协议、状态是 open 还是 closed”全部是传输层的知识。面试里经常问“nmap 是怎么知道端口后面是哪个服务的”答案链路就是这样先按端口试探再按协议读响应最后比对指纹库。6.3 状态判断open、closed 与 filtered扫描结果里最常见的是三种状态对应到 TCP/UDP 行为上是这样状态典型响应通常含义open正常完成握手或返回服务响应端口有服务监听closed收到 RST端口可达但没服务监听filtered无响应、超时或收到 ICMP 不可达被防火墙等设备过滤看状态时不要只看 open。closed 说明主机在线但该端口没服务filtered 说明中间设备对流量做了干预。漏洞报告里写“某资产暴露了高危端口”实际就是把 open 状态和对应服务信息放在了一起。所以读报告、写报告都离不开对这三种状态的准确理解。6.4 协议字段在排查里的价值还有一类工作是把网络层和传输层的字段当证据用。比如访问日志里出现大量来自不同 IP 的 SYN 包却没有后续的 ACK那可能是扫描行为TCP 窗口大小异常、IP 分片异常、TTL 异常都是安全设备和流量分析系统重点盯的对象。先读得懂字段再看异常流量时才有依据。这里给出一个通用 Python 示例用来探测本机端口是否开放。它本质上就是手动发一个 TCP 连接请求然后看返回值属于学习和排障场景下的演示代码import socket host 127.0.0.1 ports [22, 80, 443, 8080, 3306] for port in ports: s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) result s.connect_ex((host, port)) if result 0: print(f[] {host}:{port} 端口开放) else: print(f[-] {host}:{port} 端口关闭或不可达) s.close()这段代码只建议对 127.0.0.1 或自己虚拟机里的地址运行。理解它的逻辑比会走一个现成工具更能帮助你掌握端口探测的本质。有一点必须反复强调以上所有扫描、抓包、服务识别动作只能在自己名下资产、实验环境或获得明确授权的测试范围内进行。企业 SRC 平台的测试通常有详细的测试范围、时间窗口和行为边界超出授权的测试属于违规行为可能承担法律后果。零基础阶段的练手目标是吃透协议而不是追求“打穿目标”。7. 常见问题与排查方法问题现象可能原因排查方式解决方案ping 不通但网页能打开防火墙禁 ICMP换 HTTPS 访问或抓包看 TCP说明主机在线ICMP 被策略过滤netstat 看不到端口服务没启动或权限不足检查进程用管理员/root 执行启动服务提升权限后重试tcpdump 抓到大量杂包没加 -n端口过滤没生效加上 -nn 并用 port 精确过滤重跑抓包命令三次握手抓不到 SYN 包回环口没指定或流量已结束指定 -i lo重新发起 curl先开抓包再发起请求扫描结果显示 filtered本地防火墙或安全组拦截换 -sT看 ICMP 返回确认测试边界和授权再扫描Wireshark 只有单向包过滤条件过窄或接口不对关闭过滤器抓全量再筛逐步收窄过滤条件本地 8080 被占用其他进程监听该端口netstat 查 PID任务管理器看进程换端口或结束进程8. 学习路线与安全边界8.1 本讲之后建议练什么网络层和传输层这一课之后建议顺着下面几条路径继续。第一条是抓包。每天用 Wireshark 抓几分钟真实流量只做一件事不看 IP 只看端口和标志位判断流量是 TCP 还是 UDP是握手包还是数据包是正常关闭还是重置。坚持一周协议手感和面试都受用。第二条是端口扫描训练。在自己的一台虚拟机或容器里部署几个常见服务比如 SSH、Nginx、Redis然后对 127.0.0.1 做扫描对照 netstat 输出理解 open、closed、filtered 的区别。这里的核心不是工具本身而是对结果的解释能力。第三条是阅读漏洞报告中的网络部分。很多 SRC 漏洞报告都会写“某端口对外开放导致未授权访问”或“服务使用明文协议传输敏感数据”读的时候回查一下这句话对应的是传输层的哪个端口、网络层的哪个地址段。想清楚之后再回到自己的实验环境做同类型的小验证。8.2 安全和合规边界这个话题必须认真说。网络层和传输层是网络技术的基础但基础知识和违法攻击之间有一条清楚的边界就是授权。任何时候做端口扫描、抓包、服务探测都要满足三个条件之一该资产属于自己、该资产属于自己所在的测试授权范围、该平台明确允许此类测试行为。SRC 挖洞也不是“随便找一个网站打”。正规流程是先看平台注册要求、测试范围、测试规则和免责声明再在限定范围内做测试。遇到客户资产、生产系统、敏感系统没有把握时不扫不探测只做文档层面的学习。关于隐私和数据处理也要注意抓包内容可能包含别人的账号、口令、业务数据。本地练习时建议只抓回环流量或自己构造的测试流量不要对着公共网络大量抓包更不要保存和转发别人的数据。学协议是好事拿协议知识去窥探他人信息就是完全另一回事了。9. 收尾下一步练什么这一讲的落点是两个实验netstat 看端口tcpdump 看握手。先把这两个实验在自己的电脑上做通然后把 TCP 的 SYN、ACK、FIN、RST 四个标志位做到能在一秒内说出含义接着再进入下一讲的链路层和 DNS 相关内容。后面的学习里你会反复用到今天的概念。HTTP 请求失败要分得清是网络层不通还是传输层被重置数据库端口暴露要看得出问题在传输层监听地址分析扫描报告时状态列乱窜先回来看 TCP 状态机。网络层和传输层是不需要特殊硬件也能练到形成肌肉记忆的部分也是最值得反复练习的部分。
返回列表