#linux #networking #virtual-machine
#линукс #сетевой #виртуальная машина
Вопрос:
Я могу ввести фрейм ethernet, предназначенный для виртуальной машины, которой принадлежит устройство tap, с помощью socat
и scapy
. Этот кадр ethernet доставляется из гипервизора на виртуальную машину, но не на открытый мост vSwitch, к которому также подключено устройство tap виртуальной машины.
Оба socat
и scapy
за кулисами делают что-то вроде:
socket(AF_PACKET, SOCK_RAW, 0) = 5 bind(5, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("vmc357-01"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0 sendto(5, "asdasdasdn", 10, 0, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("vmc357-01"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 112) = -1 EINVAL (Invalid argument)
Есть ли способ подделать пакет, который, по-видимому, исходил бы от виртуальной машины и вместо этого доставлялся на мост? Я считаю, что проблема здесь в том, что сокет AF_PACKET не является подходящим API для использования.