如何通过 socks 发送 TCP 数据包?

How to send TCP packets through socks?

我有这个代码:

import socket
import socks

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "IP_SOCK", PORT_SOCK, True)
s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target,port))
s.close()
print("Connection tested.")

有效,但数据包的长度为0。我想添加有效载荷数据,我该怎么做?

例如,这里我有这个使用 scapy 库的工作代码:

import socket
import socks
from scapy.all import *


def send(src_ip, dst_ip, dst_port):
    ip = IP(src=src_ip, dst=dst_ip)
    src_port = random.randint(20, 65000)
    transport = TCP(sport=src_port, dport=dst_port, flags="S")
    send(ip/transport/b"mydata")


if __name__ == '__main__':
    send('SRC_IP', 'DST_IP', DST_PORT)

它确实发送了 "mydata" 有效载荷。如果我用 tcpdump 拦截它,我可以在 syn 数据包中看到数据字段的长度和 "mydata"。

我想通过 sock 或 http 代理发送它,但我不知道该怎么做。

事实是我不需要建立连接,因为即使端口关闭我也想发送数据包。

不断有人跟我说不能用socks发tcp包。这不是真的。 SOCKS 在第 4 层起作用,所以它是完全可行的,问题是我不知道如何在 Python 中做到这一点,因为我是新手。

你可以使用sendall();例如:s.sendall("GET / HTTP/1.1 ...")

有关详细信息,请参阅 https://pypi.org/project/PySocks/ , where I obtained this example from, as well as https://docs.python.org/3/library/socket.htmlsocks 模仿 python 的内置 socket

Some people continue to tell me that I can't use socks to send tcp packets. It's not true.

不喜欢也是真的。代理(HTTP 代理或 Socks 代理)不是网络级别的数据包转发器。相反,它是应用程序级别的有效载荷转发器。如果你想要一个数据包转发器,你需要一个真正的 VPN(重点是 "N",即网络级别)。

使用 Socks 或 HTTP 代理时,需要先与代理建立 TCP 连接。在此 TCP 连接内,然后进行一些初始握手,如针对代理的身份验证和想要达到的目标规范。然后代理连接到目标,一旦完成,就会有两个 TCP 连接:一个在客户端和代理之间,另一个在代理和服务器之间。然后代理将读取这两个连接并将接收到的数据转发给对等方,即从客户端接收的数据将转发到服务器等。代理也可能修改传输中的数据。

由于代理仅在应用程序级别转发数据,因此无法通过代理发送精心制作的 TCP 数据包。并且由于代理维护两个独立的 TCP 连接并且仅转发应用程序级数据,即使传入和传出数据包大小可能不同,即两个传入数据包可以合并为一个传出数据包或可能导致三个等。由于 TCP 只是字节流数据包大小在应用程序级别无关紧要。