我有一个从 TUN0 接口读取 IP 数据包的简单服务器。在这段代码中,我试图在端口 80 上模拟 TCP 侦听端口的行为,因此将其称为服务器。所以如果我收到 SYN 请求,我会用 SYN+ACK 响应来响应它。
我反复检查我的代码 SYN+ACK 数据包是否被忽略,并且我不断重新传输 SYN 数据包。为什么会这样?
我的 SYN+ACK 数据包似乎很好。其他人也检查了它,如果需要,请参阅下面的完整数据包捕获。但是我的客户端忽略了我的服务器代码对其 TCP SYN 数据包的 SYN+ACK 数据包响应。
我检查了netstat
$ netstat --interfaces
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eno1 1500 9524 0 0 0 9813 0 0 0 BMRU
lo 65536 2110 0 0 0 2110 0 0 0 LRU
tun0 1500 28 0 0 0
我还禁用了 Linux Reverse 的路径过滤
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter ;
echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter ;
但是我的 netstat 没有显示任何丢弃的数据包。那么我的客户端只是忽略我的服务器的 SYN+ACK 数据包的另一个原因可能是什么。我不断从客户端重新传输 SYN 数据包。Linux内核中是否有一些神奇的工作拒绝SYN + ACK数据包并且没有人知道它。我是否需要iptable
配置或其他东西,我认为最初不需要,但我还能做什么。
这是初始 SYN 和 SYN+ACK 的十六进制转储
0000 45 00 00 3c 27 20 40 00 40 06 7e 28 c0 a8 0a 14
0010 c0 a8 0a 0f b3 b0 00 50 51 26 ee f7 00 00 00 00
0020 a0 02 fa f0 c2 46 00 00 02 04 05 b4 04 02 08 0a
0030 68 c4 98 71 00 00 00 00 01 03 03 07
同步+确认
0000 45 00 00 28 00 64 40 00 40 06 a4 f8 c0 a8 0a 0f
0010 c0 a8 0a 14 00 50 b3 b0 00 01 00 00 51 26 ee f7
0020 50 12 fa f0 2b 4e 00 00
数据包捕获显示:
3 7.708817335 192.168.10.20 → 192.168.10.15 TCP 60 48332 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2667509633 TSecr=0 WS=128
4 7.708913705 192.168.10.15 → 192.168.10.20 TCP 40 80 → 48332 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0
5 8.736000043 192.168.10.20 → 192.168.10.15 TCP 60 [TCP Retransmission] 48332 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2667510660 TSecr=0 WS=128
6 8.736098933 192.168.10.15 → 192.168.10.20 TCP 40 [TCP Retransmission] 80 → 48332 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0
7 10.751997741 192.168.10.20 → 192.168.10.15 TCP 60 [TCP Retransmission] 48332 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2667512676 TSecr=0 WS=128
8 10.752078320 192.168.10.15 → 192.168.10.20 TCP 40 [TCP Retransmission] 80 → 48332 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0
9 14.847991184 192.168.10.20 → 192.168.10.15 TCP 60 [TCP Retransmission] 48332 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2667516772 TSecr=0 WS=128
10 14.848068483 192.168.10.15 → 192.168.10.20 TCP 40 [TCP Retransmission] 80 → 48332 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0
11 23.040001163 192.168.10.20 → 192.168.10.15 TCP 60 [TCP Retransmission] 48332 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2667524964 TSecr=0 WS=128
12 23.040081745 192.168.10.15 → 192.168.10.20 TCP 40 [TCP Retransmission] 80 → 48332 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0
13 39.167998575 192.168.10.20 → 192.168.10.15 TCP 60 [TCP Retransmission] 48332 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2667541092 TSecr=0 WS=128
14 39.168081088 192.168.10.15 → 192.168.10.20 TCP 40 [TCP Retransmission] 80 → 48332 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0
这是完整的数据包捕获:
https://drive.google.com/file/d/1hF8FeQcZqGvAZzxHHRRtO2BOl8Y1Yymn/view?usp=sharing
内核版本:内核 5.13.0-22-generic