当你连接到2个网络时,如何使用scapy通过特定接口发送数据包?

问题描述 投票:1回答:1

我的PC上安装了两个以太网卡,因此有两个接口。这两个接口连接到Router的两个接口。这样:

PC_INT_A --- Network1 ---> ROUTER_INT_1

PC_INT_B --- Network2 ---> ROUTER_INT_2

所有接口都完全配置为IPv6通信。 Ping6通过命令行运行良好。

但是,当我试图通过scapy发送时,两个网络都是连接的。我只能在代码中发送第一个接口。或者我必须断开一个特定的网络。

见下面的代码:

def ns_with_ll(src, dst):
       base = IPv6(src=src, dst=dst, nh=58, hlim=255)
       ns = ICMPv6ND_NS(tgt=dst)
       ll = ICMPv6NDOptSrcLLAddr()
       pkt = base / ns / ll
       return pkt

if __name__ == '__main__':
    SRC_A = 'IPV6_ADDR_OF_ETH0'
    SRC_B = 'IPV6_ADDR_OF_ETH1'
    DST_1 = 'IPV6_ADDR_ROUTER_INT_1'
    DST_2 = 'IPV6_ADDR_ROUTER_INT_2'

    ns_a = ns_with_ll(SRC_A, DST_1)
    ns_b = ns_with_ll(SRC_B, DST_2)

    sr(ns_a, iface='eth0')
    sr(ns_b, iface='eth1')

上面的代码给出了如下输出:

Begin emission:
*Finished sending 1 packets.

Received 1 packets, got 1 answers, remaining 0 packets
Begin emission:
Finished sending 1 packets.
..........................................................................

它一直在等待eth1界面的答案。

如果我改变代码发送的顺序,就像我首先发送数据包到eth1。我从eth1收到答复,它一直在等待eth0的回答。

我也检查wireshark,但我没有收到第二个接口的任何数据包。

我也尝试过发送ICMPv6EchoRequest,它的行为方式相同。

有人可以告诉我,如何使用scapy同时使用多个网络。我使用scapy版本2.4.2与python 3.4?

python networking ping scapy
1个回答
1
投票

嗨!

在Scapy中,您有两种发送数据包的方法。 “第3层方式”,它使用内部路由表(conf.route)和“第2层方式”,它在给定接口上发送数据包(conf.iface是默认值)。

send()是一个“第3层”函数(因此它依赖于Scapy的路由表),而sendp()是一个“第2层”函数(它有一个iface=可选参数,默认情况下将使用conf.iface)。 sr()srp()也是如此。

所以在你的情况下,使用srp()而不是sr()并提供Ether()层应该工作:

if __name__ == '__main__':
[...]
    srp(Ether() / ns_a, iface='eth0')
    srp(Ether() / ns_b, iface='eth1')
© www.soinside.com 2019 - 2024. All rights reserved.