linux - 服务器生成 SYN-ACK 以响应 Scapy SYN,但不生成以响应其他 SYN
问题描述
我有Ubuntu 18.04.5 LTS的虚拟机,它有 Python 简单的 HTTP 服务器。此 VM 有两个接口:一个带有 IPIP 隧道 ( mytun ) 的传入接口 ( enp0s8 ) 和一个传出接口 ( enp0s9 )。还有主机通信接口(enp0s3)。VM 必须生成 SYN-ACK 以响应从传入接口接收到的 SYN,并通过默认网关路由通过传出接口发送它。
这是VM方案:
有两种情况:
- 如果我通过 Scapy 发送 SYN,VM 会生成 SYN-ACK。Scapy SYN Wireshark 转储:
from scapy.all import *
import random
sport = random.randint(1024, 65535)
SYN = IP(src='192.168.0.2', dst='192.168.0.1') / \
IP(src='10.0.0.1', dst='10.0.0.2') / \
TCP(sport=sport, dport=80, seq=random.randint(0, int('0xFFFFFFFF', 16)), flags="S")
send(SYN)
- 如果我使用其他东西,例如curl,VM 不会生成 SYN-ACK。curl SYN 线鲨转储:
这些 SYN 仅因 TCP 选项而异。还要附加有关接口、路由、隧道和套接字的信息。
kndrvt@kndrvt-VM:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.2/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:88:b9:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.4/24 brd 192.168.2.255 scope global dynamic noprefixroute enp0s3
valid_lft 409sec preferred_lft 409sec
inet6 fe80::5249:f93e:44a8:9c3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:ec:7c:b7 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/30 scope global enp0s8
valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:6f:63:ab brd ff:ff:ff:ff:ff:ff
inet 172.16.0.3/30 scope global enp0s9
valid_lft forever preferred_lft forever
5: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
6: mytun@enp0s8: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 192.168.0.1 peer 192.168.0.2
inet6 fe80::5efe:c0a8:1/64 scope link
valid_lft forever preferred_lft forever
kndrvt@kndrvt-VM:~$ ip r
default via 172.16.0.1 dev enp0s9
169.254.0.0/16 dev enp0s3 scope link metric 1000
172.16.0.0/30 dev enp0s9 proto kernel scope link src 172.16.0.3
192.168.0.0/30 dev enp0s8 proto kernel scope link src 192.168.0.1
192.168.2.0/24 dev enp0s3 proto kernel scope link src 192.168.2.4 metric 100
kndrvt@kndrvt-VM:~$ ip t
tunl0: any/ip remote any local any ttl inherit nopmtudisc
mytun: ip/ip remote 192.168.0.2 local 192.168.0.1 dev enp0s8 ttl inherit
kndrvt@kndrvt-VM:~$ ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 10.0.0.2:http 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:*
LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:*
LISTEN 0 5 [::1]:ipp [::]:*
我通过以下命令启动了 HTTP 服务器:
python3 -m http.server 80 --bind 10.0.0.2
iptables 是空的。我不知道这种行为的原因。希望得到您的帮助。
UPD:我忘了提到传入数据包的外部 IP 标头是由 Scapy 创建的。我尝试使用 Scapy 重新创建整个数据包并且它有效。但我对这种行为的原因感兴趣。此外,我将pcap与 VM 的所有接口的数据包一起附加,其中显示了 2 个案例。
解决方案
推荐阅读
- python - 在 seaborn 热图上编辑轴刻度的标签和位置会导致绘图为空
- c - Scanf 允许在静态数组中存储更多的字符
- javascript - 尝试使用 Vanillajavascript 创建搜索框/过滤器时出现问题
- ios - 警告:不允许使用广告密钥“服务数据”
- docker - 泊坞窗:/bin/sh:1:/tmp/provision.sh:未找到
- machine-learning - 使用机器学习进行价格预测
- android - 将数据从活动传回已创建的片段
- http - 在我的 Vue 代码中制作外部 POST 不起作用
- python - 如何在 Tensorflow 中使用张量生成数据集
- java - 当用户使用JDA进入公会时如何更新语音通道