我有带有Ubuntu 18.04.5 LTS 的虚拟机,它有 Python 简单的 HTTP 服务器。 这个 VM 有两个接口:传入一个 ( enp0s8 ) 与 IPIP 隧道 ( mytun ) 和输出一个 ( enp0s9 )。 还有主机通信接口( enp0s3 )。 VM 必须生成 SYN-ACK 以响应从传入接口接收到的 SYN,并通过默认网关路由通过传出接口发送。

这是VM方案:

在此处输入图片说明

有两种情况:

  1. 如果我通过 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)
  1. 如果我使用其他东西,例如curl ,VM 不会生成 SYN-ACK。 curl SYN Wireshark 转储:

在此处输入图片说明

这些 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 个案例。

  ask by Lev Pantyukhin translate from so

本文未有回复,本站智能推荐:

5回复

Scapy中的嗅探功能过滤器无法正常工作

似乎sniff功能的filter无法正常工作。 我正在使用以下过滤器执行嗅探 但是有时sniff捕获到这样的UDP数据包: 有时, sniff捕获端口错误的TCP数据包: 有时, sniff捕获到这样的ARP数据包: 我在过滤器中遗漏了什么吗? 我如何避免
1回复

TCP:SYN请求收到SYN响应而不是SYN-ACK

从数据包捕获文件(pcap),在TCP握手期间观察以下内容 客户端向服务器发送SYN请求,服务器以SYN数据包而不是SYN + ACK进行响应,客户端以乱序数据包消息进行响应,服务器以RST数据包终止TCP握手 这是随机发生的,并非总是如此。 确实建立了TCP连接,但有时连接建立因
1回复

TCP:SYN / ACK后,路由器没有RST响应

最近,我一直在使用集成在python中的scapy并遇到错误; 正常的SYN数据包会激起路由器在端口80上发送SA数据包,它可以: IP / TCP 192.168.2.24:ftp_data> 192.168.2.254:www S ==> IP / TCP 192.16
1回复

当我使用原始套接字发送syn-packet时,为什么服务器不响应syn-ack数据包?

我正在尝试使用原始套接字,我刚刚编写了一个小程序,它发送带有syn标志集的TCP数据包。 我可以在服务器端看到与Wireshark一起发送的数据包,它们看起来不错,但是服务器永远不会响应任何syn-ack数据包。 我已经将我的程序构造的syn数据包(见下面的代码)与hping3发送的数据
1回复

SYN-ACK 转发

我有一个服务器 (A),它向另一个 http 服务器 (B) 发出 http 请求。 我的请求的标头被更改为包含一个伪造的原始 IP 地址,但由于 SYN-ACK 响应永远不会返回我的服务器,因此与服务器 B 的连接将永远不会发生。 但是,如果我在拥有上述请求中实际 IP 地址的客户端计算机上合法
1回复

无法解决我的 TCP 服务器代码中的此错误

所以,我试图编写这个简单的 TCP 服务器,但我遇到了这个错误 错误:“inet_ntop”未在此范围内声明; 你的意思是“inet_ntoa” 我知道我必须使用ntop而不是ntoa 。 但我不知道如何摆脱这个错误。 我到处搜索,但找不到任何东西。 我希望有一个人可以帮助我。 我的代码如下
1回复

多线程TCP服务器的TCPStream类

我目前正在将小型控制台应用程序过渡到TCP服务器/客户端应用程序。 客户端将通过任何Telnet客户端连接到服务器,并且服务器将为每个Telnet连接复制标准控制台界面。 我开始考虑使用从Beej的网络编程指南中学到的技术进行此操作-接受连接,然后使用fork()将其分为自己的进程。
1回复

python tcp服务器将数据发送到多个客户端

我在尝试将数据发送到我的python tcp聊天服务器上连接的所有客户端时遇到麻烦。 我知道如何获取消息/数据以立即将其发送回给发送该消息的人,但是如果我有多个客户端,它将不会发送回。 到目前为止,这是我的服务器: 我到目前为止在客户端使用node.js及其到目前为止非常简单,我不认