Криптование потока сетевого интерфейса

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

Модератор: Olej

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 04 апр 2012, 22:03

kit_D писал(а):Note: тут еще проблемка. netdev_rx_handler_register() относительно новый хук и появился он в 2.6.36, а мне надо чтобы модуль был также совместим с 2.6.35. Наверняка там есть какой-то аналог этой функции - надо копать
kit_D, ваши примеры все писались на основе вот этого старого примера: http://ar.linux.it/docs/vinter/insane.tar.gz, или даже, если точнее, более поздней реализации: http://netlab-mn.unipv.it/insane/insane_2.6.31.tar.gz

Я сейчас как-раз стал с ними разбираться. Так вот, они написаны ещё для ядер 2.4 и 2.6.31 соответственно.
И, как я понял, используется в нашей любимой struct net_device поле dev->header_ops (которое в "спокойном" состоянии, подозреваю NULL), на которое вешается структура (операций):

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

/* --------------------------------------------------------------------------
 * create default header_ops struct
 */
static const struct header_ops insane_header_ops = {
    .create  = insane_create_header,
    .rebuild = insane_rebuild_header,
    .cache   = NULL, /* disable caching */
};

И сами операции, чтоб было понятно о чём речь:

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

/* --------------------------------------------------------------------------
 * header stuff: fall back on the slave interface to deal with this stuff
 */
static int insane_create_header(struct sk_buff *skb, struct net_device *dev,
        unsigned short type, const void *daddr, const void *saddr, unsigned len)
{
    struct insane_private *priv = netdev_priv(insane_dev);
    int retval;

    skb->dev = priv->priv_device;
    retval = skb->dev->header_ops->create(skb, skb->dev, type,
                                                                    daddr, saddr, len);
    skb->dev = dev;
    return retval;
}
static int insane_rebuild_header(struct sk_buff *skb)
{
    struct insane_private *priv = netdev_priv(insane_dev);
    int retval;
    
    skb->dev = priv->priv_device;
    retval = skb->dev->header_ops->rebuild(skb);
    skb->dev = insane_dev;
    return retval;
}
Я так понимаю, это и есть предыдущий механизм создания slave сетевых интерфейсов, для упрощения которых и сделали netdev_rx_handler_register().
Нужно только разобраться в его деталях.

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 05 апр 2012, 00:14

Olej писал(а):или даже, если точнее, более поздней реализации: http://netlab-mn.unipv.it/insane/insane_2.6.31.tar.gz
Только ихний хвалёный пример (от версии 2.4 до версии 2.6.31) в 2.6.42 (Fedora 15) даже не компилируется! (не помышляя даже о ядре 3.3.0, с которым я в VM обкатываю эти примеры):

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

[olej@notebook crypto3]$ uname -r
2.6.42.12-1.fc15.i686.PAE
[olej@notebook crypto3]$ 
[olej@notebook insane_2.6.31]$ make
make -C /lib/modules/2.6.42.12-1.fc15.i686.PAE/build M=/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31 modules
make[1]: Вход в каталог `/usr/src/kernels/2.6.42.12-1.fc15.i686.PAE'
  CC [M]  /home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.o
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.c: В функции «insane_neigh_setup»:
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.c:130:19: ошибка: «arp_broken_ops» undeclared (first use in this function)
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.c:130:19: замечание: each undeclared identifier is reported only once for each function it appears in
make[2]: *** [/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.o] Ошибка 1
make[1]: *** [_module_/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31] Ошибка 2
make[1]: Выход из каталога `/usr/src/kernels/2.6.42.12-1.fc15.i686.PAE'
make: *** [all] Ошибка 2
Если даже закомментировать ту строчку где оно ругается:

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

/* --------------------------------------------------------------------------
 * neighbors: this comes form shaper.c (Alan Cox) and is needed for ARP to work
 */
int insane_neigh_setup(struct neighbour *n)
{
    if (n->nud_state == NUD_NONE) {
//      n->ops = &arp_broken_ops;
        n->output = n->ops->output;
    }
    return 0;
}
- то собранное оно не подаёт никаких признаков работоспособности, с любопытными диагнозами:

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

[root@fedora16vm insane]# ip addr
...
3: p7p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:9e:02:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global p7p1
    inet6 fe80::a00:27ff:fe9e:202/64 scope link 
       valid_lft forever preferred_lft forever
5: insane: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:9e:61:26 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global insane
    inet6 fe80::a00:27ff:fe9e:6126/64 scope link 
       valid_lft forever preferred_lft forever

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

[root@fedora16vm insane]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0         UG    0      0        0 p2p1
192.168.1.0     *               255.255.255.0   U     1      0        0 p2p1
192.168.56.0    *               255.255.255.0   U     1      0        0 p7p1
192.168.56.1    *               255.255.255.255 UH    0      0        0 insane
ping снаружи + вот что видел tcpdump:

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

[olej@fedora16vm virt]$ sudo tcpdump -i p7p1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on p7p1, link-type EN10MB (Ethernet), capture size 65535 bytes
23:59:25.243356 ARP, Request who-has 192.168.56.101 tell 192.168.56.1, length 46
23:59:25.243413 ARP, Reply 192.168.56.101 is-at 08:00:27:9e:02:02 (oui Unknown), length 28
23:59:25.243476 IP 192.168.56.1 > 192.168.56.101: ICMP echo request, id 3418, seq 1, length 64
23:59:26.243171 IP 192.168.56.1 > 192.168.56.101: ICMP echo request, id 3418, seq 2, length 64
23:59:27.243193 IP 192.168.56.1 > 192.168.56.101: ICMP echo request, id 3418, seq 3, length 64
...
- на ARP запрос ответил MAC именно родительского интерфейса p7p1 (а не insane), а дальше безответные ICMP запросы.

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 05 апр 2012, 00:40

Olej писал(а): Только ихний хвалёный пример (от версии 2.4 до версии 2.6.31) в 2.6.42 (Fedora 15) даже не компилируется! (не помышляя даже о ядре 3.3.0, с которым я в VM обкатываю эти примеры):
Страшно не люблю начинать разбор с неработоспособных примеров.
Но, по моему предположению, оно у них и не должно было работать ни в 2.4, ни в 2.6.31 ... т.е. при каких-то стечениях обстоятельств (IP-адресов etc.) им могло показаться, что оно работает, но в общем случае не должно ;-) :
- см. в коде примера, когда они установили виртуальный интерфейс на реальный:

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

            /* also, and clone its IP, MAC and other information */
            memcpy(dev->dev_addr,  slave->dev_addr,  sizeof(slave->dev_addr));
            memcpy(dev->broadcast, slave->broadcast, sizeof(slave->broadcast));
- но MAC для Ethernet - это 6 байт, а у них записан размер указателя, который в 32-бит системе - 4 байта, а в 64 - 8...
Что и смутило меня в предыдущем выполнении:

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

[root@fedora16vm insane]# ip addr
...
3: p7p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:9e:02:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global p7p1
    inet6 fe80::a00:27ff:fe9e:202/64 scope link 
       valid_lft forever preferred_lft forever
5: insane: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:9e:61:26 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global insane
    inet6 fe80::a00:27ff:fe9e:6126/64 scope link 
       valid_lft forever preferred_lft forever

- первые 4 байта MAC (08:00:27:9e) совпадают, а дальше - вразнос (02:02 & 61:26)
- этот их фрагмент должен быть записан как:

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

            memcpy( dev->dev_addr, slave->dev_addr, ETH_ALEN );
            memcpy( dev->broadcast, slave->broadcast, ETH_ALEN );
- ... всё становится лучше ("уже намазывается..." ;-) ), но работоспособности не добавляет :cry: .

yevgen.kopylov
Интересующийся
Сообщения: 7
Зарегистрирован: 05 апр 2012, 09:18
Контактная информация:

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение yevgen.kopylov » 05 апр 2012, 09:51

Olej писал(а):
Только ихний хвалёный пример (от версии 2.4 до версии 2.6.31) в 2.6.42 (Fedora 15) даже не компилируется! (не помышляя даже о ядре 3.3.0, с которым я в VM обкатываю эти примеры):

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

[olej@notebook crypto3]$ uname -r
2.6.42.12-1.fc15.i686.PAE
[olej@notebook crypto3]$ 
[olej@notebook insane_2.6.31]$ make
make -C /lib/modules/2.6.42.12-1.fc15.i686.PAE/build M=/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31 modules
make[1]: Вход в каталог `/usr/src/kernels/2.6.42.12-1.fc15.i686.PAE'
  CC [M]  /home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.o
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.c: В функции «insane_neigh_setup»:
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.c:130:19: ошибка: «arp_broken_ops» undeclared (first use in this function)
/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.c:130:19: замечание: each undeclared identifier is reported only once for each function it appears in
make[2]: *** [/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31/insane.o] Ошибка 1
make[1]: *** [_module_/home/olej/2012_WORK/OWN.BOOKS/examples.DRAFT/network/insane_2.6.31] Ошибка 2
make[1]: Выход из каталога `/usr/src/kernels/2.6.42.12-1.fc15.i686.PAE'
make: *** [all] Ошибка 2
Это вам еще и повезло. Под windows если собирать - вообще гора ошибок...
Версии, они такие коварные. Иногда в следующую версии не только добавляют что-то бесполезно, но и удаляют что-то полезное...

changelog 2.6.37 говорит следующее:
...
arp remove unnecessary export of arp_broken_ops
...
http://kerneltrap.org/mailarchive/linux ... 29/6286100

Вы действительно считаете, что код содержит "лишние" строчки? От удаления которых функционал нисколько не меняется? Я пробывал компилировать Ваши примеры. Хочу огорчить - они не работоспособны. После коментирования некоторых строчек, конечно. :-D
Но, по моему предположению, оно у них и не должно было работать ни в 2.4, ни в 2.6.31
Insane работает и достаточно стабильно. Мне кажется, что зря Вы его критикуете в последующих постах.

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 08 апр 2012, 16:21

kit_D писал(а):В связи с этим выкладываю исходники. В них добавлено шифрование ICMP фреймов на выдающей стороне и, соответственно, расшифровывание на принимающей. Для проверки вставляем модули на двух машинах (на обоих они привяжуться к wlan0) и пингуем. Пинг идет в зашифрованом (XOR) виде.
Вопрос.
(он актуальный не только к этой теме, а вообще к сетевым интерфейсам, т.е. шире, и ему место где-то в другой теме, но ... хотелось бы этот вопрос, в первую очередь, адресовать kit_D, поэтому напишу его здесь, здесь с большей вероятностью он прочитает)

К каждому сетевому интерфейсу "приделывается" структура struct net_device_stats, где накапливается статистика работы интерфейса, и которую выкидывает метод интерфейса ndo_get_stats по команде ifconfig.

Я в разных кодах видел разное размещение struct net_device_stats:

1. если модуль обслуживает сетевой интерфейс один - просто как структура описанная на верхнем уровне (глобальной видимости):

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

static struct net_device_stats stats;
2. в составе структуры приватных данных сетевого интерфейса:

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

struct priv {
   struct net_device_stats stats;
   ...
};

потом такого типа приватная структура будет создана при инициализации интерфейса:

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

alloc_netdev( sizeof( struct priv ), ifstr, setup );

и тем самым указатель на struct priv (нашей собственной структуризации!) заносится в ... здесь место хитрое - в хвост структуры struct net_device?
и потом эта приватная структура при любом случае извлекается вызовом netdev_priv(), который вот так хитро определён (поэтому я и предположил, что она находится "за хвостом"):

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

/*
 * Get network device private data
 */
static inline void *netdev_priv(const struct net_device *dev)
{
        return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
}
3. но!
есть структура статистики, имплементированная непосредственно в тело любой struct net_device:

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

        struct net_device_stats stats;

- которая не указатель, а именно сама структура в теле, где она висит и бездарно не используется.

Почему вы её не используете?
Просто лень было временно возиться? или на то есть какие-то веские аргументы?

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение kit_D » 09 апр 2012, 11:25

Мда, к сожалению мы просто скопипастили из какого-от примера. Так что что-то внятное ответить не могу. Извините.

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 09 апр 2012, 11:49

kit_D писал(а):Мда, к сожалению мы просто скопипастили из какого-от примера. Так что что-то внятное ответить не могу. Извините.
Ну подумайте над разными вариантами на досуге? ;)

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 30 апр 2012, 10:07

yevgen.kopylov писал(а):
Olej писал(а): Только ихний хвалёный пример (от версии 2.4 до версии 2.6.31) в 2.6.42 (Fedora 15) даже не компилируется! (не помышляя даже о ядре 3.3.0, с которым я в VM обкатываю эти примеры):
Это вам еще и повезло. Под windows если собирать - вообще гора ошибок...
Версии, они такие коварные. Иногда в следующую версии не только добавляют что-то бесполезно, но и удаляют что-то полезное...

changelog 2.6.37 говорит следующее:
...
arp remove unnecessary export of arp_broken_ops
...
http://kerneltrap.org/mailarchive/linux ... 29/6286100

Вы действительно считаете, что код содержит "лишние" строчки? От удаления которых функционал нисколько не меняется? Я пробывал компилировать Ваши примеры. Хочу огорчить - они не работоспособны. После коментирования некоторых строчек, конечно. :-D
Но, по моему предположению, оно у них и не должно было работать ни в 2.4, ни в 2.6.31
Insane работает и достаточно стабильно. Мне кажется, что зря Вы его критикуете в последующих постах.
Я не заметил вовремя это сообщение, жаль...

1. мне интересно: в каких версиях "Insane работает и достаточно стабильно"?
хотелось бы подробнее объяснений и посмотреть логи и т.п.

2. ... не любопытства ради, а чтобы сделать что-то подобное в современных версиях.

yevgen.kopylov
Интересующийся
Сообщения: 7
Зарегистрирован: 05 апр 2012, 09:18
Контактная информация:

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение yevgen.kopylov » 30 апр 2012, 16:47

Olej писал(а):
yevgen.kopylov писал(а):
Olej писал(а): Только ихний хвалёный пример (от версии 2.4 до версии 2.6.31) в 2.6.42 (Fedora 15) даже не компилируется! (не помышляя даже о ядре 3.3.0, с которым я в VM обкатываю эти примеры):
Это вам еще и повезло. Под windows если собирать - вообще гора ошибок...
Версии, они такие коварные. Иногда в следующую версии не только добавляют что-то бесполезно, но и удаляют что-то полезное...

changelog 2.6.37 говорит следующее:
...
arp remove unnecessary export of arp_broken_ops
...
http://kerneltrap.org/mailarchive/linux ... 29/6286100

Вы действительно считаете, что код содержит "лишние" строчки? От удаления которых функционал нисколько не меняется? Я пробывал компилировать Ваши примеры. Хочу огорчить - они не работоспособны. После коментирования некоторых строчек, конечно. :-D
Но, по моему предположению, оно у них и не должно было работать ни в 2.4, ни в 2.6.31
Insane работает и достаточно стабильно. Мне кажется, что зря Вы его критикуете в последующих постах.
Я не заметил вовремя это сообщение, жаль...

1. мне интересно: в каких версиях "Insane работает и достаточно стабильно"?
хотелось бы подробнее объяснений и посмотреть логи и т.п.

2. ... не любопытства ради, а чтобы сделать что-то подобное в современных версиях.
1. Я использовал, если не ошибаюсь, 2.6.32 ядро. Тогда у меня все работало и я на примере этого модуля сделал что-то свое и т.д. и т.п...
Почему он не собрался в 2.6.42 - я ссылку давал. С 2.4 дела не имел, сорри.
http://netlab-mn.unipv.it/insane/ писал(а):In Summer 2009 Dr. Filippo Bistaffa rewrote ported insane driver to Linux 2.6.31...
т.е. мне повезло в том что ядро 2.6.32 не успело измениться так сильно :)
Логи компиляции\линковки или логи работы? К сожалению они не сохранились, а сейчас у меня есть другие, более интересные задачи.
Можно, конечно, вернуть export и пересобрать ядро :). Ну или искать другой путь чтобы insane собирался-работал на оригинальном новом ядре.

BTW. Основной мессадж того поста был в том что insane, как пример, хвалят не напрасно. Это годный пример. А проблема всего лишь в новых версиях ядра. Ну и часто драйвер нужно портировать на следующую версию ядра. Тот же net_device меняется от версии к версии.

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

Re: Криптование потока сетевого интерфейса

Непрочитанное сообщение Olej » 30 апр 2012, 20:10

yevgen.kopylov писал(а):BTW. Основной мессадж того поста был в том что insane, как пример, хвалят не напрасно. Это годный пример. А проблема всего лишь в новых версиях ядра.
Меня, собственно, совсем не интересовал сам insane, и не его конкретно логи или что-то подобное.
Меня интересовал тот вопрос, который где-то там задал kit_D:
- как без использования netdev_rx_handler_register(), который появился с 2.6.37, делался перехват виртуальным интерфейсом потока принимаемых (RX, с TX всё понятно и проще) сокетных буферов?
- ведь виртуальные интерфейсы создавались задолго до 2.6.37? ... тот же Cisco-клиент VPN... и мн.др.

Мне подумалось, что у вас есть какие-то соображения на этот счёт, а не конкретно обязательно о insane.

А если таковые соображения и есть, то их куда лучше продолжать обсуждать вот в такой теме: простой виртуальный сетевой интерфейс.

Ответить

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

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

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