用三行抓住 TCP 握手
这个实习在VM中进行
环形背包(lo)在上面的nc创建服务器和客户端tcpdump沿着那个中间
接。因为不需要外部网络,所以接到的数据包都是我的。
目标
连接打开和关闭的过程用SYN·SYN-ACK·ACK·FIN标志读取,关闭的端口和 学习开放端口的差异、TIME-WAIT、临时端口,以及寻找端口占用的进程的方法。
为什么重要
“无法连接”这句话中混合了三个不同的东西。我发送了SYN RST来的时候对方是活着,只有端口关闭,什么都不来的时候防火墙 要么被丢弃,要么没有路径,到了SYN-ACK但没有数据的话,应用程序 这是一个问题。这三个对用户来说看起来都是一样的“不行”,但要修复的人却完全 不一样。如果能读懂旗帜的话,在前30秒内,这三个就会切换。
阶段
nc -lk 127.0.0.1 9000将服务器放在后台(接收的数据是**/root/tcp/recv.txt** 罗)ss -ltn输出**/root/tcp/listen.txt**请保存到。lo的9000端口tcpdump一边抓住一边hello发送一条短信,包含握手和结束的截图**/root/tcp/handshake.txt**请保存到。- 尝试连接到没有人听的9001端口,收到错误信息和当时截图(可以看到RST)**
/root/tcp/refused.txt**请一起保存。 - 再次用9000登录并关闭后不久
ss -tan在TIME-WAIT行中**/root/tcp/timewait.txt**请保存到。 - 在临时端口范围和2级捕获中,客户端使用的端口**
/root/tcp/ports.txt** 在range=·client_port=请保存到两行。 - 用Python
127.0.0.1:9000再尝试一次bind,然后**那个错误/root/tcp/inuse.txt**请保存到。 ss -ltnp找到抓住9000的路径,然后**那条线/root/tcp/owner.txt**请保存到。/root/tcp/report.md在client_port=·server_port=请在两行中写下为什么有三个阶段的握手和TIME-WAIT。
参考
- 服务器是
setsid nc -lk 127.0.0.1 9000 > /root/tcp/recv.txt 2>&1 < /dev/null &请像这样悬挂。-k是连接结束后也继续听的选项。 - 截图:
timeout 6 tcpdump -i lo -nn -l 'tcp port 9000' > 파일 2>&1 &先挂上,echo hello | nc -q 1 127.0.0.1 9000. - 标志:
[S]SYN,[S.]SYN+ACK,[.]ACK,[P.]数据,[F.]FIN,[R.]RST。 - 临时端口范围:
sysctl net.ipv4.ip_local_port_range. - 常见的错误:启动服务器,把标准输出留给终端。其他命令混在一起,文件混乱——一定要发到文件里。
接收插孔
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 refused哇Flags [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 '.-p去users:(("nc",pid=…))附上。如果不是root,就看不到别人的进程。
学到了什么
/root/tcp/report.md 在client_port=·server_port=请在两行中写下为什么有三个阶段的握手和TIME-WAIT。
client_port是5级别的值,server_port是9000。正文中必须包含SYN和TIME-WAIT这两个单词。