Пусть надо форвардить например в такой ситуации:
есть mail-сервер, адрес пусть 10.0.0.1; есть моя машина, адрес 10.0.0.2; На моей машине прописываем:
ipfw add 40 fwd <10.0.0.1>,25 tcp from any to <10.0.0.2> 25
У себя на машине ввожу:
>telnet alexsun 25
Trying alexsun...
И все. Больше ничего не происходит. Решил разобраться. Ковырять решил файл: /usr/src/sys/netinet/ip_output.c
Прописал в нем:
#define IPFIREWALL_FORWARD_DEBUG
Там дальше есть такая конструкция:
#ifdef IPFIREWALL_FORWARD_DEBUG
printf("IPFIREWALL_FORWARD: New dst ip: ");
print_ip(dst->sin_addr);
printf("\n");
#endif
Ну и я по примеру прописал еще в трех местах:
(строчки не указываю, так как после моего ковыряния в этом файле строчки с исходным текстом не совпадают). Искать надо по совпадениям в первой строчке фрагмента текста. Например здесь - по bcopy (... и т.д.
bcopy(dst, &ro_fwd->ro_dst, sizeof(*dst));
/* Added by AlexTheSun, 07.02.2002 */
#ifdef IPFIREWALL_FORWARD_DEBUG
printf("IPFIREWALL_FORWARD: step 1: ");
print_ip(dst->sin_addr);
printf("\n");
#endif
...............
dst = (struct sockaddr_in *)&ro_fwd->ro_dst;
/* Added by AlexTheSun, 07.02.2002 */
#ifdef IPFIREWALL_FORWARD_DEBUG
printf("IPFIREWALL_FORWARD: step 2: ");
print_ip(dst->sin_addr);
printf("\n");
#endif
..................А здесь по последней...
/* Added by AlexTheSun, 07.02.2002 */
#ifdef IPFIREWALL_FORWARD_DEBUG
printf("IPFIREWALL_FORWARD: step 3: ");
printf("%d ", dst->sin_port);
print_ip(dst->sin_addr);
printf("\n");
#endif
error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, ro->ro_rt);
Пересобрал ядро, пишу:
>telnet alexsun 25
Trying alexsun...
IPFIREWALL_FORWARD: New dst ip: 10.0.0.1
IPFIREWALL_FORWARD: step 1: 10.0.0.1
IPFIREWALL_FORWARD: step 2: 10.0.0.1
IPFIREWALL_FORWARD: step 3: 25 10.0.0.1
IPFIREWALL_FORWARD: step 3: 0 10.0.0.2
Где 0 и 25 в двух последних строчках - номер порта.
Посему выходит, что вроде все нормально и функция if_output (см. последний фрагмент кода) пересылает сформированный пакет в интерфейс.
При этом на mail-сервере ставим:
>tcpdump src 10.0.0.2 and port 25
Listening interface rl0...
И все. Никаких пакетов сюда не доходит. В чем дело?
И причем здесь последняя строчка (....step 3: 0 10.0.0.2)?
В общем здесь все несколько сумбурно наверно написано, возможно и понять сложно, что я пытался здесь объяснить... ну в общем, если кому интересно стало, или кто знает ядро Unix очень хорошо, может что-нибудь подскажет, а?
С уважением, Солнышко