Estou tentando enviar pacotes para uma interface tap usando python. Estou monitorando a interface tap usando wireshark e nenhum pacote está sendo recebido. Estou fazendo isso como um exercício principalmente para ajudar na minha compreensão de VPNs, ponte Ethernet e programação de soquete em python.
Minha configuração do sistema é a seguinte:
Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1
Primeiro configurei a torneira da seguinte forma:
sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up
Isso inicia a interface tap0 e cria uma regra de roteamento do kernel para 10.0.0.1/24 via tap0.
Aqui está a tabela de rotas:
$ 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
Em seguida, inicio o python interativo e crio um soquete UDP simples.
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))
Eu executo o comando sendto com monitoramento Wireshark no tap0. Agora, não há host em 10.0.0.2 na minha rede, mas devo pelo menos ver algum tráfego de saída na interface tap0. Eu repliquei isso no Windows e parece funcionar bem.
Só posso pensar que o problema está em algum lugar na configuração da interface tap0 no Linux. Isso ou minha compreensão medíocre dessas coisas.
Obrigado
Responder1
O tap
é destinado ao tunelamento em ponte no OpenVPN - você deve juntá-lo em uma ponte, como br0
usar brctl
.
A idéia é que você possa colocar tap0
e eth0
, por exemplo, em uma ponte br0
- e então transmitir o tráfego que atravessa essa ponte. (O tráfego de transmissão vindo de tap0
será encaminhado eth0
e vice-versa, enquanto em uma situação padrão roteada isso não aconteceria.) Seu túnel OpenVPN via tap0
é então "comutado" eth0
em vez de "roteado" para ele. O todo br0
recebe um IP e você lida com br0
em vez de eth0
ou tap0
.
É totalmente possível ter uma ponte com apenas uma interface e adicionar/remover interfaces adicionais conforme brctl
necessário.
Portanto, coloque-o tap0
em uma ponte e lide com a interface da ponte ou use tun
interfaces.
Também é possível que iptables
as regras estejam interferindo.
Atualização - veja aqui:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- particularmente este trecho:
A diferença entre uma interface tap e uma interface tun é que uma interface tap gera (e deve receber) quadros Ethernet completos, enquanto uma interface tun gera (e deve receber) pacotes IP brutos (e nenhum cabeçalho Ethernet é adicionado pelo kernel ). Se uma interface funciona como uma interface tun ou como uma interface tap é especificado com um sinalizador quando a interface é criada.
Parece que se você não enviar quadros Ethernet completos para tap0, ele não funcionará como esperado por causa do acima.