|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/22214321cf8c.html, оценка из 5, голосов 10
|