1

Я пытался отправить пакеты на интерфейс крана с помощью Python. Я наблюдаю за интерфейсом крана, используя 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 ответ1

2

tap предназначен для мостового туннелирования под OpenVPN - вы должны соединить его в мост, такой как br0 используя brctl .

Идея состоит в том, что вы можете поместить tap0 и eth0 , например, в мост br0 затем транслировать трафик через этот мост. (Широковещательный трафик, поступающий от tap0 будет перенаправлен на eth0 и наоборот, тогда как в стандартной маршрутизируемой ситуации это не так.) Ваш туннель OpenVPN через 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 или как интерфейс касания, указывается с флагом при создании интерфейса.

Похоже, что если вы не отправите полностью Ethernet-фреймы на tap0, это не будет работать так, как вы ожидаете, из-за этого выше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .