LabHub
学习 学习路径 课程

网络基础 — 在 Linux 虚拟机里动手

用三行抓住 TCP 握手

在 LabHub 中继续学习

这个实习在VM中进行

环形背包(lo)在上面的nc创建服务器和客户端tcpdump沿着那个中间 接。因为不需要外部网络,所以接到的数据包都是我的。

目标

连接打开和关闭的过程用SYN·SYN-ACK·ACK·FIN标志读取,关闭的端口和 学习开放端口的差异、TIME-WAIT、临时端口,以及寻找端口占用的进程的方法。

为什么重要

“无法连接”这句话中混合了三个不同的东西。我发送了SYN RST来的时候对方是活着,只有端口关闭,什么都不来的时候防火墙 要么被丢弃,要么没有路径,到了SYN-ACK但没有数据的话,应用程序 这是一个问题。这三个对用户来说看起来都是一样的“不行”,但要修复的人却完全 不一样。如果能读懂旗帜的话,在前30秒内,这三个就会切换。

阶段

  1. nc -lk 127.0.0.1 9000将服务器放在后台(接收的数据是**/root/tcp/recv.txt** 罗)ss -ltn输出**/root/tcp/listen.txt**请保存到。
  2. lo的9000端口tcpdump一边抓住一边hello发送一条短信,包含握手和结束的截图**/root/tcp/handshake.txt**请保存到。
  3. 尝试连接到没有人听的9001端口,收到错误信息和当时截图(可以看到RST)**/root/tcp/refused.txt**请一起保存。
  4. 再次用9000登录并关闭后不久ss -tan在TIME-WAIT行中**/root/tcp/timewait.txt**请保存到。
  5. 在临时端口范围和2级捕获中,客户端使用的端口**/root/tcp/ports.txt** 在range=·client_port=请保存到两行。
  6. 用Python127.0.0.1:9000再尝试一次bind,然后**那个错误/root/tcp/inuse.txt**请保存到。
  7. ss -ltnp找到抓住9000的路径,然后**那条线/root/tcp/owner.txt**请保存到。
  8. /root/tcp/report.mdclient_port=·server_port=请在两行中写下为什么有三个阶段的握手和TIME-WAIT。

参考

接收插孔

nc -lk 127.0.0.1 9000将服务器放在后台(接收的数据是**/root/tcp/recv.txt** 罗)ss -ltn输出**/root/tcp/listen.txt**请保存到。

setsid nc -lk 127.0.0.1 9000 > /root/tcp/recv.txt 2>&1 < /dev/null &.ss -ltn显示TCP(-t)监听的套接字(-l)以数字(-n)的形式。127.0.0.1:9000应该以这个LISTEN的形式显示。

三行握手

lo的9000端口tcpdump一边抓住一边hello发送一条短信,包含握手和结束的截图**/root/tcp/handshake.txt**请保存到。

先截图:timeout 6 tcpdump -i lo -nn -l 'tcp port 9000' > /root/tcp/handshake.txt 2>&1 &. 1秒后echo hello | nc -q 1 127.0.0.1 9000. 放在文件里[S][S.][.]按照顺序开始[F.]必须有以结束的线条,recv.txt里面有hello。

关闭的端口用RST回复

尝试连接到没有人听的9001端口,收到错误信息和当时截图(可以看到RST)**/root/tcp/refused.txt**请一起保存。

截图timeout 5 tcpdump -i lo -nn -l 'tcp port 9001' >> /root/tcp/refused.txt 2>&1 &挂着nc -zv -w 1 127.0.0.1 9001 >> /root/tcp/refused.txt 2>&1. 放在文件里Connection refusedFlags [R.]两者都要有。

TIME-WAIT

再次用9000登录并关闭后不久ss -tan在TIME-WAIT行中**/root/tcp/timewait.txt**请保存到。

echo again | nc -q 1 127.0.0.1 9000紧接着ss -tan | grep TIME-WAIT > /root/tcp/timewait.txt. 首先留在关闭的那边(客户端)。60秒后消失,请马上看。

临时端口

在临时端口范围和2级捕获中,客户端使用的端口**/root/tcp/ports.txt** 在range=·client_port=请保存到两行。

范围是sysctl -n net.ipv4.ip_local_port_range(两个数字)。客户端端口是handshake.txt的[S]在队伍里127.0.0.1.<포트> >的端口。那个值必须在范围内。

一个港口接一个

用Python127.0.0.1:9000再尝试一次bind,在哪里bind的一行和那个错误**/root/tcp/inuse.txt**请一起保存。

{ echo 'bind 127.0.0.1:9000'; python3 -c 'import socket; s=socket.socket(); s.bind(("127.0.0.1", 9000))' 2>&1; } > /root/tcp/inuse.txt.Address already in use必须出来。同一地址和端口只能有一个套接字。哪个端口发生了冲突必须留在文件中——其他端口的冲突消息不是这个阶段的答案。

是谁抓到的

ss -ltnp找到抓住9000的路径,然后**那条线/root/tcp/owner.txt**请保存到。

ss -ltnp | grep ':9000 '.-pusers:(("nc",pid=…))附上。如果不是root,就看不到别人的进程。

学到了什么

/root/tcp/report.mdclient_port=·server_port=请在两行中写下为什么有三个阶段的握手和TIME-WAIT。

client_port是5级别的值,server_port是9000。正文中必须包含SYN和TIME-WAIT这两个单词。