Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Slawa Olhovchenkov                   2:5030/500     09 Sep 2005  21:41:54
 To : All
 Subject : divert
 -------------------------------------------------------------------------------- 
 
 
 Посмотрев на пример http://www.bsdnews.org/01/game_vpn.php я ужаснулся, понял
 что мне он напрямую не подходит и начал ваять на Си програмку.
 
 Hо что-то я в divert и стеке не понимаю.
 
 Правило ipfw: divert 9999 udp from any to 255.255.255.255 recv ng*
 
 Открыти/биндинг проходит нормально, дальше я только существенные куски буду
 давать.
 dhcp живет в локалке, на fxp0, 10.200.0.1/24
 vpn -- mpd, proxy arp, 10.200.0.160 (для определенности)
 
 struct ip *pkt;
 struct udphdr *ud;
 
 bzero(&dest, sizeof(dest));
 dest.sin_family = AF_INET;
 dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY);
 
 from_len = sizeof(from);
 size = recvfrom(divert, buf, sizeof(buf), 0, (struct sockaddr *)&from,
 &from_len);
 dest.sin_port = from.sin_port;
 pkt = (struct ip *)buf;
 ud = (struct udphdr *)(buf + (pkt->ip_hl << 2));
 inet_aton("10.200.0.255", &pkt->ip_dst);
 
 pkt->ip_sum = IpChecksum(pkt);
 ud->uh_sum = 0;
 
 sendto(divert, buf, size, 0, (struct sockaddr *)&dest, sizeof(dest));
 
 Все работает, но ответов от dhcpd прилетает _два_. Такое впечатление, что пакет 
 попадает к dhcpd дважды.
 Более того, если я вместо 10.200.0.255 пишу 10.200.0.19 он все равно умудряется 
 отвечать! такое впечатление, что отдиверченный пакет продолжает обрабатываться
 независимо. Hо если я не меняю ip_dst у пакета -- то и единственного ответа
 нету.
 
 val = 1; res = setsockopt(divert, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val));
 
 поведение не меняет.
 
 Ладно, пробуем иначе
 
 sin.sin_family = AF_INET;
 inet_aton("10.200.0.1", &sin.sin_addr);
 strlcpy(sin.sin_zero, "fxp0", sizeof(sin.sin_zero));
 from_len = sizeof(from);
 size = recvfrom(divert, buf, sizeof(buf), 0, (struct sockaddr *)&from,
 &from_len);
 sin.sin_port = from.sin_port;
 pkt = (struct ip *)buf;
 ud = (struct udphdr *)(buf + (pkt->ip_hl << 2));
 sendto(divert, buf, size, 0, (struct sockaddr *)&sin, sizeof(sin));
 
 типа пакет должен якобы приняться с интерфейса fxp0 для адреса 10.200.0.1.
 
 Фиг. dhcpd не видит, tcpdump на fxp0 ничего не кажет.
 
 добавляем
 
 inet_aton("10.200.0.1", &pkt->ip_dst);
 
 pkt->ip_sum = IpChecksum(pkt);
 ud->uh_sum = 0;
 
 результат -- аналогично отрицательный.
 
 Где я неправ?
 
 ... Что же это у вас, чего не хватишься, ничего нет!
 --- GoldED+/BSD 1.1.5
  * Origin:  (2:5030/500)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 divert   Slawa Olhovchenkov   09 Sep 2005 21:41:54 
 Re: divert   Gleb Smirnoff   10 Sep 2005 07:18:35 
 divert   Slawa Olhovchenkov   10 Sep 2005 10:28:18 
 divert   Slawa Olhovchenkov   10 Sep 2005 15:42:28 
 divert   Slawa Olhovchenkov   10 Sep 2005 16:02:32 
 Re: divert   Gleb Smirnoff   10 Sep 2005 22:20:36 
 divert   Slawa Olhovchenkov   10 Sep 2005 22:35:44 
 Re: divert   Gleb Smirnoff   11 Sep 2005 18:16:24 
 divert   Slawa Olhovchenkov   11 Sep 2005 20:17:38 
 divert   Vitalij Dodonov   21 Sep 2005 15:27:23 
 divert   Slawa Olhovchenkov   21 Sep 2005 15:47:20 
 divert   Vitalij Dodonov   21 Sep 2005 17:00:23 
 divert   Slawa Olhovchenkov   21 Sep 2005 18:00:22 
 Re: divert   Eugene Grosbein   10 Sep 2005 10:35:04 
 divert   Slawa Olhovchenkov   10 Sep 2005 10:32:04 
 Re: divert   Eugene Grosbein   10 Sep 2005 14:04:42 
 divert   Slawa Olhovchenkov   10 Sep 2005 11:25:58 
Архивное /ru.unix.bsd/22214321cf8c.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional