|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Slawa Olhovchenkov 2:5030/500 10 Sep 2005 10:28:18 To : Gleb Smirnoff Subject : divert -------------------------------------------------------------------------------- 10 Sep 05, Gleb Smirnoff writes to Slawa Olhovchenkov: SO>> Правило ipfw: divert 9999 udp from any to 255.255.255.255 recv ng* SO>> Открыти/биндинг проходит нормально, дальше я только существенные куски SO>> буду давать. dhcp живет в локалке, на fxp0, 10.200.0.1/24 vpn -- mpd, SO>> 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)); GS> А почему не делать просто GS> sendto(divert, buf, size, 0, (struct sockaddr *)&from, &from_len); GS> ? GS> Во всяком случае так в мануале советуют? я хочу входной интерфейс поменять. с ng0 на fxp0. что бы dhcpd обмануть. SO>> Все работает, но ответов от dhcpd прилетает _два_. Такое впечатление, SO>> что пакет попадает к dhcpd дважды. GS> А читается из сокета точно один? ага GS> Если запустить и твою программку и dhcpd с дебагом, что бы печатали GS> про каждый пакет, то какая картина выходит? я даже с tcpdump запускал. прилетает один, програмка говорит один, dhcpd радостно орет про два, tcpdump показывает два ответа. 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 для адреса SO>> 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>> Где я неправ? GS> Еще имеет смысл вставить log к правилу divert и к тому, что ниже его. Как должен выглядеть log "к тому, что ниже его"? ... Здесь вам не Aнглия, копайте глубже! --- GoldED+/BSD 1.1.5 * Origin: (2:5030/500) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/222143227dce.html, оценка из 5, голосов 10
|