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á tap
diseñado para túneles puenteados bajo OpenVPN; se supone que debes unirlo a un puente, como por ejemplo br0
usando brctl
.
La idea es que puedas colocar tap0
y eth0
, por ejemplo, en un puente br0
y luego transmitir el tráfico que atraviesa este puente. (El tráfico de transmisión que ingresa tap0
se reenviará hacia eth0
y viceversa, mientras que en una situación estándar enrutada no lo haría). tap0
Luego, su vía de túnel OpenVPN se "conmuta" eth0
en lugar de "enrutarse" hacia él. Todo br0
obtiene una IP y usted maneja br0
en lugar de eth0
o tap0
.
Es completamente posible tener un puente con una sola interfaz y agregar/eliminar interfaces adicionales según brctl
sea necesario.
Entonces, colóquelo tap0
en un puente y trate con la interfaz del puente, o use tun
interfaces.
También es posible que iptables
las 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.