Envío de paquetes a la interfaz tap0

Envío de paquetes a la interfaz tap0

He estado intentando enviar paquetes a una interfaz tap usando Python. Estoy monitoreando la interfaz tap usando Wireshark y no se reciben paquetes. Estoy haciendo esto como un ejercicio principalmente para ayudarme a comprender las VPN, los puentes Ethernet y la programación de sockets en Python.

La configuración de mi sistema es la siguiente:

Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1

Primero configuro el grifo de la siguiente manera:

sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up

Esto inicia la interfaz tap0 y crea una regla de enrutamiento del kernel a 10.0.0.1/24 a través de tap0.

Aquí está la tabla de rutas:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        *               255.255.255.0   U     0      0        0 tap0
192.168.1.6     *               255.255.255.0   U     1      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

A continuación, inicio Python Interactive y creo un socket UDP simple.

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))

Ejecuto el comando sendto con monitoreo de Wireshark en tap0. Ahora, no hay ningún host en 10.0.0.2 en mi red, pero al menos debería ver algo de tráfico saliente en la interfaz tap0. He replicado esto en Windows y parece funcionar bien.

Sólo puedo pensar que el problema radica en algún lugar de la configuración de la interfaz tap0 en Linux. Eso o mi mediocre comprensión de estas cosas.

Gracias

Respuesta1

Está tapdiseñado para túneles puenteados bajo OpenVPN; se supone que debes unirlo a un puente, como por ejemplo br0usando brctl.

La idea es que puedas colocar tap0y eth0, por ejemplo, en un puente br0y luego transmitir el tráfico que atraviesa este puente. (El tráfico de transmisión que ingresa tap0se reenviará hacia eth0y viceversa, mientras que en una situación estándar enrutada no lo haría). tap0Luego, su vía de túnel OpenVPN se "conmuta" eth0en lugar de "enrutarse" hacia él. Todo br0obtiene una IP y usted maneja br0en lugar de eth0o tap0.

Es completamente posible tener un puente con una sola interfaz y agregar/eliminar interfaces adicionales según brctlsea necesario.

Entonces, colóquelo tap0en un puente y trate con la interfaz del puente, o use tuninterfaces.

También es posible que iptableslas reglas estén interfiriendo.

Actualización - mira aquí:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- particularmente este extracto:

La diferencia entre una interfaz tap y una interfaz tun es que una interfaz tap genera (y debe recibir) tramas Ethernet completas, mientras que una interfaz tun genera (y debe recibir) paquetes IP sin procesar (y el núcleo no agrega encabezados Ethernet). ). Si una interfaz funciona como una interfaz tun o como una interfaz tap se especifica con una bandera cuando se crea la interfaz.

Entonces, parece que si no envía tramas Ethernet completas a tap0, no funcionará como esperaba debido a lo anterior.

información relacionada