Виртуальное сетевой устройство с криптованием

Вопросы программного кода и архитектуры Linux

Модератор: Olej

kit_D
Писатель
Сообщения: 52
Зарегистрирован: 13 мар 2012, 13:14
Откуда: Харьков
Контактная информация:

Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение kit_D » 13 мар 2012, 13:40

Здравствуйте,
Передо мной поставлена довольно интересная задача. Суть состоит в том, чтобы реализовать кастомное шифрование сетевого трафика WiFi сети. Заказчик предполагает следующую схему:
1) Создать виртуальное сетевое устройство (напр. crypto0), собственно реализующее шифрование фреймов, эдакий аналог того WPA
2) Сетевое устройство должно работать поверх существующего wifi устройства (напр., wlan0).
3) wlan0 подключается к открытой WiFi сети стандартными средствами линукс ,в моем случае Андроид, такими как wpa_supplicant.
4) Cоздается виртуальное устройство crypto0 и оно назначается устройством по умолчанию. Весть исходящий трафик (IP, ARP,...), попадающий в это устройство, шифруется, передается в базовое устройство wlan0 и выдается в wifi сеть.
5) Аналогично, весь входящий трафик перехватывается на устройстве wlan0, расшифровывается и передается вверх по сетевому стеку.

Опыта кернел программирования у меня не много, но я нашел некоторые интересные кусочки, которые мне кажется можно будет как-то использовать
1) http://ar.linux.it/docs/vinter/vinter.html - устройство, которое дропит часть сетевого трафика при передаче в подчиненное устройство
2) http://netlab-mn.unipv.it/insane/ - Эта же разработка, но откомпилированная для 2.6 ядра
3) Имея небольшой опыт с 802.1 бриджами я сразу подумал о том что в ядре уже должна быть возможность перехвата входящих фреймов. Покопав код бриджа в ядре (net/bridge) я нашел интересную функцию netdev_rx_handler_register() которую можно зарегистрировать для подчиненного сетевого устройства и позволяющую перехватить трафик входящий в это устройство. Я написал маленький модуль, зарегистрировал netdev_rx_handler_register и в зарегистрированном обработчике действительно вижу входящие фреймы.

Подскажите, возможные пути реализации задания, на что надо обратить внимание, возможно есть существующие аналоги.
Спасибо.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 16:36

kit_D писал(а): Передо мной поставлена довольно интересная задача. Суть состоит в том, чтобы реализовать кастомное шифрование сетевого трафика WiFi сети. Заказчик предполагает следующую схему:
1) Создать виртуальное сетевое устройство (напр. crypto0), собственно реализующее шифрование фреймов, эдакий аналог того WPA
2) Сетевое устройство должно работать поверх существующего wifi устройства (напр., wlan0).
Сразу скажу, что тема здесь получится очень интересная.
И гораздо шире, чем даже заданный вопрос.
И вот почему:
- достаточно легко отрабатывать сетевую систему, когда разработчик даёт вам живую железку на PCI ... дальше мы имеем IRQ где ловим пакеты и пакуем их в буфера сокетов, или записываем на передаче буфера сокетов непосредственно по портам этой железки...
- но такое удовольствие выпадает не часто и не всем (не так много в природе разработчиков железок, а число макетных плат у них тоже ограничено) :lol:
- вот как-раз очень интересная задача создать новый сетевой интерфейс, с тем, чтобы он был виртуальный, перенаправляемый на реально существующий интерфейс.
- так как это имеет место, например, с интерфейсами tun или br ...

Давайте смотреть.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 16:40

kit_D писал(а): Опыта кернел программирования у меня не много, но я нашел некоторые интересные кусочки, которые мне кажется можно будет как-то использовать
1) http://ar.linux.it/docs/vinter/vinter.html - устройство, которое дропит часть сетевого трафика при передаче в подчиненное устройство
2) http://netlab-mn.unipv.it/insane/ - Эта же разработка, но откомпилированная для 2.6 ядра
3) Имея небольшой опыт с 802.1 бриджами я сразу подумал о том что в ядре уже должна быть возможность перехвата входящих фреймов. Покопав код бриджа в ядре (net/bridge) я нашел интересную функцию netdev_rx_handler_register() которую можно зарегистрировать для подчиненного сетевого устройства и позволяющую перехватить трафик входящий в это устройство. Я написал маленький модуль, зарегистрировал netdev_rx_handler_register и в зарегистрированном обработчике действительно вижу входящие фреймы.
Очень интересно, Никита!
Давайте этот ваш "маленький модуль" сюда, на дальнейшее его усовершенствование и развитие:
- архиаируйте весь каталог tar-ом в .tgz (не всякие расширения форум примет)...
- в закладке "Добавить вложения" при редактировании ответа - прикрепляйте архив: "Выберите файл" -> "Добавить файл".

kit_D
Писатель
Сообщения: 52
Зарегистрирован: 13 мар 2012, 13:14
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение kit_D » 13 мар 2012, 17:51

Вот этот модуль. Сразу скажу, что в нем захардкожено имя интерфейса wlan0 (но ведь не в этом суть)
Ядро которое я использую - 3.0.0-16-generic
Модуль надо компилировать на нем, т.к. семантика вызовов немного изменилась по сравнению с предыдущими версиями.
После компиляции модуля надо сделать следующее:
insmod crypto.ko
ifconfig crypto 1.2.3.4

Модуль автоматически подключается к перехвату входящих пакетов по wlan0, но на самом деле он просто регистрирует в логе факт приема пакета, его MAC адреса, длину и т.п.
Кроме того если попробовать сделать пинг на 1.2.3.10, то в ifconfig также будет отображаться статистика пакетов исходящих из интерфейса crypt (которые надо бы потом перекладывать в wlan0, но этого пока нет).

Пример использования netdev_rx_handler_register() хука можно увидеть в исходниках ядра в /net/bridge.
Вложения
crypto0.tar.gz
(1.51 КБ) 595 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 18:56

kit_D писал(а):Пример использования netdev_rx_handler_register() хука можно увидеть в исходниках ядра в /net/bridge.
Очень любопытно, пошёл рассматривать.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 20:07

Olej писал(а):
kit_D писал(а):Пример использования netdev_rx_handler_register() хука можно увидеть в исходниках ядра в /net/bridge.
Очень любопытно, пошёл рассматривать.
н-да ... на предыдущих ядрах :-o :

Код: Выделить всё

[olej@notebook net-crypto]$ make
make -C /lib/modules/2.6.32.9-70.fc12.i686.PAE/build M=/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto modules 
make[1]: Entering directory `/usr/src/kernels/2.6.32.9-70.fc12.i686.PAE'
  CC [M]  /home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.o
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.c:20: ошибка: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘handle_frame’
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.c: В функции ‘crypto_init’:
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.c:125: ошибка: неявная декларация функции ‘netdev_rx_handler_register’
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.c:125: ошибка: ‘handle_frame’ не описан (первое использование в этой функции)
...
:cry:

Вопрос 1-й: с какого точно ядра netdev_rx_handler_register() появляется?

Вопрос 2-й: есть ли эквиваленты в более ранних версиях?

kit_D
Писатель
Сообщения: 52
Зарегистрирован: 13 мар 2012, 13:14
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение kit_D » 13 мар 2012, 21:00

Согласно http://lxr.free-electrons.com/ident?v=2 ... r_register получается так, что эта функция появилась в 2.6.36. Мда, похоже надо будет делать отдельную версию модуля для более раннего ядра, т.к. в Android 2.3 (Gingerbread) используется 2.6.35. Все же пока думаю сфокусироваться на 3.0 ядре

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 22:05

kit_D писал(а):Согласно http://lxr.free-electrons.com/ident?v=2 ... r_register получается так, что эта функция появилась в 2.6.36. Мда, похоже надо будет делать отдельную версию модуля для более раннего ядра, т.к. в Android 2.3 (Gingerbread) используется 2.6.35. Все же пока думаю сфокусироваться на 3.0 ядре
Это совсем не обязательно, поскольку всё время в ядре Linux появляются "заменители" одних API на других ... которые вряд ли лучше, и мало понятно, зачем это заменительство происходит. Замечательны пример тому:
- история с kallsyms_lookup_name(), который появился в ядре где-то около 2.6.35 ...
- и который полностью перекрывается функционально вызовом kallsyms_on_each_symbol(), который существует в ядре с давних времён...

Так и здесь: нужно посмотреть на вещи близкие и совместимые...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 22:10

Olej писал(а): Вопрос 2-й: есть ли эквиваленты в более ранних версиях?

Код: Выделить всё

Начнём вот с такой простой "плюшечки":
[olej@notebook net-crypto]$ cat /proc/kallsyms | grep T | grep netdev
c07166bf T __netdev_alloc_skb
c0716d86 T __netdev_alloc_page
c0719cd9 T init_dummy_netdev
c0719da1 T netdev_increment_features
c071a015 T netdev_fix_features
c071a62e T netdev_drivername
c071ac72 T netdev_set_master
c071b214 T free_netdev
c071c790 T netdev_rx_csum_fault
c071d190 T call_netdevice_notifiers
c071d1a8 T netdev_run_todo
c071d7cf T netdev_bonding_change
c071d7e4 T netdev_state_change
c071d815 T netdev_features_change
c071d82b T unregister_netdevice_notifier
c071d859 T register_netdevice_notifier
c071db2a T unregister_netdevice
c071db76 T unregister_netdev
c071ea5b T netdev_boot_setup_check
c071eab5 T netdev_boot_base
c071eb35 T register_netdevice
c071ed83 T register_netdev
c071edc9 T alloc_netdev_mq
c07272ce T netdev_kobject_init
c072797f T netdev_initialize_kobject
c0727993 T netdev_class_remove_file
c07279a9 T netdev_class_create_file
c07279bf T netdev_register_kobject
c0727d5b T netdev_unregister_kobject
c072b759 T __netdev_watchdog_up
c07631e2 T inetdev_by_index
c0a2af18 T netdev_boot_setup
(это ядро 2.6.32)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Виртуальное сетевой устройство с криптованием

Непрочитанное сообщение Olej » 13 мар 2012, 22:31

Olej писал(а):Вопрос 1-й: с какого точно ядра netdev_rx_handler_register() появляется?
kit_D, пока я не добрался до более позднего ядра, скопируйте мне (да и не только мне) сюда прототипы (из /linux/*.h) функций:
- netdev_rx_handler_register()
- netdev_rx_handler_unregister()

Код: Выделить всё

/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.c:125: ошибка: неявная декларация функции ‘netdev_rx_handler_register’
...
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/net-crypto/crypto0.c:153: ошибка: неявная декларация функции ‘netdev_rx_handler_unregister’
Да, согласно http://lxr.free-electrons.com/ident?v=2 ... r_register netdev_rx_handler_register() появляется после 2.6.35 и именно в 2.6.36

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей