>>Кстати я бы ещё проверил ещё раз маску твоей подсети, маска 28
>>- это вообще говоря 16 адресов, убедись что у тебя туда
>>попадают все кто нужен.
>
>По поводу rc.conf ответ утвердительный :),
>natd_program="/sbin/natd"
>natd_enable="YES"
>natd_interface="vlanX"
>
>маска /28, это не бага, это скорее фича :), так и нужно
>что бы определенная подсеть могла ходить без прокси, причем всеми портами
>наружу...
>По поводу
>$cmd add divert natd all from Х.Х.Х.Х/28 to any via $oif
>$cmd add divert natd all from Х1.Х1.Х1.Х1/24 to any via $oif
>$cmd add divert natd all from any to me via $oif
>Мне кажется не хватает возврата пакетов назад ...
>Типа
>$cmd divert natd all from any to any IN via $oif
За такое правило можно поплатиться тем что кто-то снаружи за твой счёт начнёт инетом пользоваться, да и вообще о каких обратных пакетах идёт речь?
Ввот весь путь пакета :
1. Попал на внутренний интерфейс прошёл проверку по ipfw сработал на правиле
$cmd add divert natd all from Х.Х.Х.Х/28 to any via $oif был направлен в программу natd
2. Программа natd изменила его обратный адрес на внешний адрес твоей машины и отдала таблице маршрутизации по этой таблице данный пакет необходимо кинуть на твой шлюз, поэтому система кидает его на шлюз, но перед этим опять кидает на ipfw так как такой пакет система ещё не обрабатывала (ведь пакет был изменён, адрес же у него сменился)
3. Сработало правило ipfw
$cmd add pass all from me to any via $oif
4. Пакет отправлен на твой шлюзПолучение этого же паета:
1. Получен пакет на внешний интерфейс с адресом назначения твой внешний адрес, пакет пропускается через ipfw и срабатывает на правиле $cmd add divert natd all from any to me via $oif перенаправлен в программу natd
2. Программа natd разначивает пакет и видит что он тунельный и просто вытаскивает внутренний адрес назначения пакета , меняет адрес назначения со своего внешнего на локальный адрес отправителя, затем кидает на таблицу маршрутизации
3. Система смотрит по таблице маршрутизации что такие пакеты нужно направлять в локалку по МАК но перед этим опять кидает его на ipfw, так как это уже новый пакет ведь его сгенерила natd то его нужно сново проверить.
4. Проверяется по правилам ipfw и срабатывает на правиле
$cmd add pass all from any to any via $iif
где $iif - внутренний интерфейс
Вот и всё, и никакого $cmd add divert natd all from any to me via $oif здесь и близко не нужно! Даже наоборот, опасно такое делать!
Более подробно написал здесь
http://www.opennet.me/openforum/vsluhforumID1/70184.html#4
>По поводу разрешающих и запрещающих правил ....
>По подробнее если можна ... то есть если я до ната сделаю
>
>deny log logamount 100 ip from any to any
>то пакеты все равно будут попадать на natd ???
>$cmd add allow any from any
>у меня и так по умолчанию, поскольку
>firewall_type="OPEN"
Если ты напишешь правило после диверта
deny log logamount 10000 ip from any to any
то у тебя сначало сработает диверт и часть пакетов будет обработана natd, а потом только сработает твой запрет. Что это означает? А означает что твою систему можно бомбить заставляя проц грузиться, а если в natd есть какая-то уязвимость по поводу переполнения то можно ею и пользоваться, вот что это означает. И толку от такого правила написанного в конце всех правил очень мало :).
Если же ты такое правило напишешь в самом начале, то оно всё запретит вообще, даже нат, вообще ничего никуда ходить не будет, все пакеты будут убиваться сразу же без каких-то задержек и нагрузка на проц будет меньше, да и эффективность защиты выше.
Поэтому все правила запрета лучше писать до того как они могут сработать на natd. Это касается запретов в первую очередь для своих же пользователей, елси ты например хочешь кому-то отрезать сеть, то написав правило типа
deny log logamount 1000 ip from кто-то to any
после ната, ты ему ничего не закроешь, а если напишешь это же правило до ната то будешь убивать всё что от него придёт ещё до того как это будет перенаправлено на natd. Чувствуешь разницу?
А вообще вот тебе мой список правил котрые я использую между прочем тоже на FreeBSD 5.4
#Разрешаем лупбек (хотя это правило можно писать где угодно, главное до денаев)
${ipfw} add 30 pass all from any to any via lo0
#Закрываем доступ всех локальных адресов поступающих на внешний интерфейс
${ipfw} add 200 deny log ip from 192.168.0.0/16 to any in via ${ifout}
${ipfw} add 210 deny log ip from 176.16.0.0/12 to any in via ${ifout}
${ipfw} add 220 deny log ip from 10.0.0.0/8 to any in via ${ifout}
#Запрещаем интеренет тем кто не заплатил
${ipfw} add 301 deny log ip from 192.168.12.12 to any in via ${ifuser}
${ipfw} add 302 deny log ip from 192.168.12.15 to any in via ${ifuser}
${ipfw} add 303 deny log ip from 192.168.12.35 to any in via ${ifuser}
${ipfw} add 304 deny log ip from 192.168.12.102 to any in via ${ifuser}
#Два правила ната, один от локалки во внешний мир второй от внешнего мира к локалке
${ipfw} add 510 divert natd all from ${ournet} to any via ${ifout}
${ipfw} add 520 divert natd all from any to ${IPout} via ${ifout}
#Разрешаем прохождение пакетов участвующих в соединение tcp
${ipfw} add 600 pass tcp from any to any established
#Разрешаем себе всё на выход через внешней интерфейс
${ipfw} add 620 pass ip from me to any out xmit ${ifout}
#разрешаем пакеты идущие к локалке
${ipfw} add 710 pass all from any to ${ournet}
#разрешаем всё что ходит по внутреннему интерфейсу
${ipfw} add 1000 pass all from any to any via ${ifuser}
#разрешаем доступ по ssh
${ipfw} add 3000 pass ip from any to me 22 via ${ifout} in
#Запрещаем всё что не попало ни под одно из правил с записью в лог
${ipfw} add 10000 deny log ip from any to any
Вот что я имел ввиду когда говорил почему надо писать правила запрета до ната и вообще первыми. Чтоб по ошибке ненужные пакеты не попадали в систему.
Кстати я так и не понял, у тебя попрежнему система пишет в логах divert_packet: no divert tag ? Вообще-то должно означать что не указан интерфейс natd . Может ты всё же ошибся при задании интерфейса? Проверь ещё раз что пишет ifconfig? убедись что там есть тот интерфейс котрый ты подсовываешь нату. А лучше всего в rc.conf проверить что указан именно внешний интерфейс как интерфейс для ната.