Ставил transparent proxy. Система у меня FreeBSD 4.4. Поставил OOPS, пропатчил ядро заплаткой gre.c, настроил кошак. Не работает. Проверяю с кошки - она мой кэш-сервер видит. Проверяю с кэш-сервера - пакеты в gre инкапсуляции на сервер идут. Поковырялся в модуле gre.o. Он пакеты нормально распаковывает. Значит дело в форвардинге пакетов.
Разобрался. Проблема в том, что ipfw не форвардит пакеты на Squid или OOPS.
Я в ядре указал опции:
IPFIREWALL
IPFIREWALL_FORWARD
IPFIREWALL_DIVERT
Собрал, прописал в /etc/sysctl.conf:
net.inet.ip.forwarding=1
В /etc/rc.firewall прописал
ipfw add 40 fwd <адрес кэш-сервера>,80 tcp from <адрес кэш-сервера> to any
Не работает! ;-(
Даже если напишу:
ipfw add 40 fwd <адрес ftp-сервера>,21 ip from any to any и наберу
>telnet <адрес кэш-сервера> 21, проваливаюсь на ftp на кэше!
Причем команда ipfw show показывает, что правило пакеты все-таки отлавливает, но не перенаправляет! В чем дело - не пойму. Помогите плиз!!!И еще. Покопался в исходниках. Файлы /usr/src/sys/netinet/ip_fw.c и ip_output.c Там есть ссылки на опцию ядра IPFIREWALL_FORWARD_DEBUG, но такой опции ни в LINT, ни в /usr/src/sys/conf/options я не нашел. Странно все это. Да и некоторые комментарии в выше обозначенных файлах позабавили...
С уважением, Солнышко
>Ставил transparent proxy. Система у меня
>FreeBSD 4.4. Поставил OOPS, пропатчил
>ядро заплаткой gre.c, настроил кошак.
>Не работает. Проверяю с кошки
>- она мой кэш-сервер видит.
>Проверяю с кэш-сервера - пакеты
>в gre инкапсуляции на сервер
>идут. Поковырялся в модуле gre.o.
>Он пакеты нормально распаковывает. Значит
>дело в форвардинге пакетов.
>Разобрался. Проблема в том, что ipfw
>не форвардит пакеты на Squid
>или OOPS.
>Я в ядре указал опции:
>IPFIREWALL
>IPFIREWALL_FORWARD
>IPFIREWALL_DIVERT
>Собрал, прописал в /etc/sysctl.conf:
>net.inet.ip.forwarding=1
>В /etc/rc.firewall прописал
>ipfw add 40 fwd <адрес кэш-сервера>,80 tcp from <адрес кэш-сервера> to any
>Не работает! ;-(
>Даже если напишу:
>ipfw add 40 fwd <адрес ftp-сервера>,21 ip from any to any и наберу
>>telnet <адрес кэш-сервера> 21, проваливаюсь на ftp на кэше!
>Причем команда ipfw show показывает, что
>правило пакеты все-таки отлавливает, но
>не перенаправляет! В чем дело
>- не пойму. Помогите плиз!!!
>
>
>И еще. Покопался в исходниках. Файлы
>/usr/src/sys/netinet/ip_fw.c и ip_output.c Там есть
>ссылки на опцию ядра IPFIREWALL_FORWARD_DEBUG,
>но такой опции ни в
>LINT, ни в /usr/src/sys/conf/options я
>не нашел. Странно все это.
>Да и некоторые комментарии в
>выше обозначенных файлах позабавили...ну во первых ftp через divert работать не будет
во вторых по моему правильной будет строка что-то типа
ipfw add 40 divert <кэш сервер порт> all from any to any 80
и еще по-моему лучше в rc.conf gateaway_enabled ="true" вместо записи в sysctl
Пусть надо форвардить например в такой ситуации:
есть 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 очень хорошо, может что-нибудь подскажет, а?
С уважением, Солнышко