|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Gleb Smirnoff 2:5020/400 10 Sep 2005 07:18:35 To : Slawa Olhovchenkov Subject : Re: divert -------------------------------------------------------------------------------- Slawa Olhovchenkov <Slawa.Olhovchenkov@f500.n5030.z2.fidonet.org> wrote: SO> Правило ipfw: divert 9999 udp from any to 255.255.255.255 recv ng* SO> Открыти/биндинг проходит нормально, дальше я только существенные куски буду SO> давать. SO> dhcp живет в локалке, на fxp0, 10.200.0.1/24 SO> vpn -- mpd, proxy arp, 10.200.0.160 (для определенности) SO> struct ip *pkt; SO> struct udphdr *ud; SO> bzero(&dest, sizeof(dest)); SO> dest.sin_family = AF_INET; SO> dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY); SO> from_len = sizeof(from); SO> size = recvfrom(divert, buf, sizeof(buf), 0, (struct sockaddr *)&from, SO> &from_len); SO> dest.sin_port = from.sin_port; SO> pkt = (struct ip *)buf; SO> ud = (struct udphdr *)(buf + (pkt->ip_hl << 2)); SO> inet_aton("10.200.0.255", &pkt->ip_dst); SO> pkt->ip_sum = IpChecksum(pkt); SO> ud->uh_sum = 0; SO> sendto(divert, buf, size, 0, (struct sockaddr *)&dest, sizeof(dest)); А почему не делать просто sendto(divert, buf, size, 0, (struct sockaddr *)&from, &from_len); ? Во всяком случае так в мануале советуют? SO> Все работает, но ответов от dhcpd прилетает _два_. Такое впечатление, что SO> пакет попадает к dhcpd дважды. А читается из сокета точно один? Если запустить и твою программку и dhcpd с дебагом, что бы печатали про каждый пакет, то какая картина выходит? SO> Более того, если я вместо 10.200.0.255 пишу 10.200.0.19 он все равно SO> умудряется отвечать! такое впечатление, что отдиверченный пакет продолжает SO> обрабатываться независимо. Hо если я не меняю ip_dst у пакета -- то и SO> единственного ответа нету. SO> val = 1; res = setsockopt(divert, SOL_SOCKET, SO_BROADCAST, &val, SO> sizeof(val)); SO> поведение не меняет. SO> Ладно, пробуем иначе SO> sin.sin_family = AF_INET; SO> inet_aton("10.200.0.1", &sin.sin_addr); SO> strlcpy(sin.sin_zero, "fxp0", sizeof(sin.sin_zero)); SO> from_len = sizeof(from); SO> size = recvfrom(divert, buf, sizeof(buf), 0, (struct sockaddr *)&from, SO> &from_len); SO> sin.sin_port = from.sin_port; SO> pkt = (struct ip *)buf; SO> ud = (struct udphdr *)(buf + (pkt->ip_hl << 2)); SO> sendto(divert, buf, size, 0, (struct sockaddr *)&sin, sizeof(sin)); SO> типа пакет должен якобы приняться с интерфейса fxp0 для адреса 10.200.0.1. SO> Фиг. dhcpd не видит, tcpdump на fxp0 ничего не кажет. SO> добавляем SO> inet_aton("10.200.0.1", &pkt->ip_dst); SO> pkt->ip_sum = IpChecksum(pkt); SO> ud->uh_sum = 0; SO> результат -- аналогично отрицательный. SO> Где я неправ? Еще имеет смысл вставить log к правилу divert и к тому, что ниже его. -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/6577f7a71aa6.html, оценка из 5, голосов 10
|