我试图了解进行 tcp 3 次握手所涉及的 linux 服务/进程。例如,谁为 SYN 请求发送拒绝标志 [R.]。
示例:端口 8088 正在侦听并且 8089 已打开。在两个端口上发出连接请求后,下面的 tcpdump 输出。
对于 8089:
$ sudo tcpdump -i any -nn port 8088 or port 8089
04:23:12.260621 IP 192.168.112.129.52298 > 192.168.112.129.8089: Flags [S], seq 300539809, win 43690, options [mss 65495,sackOK,TS val 19840756 ecr 0,nop,wscale 7], length 0
04:23:12.260637 IP 192.168.112.129.8089 > 192.168.112.129.52298: Flags [R.], seq 0, ack 300539810, win 0, length 0
对于 8088:
$ sudo tcpdump -i any -nn port 8088 or port 8089
04:23:21.680070 IP 192.168.112.129.42814 > 192.168.112.129.8088: Flags [S], seq 670408355, win 43690, options [mss 65495,sackOK,TS val 19850176 ecr 0,nop,wscale 7], length 0
04:23:21.680087 IP 192.168.112.129.8088 > 192.168.112.129.42814: Flags [S.], seq 1185731197, ack 670408356, win 43690, options [mss 65495,sackOK,TS val 19850176 ecr 19850176,nop,wscale 7], length 0
04:23:21.680098 IP 192.168.112.129.42814 > 192.168.112.129.8088: Flags [.], ack 1, win 342, options [nop,nop,TS val 19850176 ecr 19850176], length 0
那么这里哪个 linux 服务发送 8089 的 [R.] 和 8088 的 [S.] SYN-ACK?数据包如何到达侦听器,流量是多少?添加防火墙规则(使用 iptables)以在 8089 上丢弃数据包时的流程是什么?
提前致谢 :)
TCP 数据包中的标志不直接由服务和进程管理。
通常,开发人员使用标准 POSIX 接口来开发网络功能:
socket()
,connect()
,listen()
,bind()
,accept()
, 等...Linux 内核是这些调用的主要接收者,它:
将资源分配给服务(
socket()
例如在调用时),如果资源已经在使用中(例如:bind()
-ing 已经使用的地址/端口对),它会向调用进程返回错误适当的错误。管理真正的 TCP 堆栈内容,即开发人员调用时的 3 次握手
connect()
,或者如果没有服务绑定到请求的地址/端口对(或者如果服务拒绝连接)则返回 RST从外部接收数据包并将其内容转发到适当的进程(已经完成
bind()
或connect()
到/从地址/端口并实际调用recv()
或read()
在相关套接字上的进程。请注意,在进入进程之前,会触发防火墙以确保允许网络流。所以,即使你有一个监听 TCP/8000 的服务,如果你的防火墙不允许连接到它,那么你会得到:
RST
如果 iptables 策略或规则执行REJECT
.IGNORE
.