如何在Python中设置ICMP消息的源地址?

时间:2012-08-20 13:04:36

标签: python ping icmp source-address

我正在尝试更改this implementation of ping,以便为消息设置不同的源地址。 我想要做的与原始ping的-S选项可以完全相同:

ifconfig em0 10.0.1.1 netmask 255.255.255.0 alias
ifconfig em0 10.0.2.1 netmask 255.255.255.0 alias
ping -c4 -S 10.0.1.1 10.0.2.1

这当然有效,但我想用Python做同样的事情。

1 个答案:

答案 0 :(得分:3)

您展示的示例代码使用IPPROTO_ICMP套接字,可以使用bind()绑定到特定地址。

因此,在my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)行之后,您可以添加:

my_socket.bind((your_source_address, 0))

元组中的第二个参数是端口号,似乎被IPPROTO_ICMP忽略。

请注意,操作系统可能不允许您将套接字绑定到任意地址,但只允许属于您的主机的有效地址,这对您的用例来说已经足够了。如果要设置完全任意的源地址,可能需要使用IPPROTO_RAW套接字,然后自己构建整个IP数据包头。请参阅此问题以获取一些指示:How Do I Use Raw Socket in Python?