发送带有源端口但不绑定的 UDP 数据包

gab*_*ous 6 python sockets port udp

我想在 Python 中发送 UDP 数据包并指定源端口但不绑定。

与 hping3 等效:

hping3 -s $sourceport -p $remoteport --udp --file message.bin -d 1024 -c 1 $remoteaddr
Run Code Online (Sandbox Code Playgroud)

我尝试过做这样的事情:

hping3 -s $sourceport -p $remoteport --udp --file message.bin -d 1024 -c 1 $remoteaddr
Run Code Online (Sandbox Code Playgroud)

当然,Python 会尝试绑定,但它不起作用。现在如果我不绑定,我可以这样做:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind((SHOST, SPORT))
Run Code Online (Sandbox Code Playgroud)

消息已发送,但现在源端口未定义。

有人有想法吗?

编辑:扩展描述:我的 python 脚本补充了另一个应用程序,该应用程序是绑定到定义端口(1024 以上)的 UDP 服务器。我的脚本只需要将 UDP 数据包发送到远程服务器,但使用与本地 UDP 服务器相同的源端口,以便远程 UDP 服务器认为本地 UDP 服务器是数据包的作者,并将继续使用它进行传输。

我想我还必须说,这是一个完全合法的应用程序,与任何黑客攻击完全无关(事实上,它已经可以与 hping3 一起使用,但我想删除这种依赖关系)。

编辑2 :解决方案在Nos的答案下面的评论中:

使用 pyip python 包并创建一个原始套接字。不要忘记是 root,因为只有 root 才能发送原始数据包(这不是 Python 的限制,而是操作系统的限制,这是为了防止安全问题,因此要以用户身份发送原始数据包,您需要调整操作系统配置)。

nos*_*nos 3

python 中没有用于发送具有定义的源端口的 UDP 数据包的 API,也没有在大多数(全部?)操作系统上运行 python 而不首先将套接字绑定到本地端口。

因此,如果您想控制源端口,则必须绑定()您的套接字。

如果bind()“不起作用”,那么您要么绑定到另一个进程拥有的端口,要么绑定到只有root用户可以绑定的端口号<1024,或者您提供了一些其他错误的参数来绑定() - 但我们需要更多信息来帮助您,例如您收到的错误消息、您传递给绑定的实际参数等。