The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Работа с интерфейсом tun под FreeBSD"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Работа с интерфейсом tun под FreeBSD"
Сообщение от AMDmi3 Искать по авторуВ закладки on 27-Сен-04, 21:49  (MSK)
Пишу прогу для ip-over-udp туннелинга, которая использует интерфейс tun(4).

При запуске программа должна открыть файл /dev/tunN, присвоить интерфейсу локальный и удаленный адреса, поменять mtu, ну и поднять его. Все это вроде бы работает, т.е. запускаем 2 копии программы для 2 концов туннеля, получаем:

ifconfig:
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 192.168.3.2 --> 192.168.3.1 netmask 0xffffff00
        Opened by PID 71348
tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 192.168.3.1 --> 192.168.3.2 netmask 0xffffff00
        Opened by PID 71353

netstat -rn:
Destination        Gateway            Flags    Refs      Use  Netif Expire
192.168.3.1        192.168.3.2        UH          0        0   tun0
192.168.3.2        192.168.3.1        UH          0        0   tun1

Но, если сделать ping 192.168.3.1, то пакеты идут не в tun, а в rl0, т.е. к default gateway, где, ессно, грохаются.

Самое интересное: если после запуска прог и поднятия ими интерфейсов сделать так:
ifconfig tun0 inet 192.168.3.2 192.168.3.1
ifconfig tun1 inet 192.168.3.1 192.168.3.2

то есть присвоить интерфейсам те же адреса, что у них уже есть, все начинает отлично работать.

Инициализируются у меня интерфейсы так:

// Open tun device
tundev = open(fulldevname, O_RDWR);

// Name the interface
bzero(&ifra, sizeof(ifra));
bzero(&ifr, sizeof(ifr));

strcpy(ifr.ifr_name, devname);
strcpy(ifra.ifra_name, devname);

// Open control socket
int s;
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

// Set interface addresses
struct sockaddr_in *psin;

psin = (struct sockaddr_in *)&(ifra.ifra_addr);
psin->sin_len = sizeof(struct sockaddr_in);
psin->sin_family = AF_INET;
memcpy(&(psin->sin_addr), &locaddr, sizeof(struct sockaddr_in));

psin = (struct sockaddr_in *)&(ifra.ifra_broadaddr);
psin->sin_len = sizeof(struct sockaddr_in);
psin->sin_family = AF_INET;
memcpy(&(psin->sin_addr), &remaddr, sizeof(struct sockaddr_in));

ioctl(s, SIOCAIFADDR, &ifra);

// Set interface mtu
ioctl(s, SIOCGIFMTU, &ifr);
oldmtu = ifr.ifr_mtu;
ifr.ifr_mtu = mtu;
ioctl(s, SIOCSIFMTU, &ifr);

// bring the interface UP
ioctl(s, SIOCGIFFLAGS, &ifr);
ifr.ifr_flags |= IFF_UP;
ioctl(s, SIOCSIFFLAGS, &ifr);

close(s);

Ума не приложу что я упустил, может SIOCDIFADDR надо делать?
Посмотрел исходники nos-tun (программа для IP/IP туннелинга, есть в комплекте FreeBSD), так там вот что написано:

/*
*  Delete (previous) addresses for interface
*
*  !!!!
*  On FreeBSD this ioctl returns error
*  when tunN have no addresses, so - log and ignore it.
*
*/
if (ioctl(s, SIOCDIFADDR, &ifra) < 0) {
  syslog(LOG_ERR,"SIOCDIFADDR - %m");
}

Собственно, конкретные вопросы:
- почему у меня пакеты начинают ходить в интерфейс tun только когда я сделаю ему ifconfig с его собственными адресами (фактически ничего не изменив), хотя в таблице роутинга черным по белому написано что 192.168.3.1 через tun?
- если все-таки нужно делать SIODIFADDR, то как это делать правильно? Как в nos-tun, просто сделать и игнорировать возможные ошибки, или как-то более правильно можно?

Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Работа с интерфейсом tun под FreeBSD"
Сообщение от kir Искать по авторуВ закладки(??) on 29-Сен-04, 19:34  (MSK)
>Пишу прогу для ip-over-udp туннелинга, которая использует интерфейс tun(4).
>
>При запуске программа должна открыть файл /dev/tunN, присвоить интерфейсу локальный и удаленный
>адреса, поменять mtu, ну и поднять его. Все это вроде бы
>работает, т.е. запускаем 2 копии программы для 2 концов туннеля, получаем:
>
>
>ifconfig:
>tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
>        inet 192.168.3.2 --> 192.168.3.1 netmask 0xffffff00
>        Opened by PID 71348
>
>tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
>        inet 192.168.3.1 --> 192.168.3.2 netmask 0xffffff00
>        Opened by PID 71353
>
>
>netstat -rn:
>Destination        Gateway    
>        Flags  
> Refs      Use  Netif Expire
>
>192.168.3.1        192.168.3.2    
>    UH      
>   0        
>0   tun0
>192.168.3.2        192.168.3.1    
>    UH      
>   0        
>0   tun1
>
>Но, если сделать ping 192.168.3.1, то пакеты идут не в tun, а
>в rl0, т.е. к default gateway, где, ессно, грохаются.
>
>Самое интересное: если после запуска прог и поднятия ими интерфейсов сделать так:
>
>ifconfig tun0 inet 192.168.3.2 192.168.3.1
>ifconfig tun1 inet 192.168.3.1 192.168.3.2
>
>то есть присвоить интерфейсам те же адреса, что у них уже есть,
>все начинает отлично работать.
>
>Инициализируются у меня интерфейсы так:
>
>// Open tun device
>tundev = open(fulldevname, O_RDWR);
>
>// Name the interface
>bzero(&ifra, sizeof(ifra));
>bzero(&ifr, sizeof(ifr));
>
>strcpy(ifr.ifr_name, devname);
>strcpy(ifra.ifra_name, devname);
>
>// Open control socket
>int s;
>s = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
>
>// Set interface addresses
>struct sockaddr_in *psin;
>
>psin = (struct sockaddr_in *)&(ifra.ifra_addr);
>psin->sin_len = sizeof(struct sockaddr_in);
>psin->sin_family = AF_INET;
>memcpy(&(psin->sin_addr), &locaddr, sizeof(struct sockaddr_in));
>
>psin = (struct sockaddr_in *)&(ifra.ifra_broadaddr);
>psin->sin_len = sizeof(struct sockaddr_in);
>psin->sin_family = AF_INET;
>memcpy(&(psin->sin_addr), &remaddr, sizeof(struct sockaddr_in));
>
>ioctl(s, SIOCAIFADDR, &ifra);
>
>// Set interface mtu
>ioctl(s, SIOCGIFMTU, &ifr);
>oldmtu = ifr.ifr_mtu;
>ifr.ifr_mtu = mtu;
>ioctl(s, SIOCSIFMTU, &ifr);
>
>// bring the interface UP
>ioctl(s, SIOCGIFFLAGS, &ifr);
>ifr.ifr_flags |= IFF_UP;
>ioctl(s, SIOCSIFFLAGS, &ifr);
>
>close(s);
>
>Ума не приложу что я упустил, может SIOCDIFADDR надо делать?
>Посмотрел исходники nos-tun (программа для IP/IP туннелинга, есть в комплекте FreeBSD), так
>там вот что написано:
>
>/*
>*  Delete (previous) addresses for interface
>*
>*  !!!!
>*  On FreeBSD this ioctl returns error
>*  when tunN have no addresses, so - log and ignore
>it.
>*
>*/
>if (ioctl(s, SIOCDIFADDR, &ifra) < 0) {
>  syslog(LOG_ERR,"SIOCDIFADDR - %m");
>}
>
>Собственно, конкретные вопросы:
>- почему у меня пакеты начинают ходить в интерфейс tun только когда
>я сделаю ему ifconfig с его собственными адресами (фактически ничего не
>изменив), хотя в таблице роутинга черным по белому написано что 192.168.3.1
>через tun?
>- если все-таки нужно делать SIODIFADDR, то как это делать правильно? Как
>в nos-tun, просто сделать и игнорировать возможные ошибки, или как-то более
>правильно можно?
>
>Спасибо.
посмотрите в исходники ifconfig'a насчет того какие ioctl он вызывает и все станет ясно;o)


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Работа с интерфейсом tun под FreeBSD"
Сообщение от antons emailИскать по авторуВ закладки(ok) on 20-Окт-04, 09:37  (MSK)
>Пишу прогу для ip-over-udp туннелинга, которая использует интерфейс tun(4).
>
>При запуске программа должна открыть файл /dev/tunN, присвоить интерфейсу локальный и удаленный
>адреса, поменять mtu, ну и поднять его. Все это вроде бы
>работает, т.е. запускаем 2 копии программы для 2 концов туннеля, получаем:
>
>
>ifconfig:
>tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
>        inet 192.168.3.2 --> 192.168.3.1 netmask 0xffffff00
>        Opened by PID 71348
>
>tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
>        inet 192.168.3.1 --> 192.168.3.2 netmask 0xffffff00
>        Opened by PID 71353
>
>
>netstat -rn:
>Destination        Gateway    
>        Flags  
> Refs      Use  Netif Expire
>
>192.168.3.1        192.168.3.2    
>    UH      
>   0        
>0   tun0
>192.168.3.2        192.168.3.1    
>    UH      
>   0        
>0   tun1
>
>Но, если сделать ping 192.168.3.1, то пакеты идут не в tun, а
>в rl0, т.е. к default gateway, где, ессно, грохаются.
>
>Самое интересное: если после запуска прог и поднятия ими интерфейсов сделать так:
>
>ifconfig tun0 inet 192.168.3.2 192.168.3.1
>ifconfig tun1 inet 192.168.3.1 192.168.3.2
>
>то есть присвоить интерфейсам те же адреса, что у них уже есть,
>все начинает отлично работать.
>
>Инициализируются у меня интерфейсы так:

У меня установлен openvpn, работает аналогично, но в добавок может шифровать, так вот, когда она поднимает tun и присваивает адреса, а делает она это так же как и ifconfig, то маска получается 0xffffffff. Может сдесь грабли?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Работа с интерфейсом tun под FreeBSD"
Сообщение от eugene emailИскать по авторуВ закладки(??) on 24-Дек-04, 10:01  (MSK)

>У меня установлен openvpn, работает аналогично, но в добавок может шифровать, так
>вот, когда она поднимает tun и присваивает адреса, а делает она
>это так же как и ifconfig, то маска получается 0xffffffff. Может
>сдесь грабли?
У уменя тоже OpenVPN.Анологичная проблема. Удалось ли её решить?
Подскажите,плз. Очень срочно нужно!


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру