Я пытаюсь отправить пакеты на интерфейс tap с помощью python. Я отслеживаю интерфейс tap с помощью wireshark, и пакеты не поступают. Я делаю это в качестве упражнения, в основном, чтобы помочь себе понять vpns, мостовое соединение ethernet и программирование сокетов в python.
Моя системная конфигурация выглядит следующим образом:
Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1
Сначала я настраиваю кран следующим образом:
sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up
Это запускает интерфейс tap0 и создает правило маршрутизации ядра к 10.0.0.1/24 через tap0.
Вот таблица маршрутов:
$ 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
Далее я запускаю Python Interactive и создаю простой UDP-сокет.
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))
Я запускаю команду sendto с мониторингом Wireshark на tap0. Теперь в моей сети нет хоста по адресу 10.0.0.2, но я должен хотя бы увидеть исходящий трафик на интерфейсе tap0. Я повторил это в Windows, и, похоже, все работает нормально.
Я могу только думать, что проблема где-то в настройке интерфейса tap0 под linux. Или в моем посредственном понимании этого дела.
Спасибо
решение1
Он tap
предназначен для мостового туннелирования в OpenVPN — вам нужно объединить его в мост, например, с br0
помощью brctl
.
Идея в том, что вы можете поместить tap0
и eth0
, например, в мост br0
- тогда широковещательный трафик проходит через этот мост. (Широковещательный трафик, поступающий из tap0
будет пересылаться на eth0
и наоборот, тогда как в маршрутизируемой стандартной ситуации этого не произойдет.) Ваш туннель OpenVPN via tap0
затем "коммутируется" в eth0
вместо того, чтобы "маршрутизироваться" в него. Целое br0
получает IP, и вы имеете дело с br0
вместо eth0
или tap0
.
Вполне возможно иметь мост только с одним интерфейсом и добавлять/удалять дополнительные интерфейсы по brctl
мере необходимости.
Поэтому либо включайте tap0
мост и работайте с интерфейсом моста, либо используйте tun
интерфейсы.
Также возможно, iptables
что мешают правила.
Обновление - смотрите здесь:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- особенно этот отрывок:
Разница между интерфейсом tap и интерфейсом tun заключается в том, что интерфейс tap выводит (и должен быть предоставлен) полные кадры Ethernet, в то время как интерфейс tun выводит (и должен быть предоставлен) необработанные IP-пакеты (и ядро не добавляет заголовки Ethernet). Функционирует ли интерфейс как интерфейс tun или как интерфейс tap, указывается флагом при создании интерфейса.
Похоже, что если вы не отправляете полные кадры Ethernet на tap0, то это не будет работать так, как вы ожидаете, из-за вышеизложенного.