Виртуальное сетевой устройство с криптованием
Модератор: Olej
-
- Писатель
- Сообщения: 52
- Зарегистрирован: 13 мар 2012, 13:14
- Откуда: Харьков
- Контактная информация:
Виртуальное сетевой устройство с криптованием
Здравствуйте,
Передо мной поставлена довольно интересная задача. Суть состоит в том, чтобы реализовать кастомное шифрование сетевого трафика 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 и в зарегистрированном обработчике действительно вижу входящие фреймы.
Подскажите, возможные пути реализации задания, на что надо обратить внимание, возможно есть существующие аналоги.
Спасибо.
Передо мной поставлена довольно интересная задача. Суть состоит в том, чтобы реализовать кастомное шифрование сетевого трафика 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: Виртуальное сетевой устройство с криптованием
Сразу скажу, что тема здесь получится очень интересная.kit_D писал(а): Передо мной поставлена довольно интересная задача. Суть состоит в том, чтобы реализовать кастомное шифрование сетевого трафика WiFi сети. Заказчик предполагает следующую схему:
1) Создать виртуальное сетевое устройство (напр. crypto0), собственно реализующее шифрование фреймов, эдакий аналог того WPA
2) Сетевое устройство должно работать поверх существующего wifi устройства (напр., wlan0).
И гораздо шире, чем даже заданный вопрос.
И вот почему:
- достаточно легко отрабатывать сетевую систему, когда разработчик даёт вам живую железку на PCI ... дальше мы имеем IRQ где ловим пакеты и пакуем их в буфера сокетов, или записываем на передаче буфера сокетов непосредственно по портам этой железки...
- но такое удовольствие выпадает не часто и не всем (не так много в природе разработчиков железок, а число макетных плат у них тоже ограничено)
- вот как-раз очень интересная задача создать новый сетевой интерфейс, с тем, чтобы он был виртуальный, перенаправляемый на реально существующий интерфейс.
- так как это имеет место, например, с интерфейсами tun или br ...
Давайте смотреть.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
Очень интересно, Никита!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 (не всякие расширения форум примет)...
- в закладке "Добавить вложения" при редактировании ответа - прикрепляйте архив: "Выберите файл" -> "Добавить файл".
-
- Писатель
- Сообщения: 52
- Зарегистрирован: 13 мар 2012, 13:14
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
Вот этот модуль. Сразу скажу, что в нем захардкожено имя интерфейса 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.
Ядро которое я использую - 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 КБ) 601 скачивание
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
Очень любопытно, пошёл рассматривать.kit_D писал(а):Пример использования netdev_rx_handler_register() хука можно увидеть в исходниках ядра в /net/bridge.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
н-да ... на предыдущих ядрах :Olej писал(а):Очень любопытно, пошёл рассматривать.kit_D писал(а):Пример использования netdev_rx_handler_register() хука можно увидеть в исходниках ядра в /net/bridge.
Код: Выделить всё
[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’ не описан (первое использование в этой функции)
...
Вопрос 1-й: с какого точно ядра netdev_rx_handler_register() появляется?
Вопрос 2-й: есть ли эквиваленты в более ранних версиях?
-
- Писатель
- Сообщения: 52
- Зарегистрирован: 13 мар 2012, 13:14
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
Согласно 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: Виртуальное сетевой устройство с криптованием
Это совсем не обязательно, поскольку всё время в ядре Linux появляются "заменители" одних API на других ... которые вряд ли лучше, и мало понятно, зачем это заменительство происходит. Замечательны пример тому:kit_D писал(а):Согласно http://lxr.free-electrons.com/ident?v=2 ... r_register получается так, что эта функция появилась в 2.6.36. Мда, похоже надо будет делать отдельную версию модуля для более раннего ядра, т.к. в Android 2.3 (Gingerbread) используется 2.6.35. Все же пока думаю сфокусироваться на 3.0 ядре
- история с kallsyms_lookup_name(), который появился в ядре где-то около 2.6.35 ...
- и который полностью перекрывается функционально вызовом kallsyms_on_each_symbol(), который существует в ядре с давних времён...
Так и здесь: нужно посмотреть на вещи близкие и совместимые...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
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
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Виртуальное сетевой устройство с криптованием
kit_D, пока я не добрался до более позднего ядра, скопируйте мне (да и не только мне) сюда прототипы (из /linux/*.h) функций:Olej писал(а):Вопрос 1-й: с какого точно ядра netdev_rx_handler_register() появляется?
- 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’
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя