Здравствуйте,помогите разобраться с ipfw и nat.
Есть скрипт ipfw:
#!/bin/sh
ipfw="/sbin/ipfw"
local_net="172.25.37.0/24"
local_interface="rl0"
inter_net="192.168.101.0/24"
inter_interface="vr0"
${ipfw} nat 1 config log if ${inter_interface} reset same_ports deny_in# Прозрачный сквид==============================================================================
# Заворот в сквид
${ipfw} add fwd 127.0.0.1,3128 tcp from ${local_net} not dst-port 465,993,143,110,25,995 to any out via ${inter_interface}# Разрешаем сквиду ходить в интернет
${ipfw} add allow tcp from me to any out via ${inter_interface} uid squid # keep-state uid squid
${ipfw} add allow tcp from any to me via ${inter_interface} established # keep-state uid squid
#=======================================================================================${ipfw} add nat 1 ip from any to any via ${inter_interface}
# Тут разрешаем то, что можно===========================================================
#https
${ipfw} add allow all from any to any 443
#почта
${ipfw} add allow all from ${local_net} to any 465
${ipfw} add allow all from any 465 to ${local_net} established${ipfw} add allow all from ${local_net} to any 993
${ipfw} add allow all from any 993 to ${local_net} established${ipfw} add allow all from ${local_net} to any 143
${ipfw} add allow all from any 143 to ${local_net} established${ipfw} add allow all from ${local_net} to any 110
${ipfw} add allow all from any 110 to ${local_net} established${ipfw} add allow all from ${local_net} to any 25
${ipfw} add allow all from any 25 to ${local_net} established${ipfw} add allow all from ${local_net} to any 995
${ipfw} add allow all from any 995 to ${local_net} established
#======================================================================================
# Разрешаем локалхост
${ipfw} add allow all from any to any via lo0
# Разрешаем внутренний интерфейс
${ipfw} add allow all from ${local_net} to me via ${local_interface}
# Разрешаем DNS
${ipfw} add allow udp from any 53 to any
${ipfw} add allow udp from any to any dst-port 53${ipfw} add allow all from any to any
Если убрать форвард на сквид, то почта начинает работать, я добавил в форвард not для портов почты, но результата нет.
Как правильно будет разрешить доступ к этим портам?И еще вопрос, ipfw пока открыт, последним правилом, как корректно будет разрешить ходить в интернет только сквиду, а не всем?
P.S
FreeBsd 8.3, nat в ядре, форвардинг включен в ядре.
Почта дает ошибку (The Bat) - !31.08.2012, 09:00:24: IMAP - Ошибка протокола TLS: Не ожидаемый пакет (ошибка протокола?) SessionUnknownContentType ct (72).
> # Заворот в сквид
> ${ipfw} add fwd 127.0.0.1,3128 tcp from ${local_net} not dst-port 65,993,143,110,25,995 to any out via ${inter_interface}Зачем всё-то заворачивать?
Этим правилом вы весь трафик завернули на сквид, кроме портов 65,993,143,110,25,995
а вам нужно только http
Если уж так хочется использовать в правиле конструкцию с not
то попробуйте так
${ipfw} add fwd 127.0.0.1,3128 tcp from ${local_net} to not me 80,443 in recv ${local_interface}ну а "классический" заворот выглядит так
fwd 127.0.0.1,3128 tcp from ${local_net} to any 80
>[оверквотинг удален]
>> ${ipfw} add fwd 127.0.0.1,3128 tcp from ${local_net} not dst-port 65,993,143,110,25,995 to any out via ${inter_interface}
> Зачем всё-то заворачивать?
> Этим правилом вы весь трафик завернули на сквид, кроме портов 65,993,143,110,25,995
> а вам нужно только http
> Если уж так хочется использовать в правиле конструкцию с not
> то попробуйте так
> ${ipfw} add fwd 127.0.0.1,3128 tcp from ${local_net} to not me 80,443 in
> recv ${local_interface}
> ну а "классический" заворот выглядит так
> fwd 127.0.0.1,3128 tcp from ${local_net} to any 80Спасибо за ваш ответ, обязательно попробую.
Возникла еще одна проблема, для подключения к провайдеру использую ppp (pppoe), в нем есть свой нат, поэтому после установки соединения интернета нет, пока не отключу в правилах ipfw ядерный нат, пробовал в конфиге ppp сделать enable_nat=no, не помогло.
При удалении ната из правил ipfw интернет работает, но перестает работать форвард на сквид (там кстати в правиле ошибку допустил, dst-port не нужно указывать) в правило форвардинга не забегает ни одного пакета.Получается два вопроса, почему форвардинг не срабатывает, и как отключить нат в ppp?
> При удалении ната из правил ipfw интернет работает, но перестает работать форвард
> на сквид (там кстати в правиле ошибку допустил, dst-port не нужно
> указывать) в правило форвардинга не забегает ни одного пакета.forward не должен зависеть от nat
выполнить ipfw (-de) show до и после поднятия pppoe и сравнить вывод> Получается два вопроса, почему форвардинг не срабатывает, и как отключить нат в ppp?
использовать для поднятия pppoe mpd и up / down скрипты в его конфиге ?
>> При удалении ната из правил ipfw интернет работает, но перестает работать форвард
>> на сквид (там кстати в правиле ошибку допустил, dst-port не нужно
>> указывать) в правило форвардинга не забегает ни одного пакета.
> forward не должен зависеть от nat
> выполнить ipfw (-de) show до и после поднятия pppoe и сравнить вывод
>> Получается два вопроса, почему форвардинг не срабатывает, и как отключить нат в ppp?
> использовать для поднятия pppoe mpd и up / down скрипты в его
> конфиге ?Спасибо вам Михалыч за подсказки, в понедельник попробую.
И да, давно спросить хотел, опция в правилах keep-state работает без проблем?
Я имею ввиду, что она создает правила для каждого соединения, и если их много проблем не будет?
>[оверквотинг удален]
>>> указывать) в правило форвардинга не забегает ни одного пакета.
>> forward не должен зависеть от nat
>> выполнить ipfw (-de) show до и после поднятия pppoe и сравнить вывод
>>> Получается два вопроса, почему форвардинг не срабатывает, и как отключить нат в ppp?
>> использовать для поднятия pppoe mpd и up / down скрипты в его
>> конфиге ?
> Спасибо вам Михалыч за подсказки, в понедельник попробую.
> И да, давно спросить хотел, опция в правилах keep-state работает без проблем?
> Я имею ввиду, что она создает правила для каждого соединения, и если
> их много проблем не будет?Вообще keep-state в ipfw доволно примитивен. В sysctl можно ограничить кол-во созданых стейтов (точнее правил). Дефаулт - 8192.
Я бы вам не рекомендовал на нагруженом сервере использовать keep-state.
В результате получилось такое:#!/bin/sh
ipfw="/sbin/ipfw"
local_net="172.25.37.0/24"
local_interface="rl0"
inter_net="192.168.1.0/24"
inter_interface="vr0"
#lo0
${ipfw} add allow all from any to any via lo0#Локальной сети можно
${ipfw} add allow ip from any to any via ${local_interface}#Нат
${ipfw} nat 1 config log if ${inter_interface} reset same_ports deny_in#Transparent squid forward
${ipfw} add fwd 172.25.37.1,3128 tcp from ${local_net} to any 80 via ${inter_interface}#заварачиваем в нат
${ipfw} add nat 1 ip from any to any via ${inter_interface}Так работает, ограничение хождения в интернет на уровне прокси.
Есть еще вопросик, как разрешить именно сквиду ходить в интернет, пробовал
${ipfw} add nat 1 all from ${local_net} to any uid squid keep-state
и так
${ipfw} add all from ${local_net} to any uid squid keep-state
и так
${ipfw} add all from me 3128 to any keep-stateне работают правила, в них пакеты не попадают (keep-state для простоты, потом поменял-бы).
1Help 2Save 3Mark 4Replac 5Copy 6Move 7Search 8Delete 9PullDn 10Quit