С фрёй общаюсь недавно, если точнее - 4й день, до этого сколько нибудь значимого опыта с юниксами не имел. (не пинайте, типа, сильно)
Поставило начальство задачу заменить устаревшую и вечно грохающуюся Ideco ICS, старший админ, по совместительству мой учитэл недавно ушел, остался я один, маленький и неподготовленный к большой жизни =(. Начальство ессно никаких денег не дает, делай говорят как хочешь, не умеешь - научись и живо...
В общем и целом задача - поднять шлюз в интернет на 30+ пользователей, не офисная сеть (то есть мне достаточно фиолетово куда лазают мои юзеры), но было бы неплохо прикрутить в последствии какую нить трафикогляделку, дабы писать кто, куда, когда и т.п. но и не об этом нынче речь. Биллинг сейчас не важен вообще.
Что сделано:
Прочитано около 100500 статей около 100500 раз (включая хэндбук). Вроде уяснил для себя что прокся мне тут не нужна, сначала поднял в связке с natd, потом выяснил что при нагрузке больше 50 МБит оно не актуально, освоил кернел нат, две ночи промучался с IPFW, в конце концов осознал общий порядок движения правил в фаере. Кое как освоил DUMMY.
В последнюю ночь на листике составил СВОЙ_ПЕРВЫЙ_ФАЕР, и затем перенес его в скрипт, но присмотревшись, понял что не фаер получился а дуршлаг.
Прежде чем выложу скрипт, собсно попробую объяснить что я от него вообще хочу...
1. Доступ к серверу извне только по разрешенным портам, остальное резать.
2. Проброс некоторых портов одного реальника на некоторые порты некоторых локальных адресов.
3. Обрезка скорости юзерам как на входе так и на выходе.
4. Стабильность работы (вроде как аксиома, но все же

Добавлю что в sysctl выставлено one_pass=0
Собственно СКРИПТ (я почти уверен что он ошибочен, но это мой первый фаер... разъяснения ниже.)
Пожалуйста потратьте немного времени на чтение скрипта, здесь вроде никаких выпендрежнетств нет, должно быть просто и понятно.#! /bin/sh
###############_PEREMENNIE_################
cmd="/sbin/ipfw"
LanOut="re0"
#IPOut="192.168.84.103"
#IPIn="192.168.85.101"
LanIn="rl0"
##############_SBROS_######################
${cmd} -f flush
${cmd} -f pipe flush
${cmd} -f queue flush
##########_VNUTRI_MOJNO_###################
${cmd} add 1000 allow ip from any to any via ${LanIn}
#############_BOIMS9I_#####################
${cmd} add 1100 deny ip from any to 127.0.0.0/8
${cmd} add 1110 deny ip from 127.0.0.0/8 to any
#${cmd} add 1120 deny ip from any to 192.168.0.0/16 in recv ${LanOut}
#${cmd} add 1130 deny ip from 192.168.0.0/16 to any in recv ${LanOut}
${cmd} add 1140 deny ip from any to 172.16.0.0/12 in recv ${LanOut}
${cmd} add 1150 deny ip from 172.16.0.0/12 to any in recv ${LanOut}
${cmd} add 1160 deny ip from any to 10.0.0.0/8 in recv ${LanOut}
${cmd} add 1170 deny ip from 10.0.0.0/8 to any in recv ${LanOut}
${cmd} add 1180 deny ip from any to 169.254.0.0/16 in recv ${LanOut}
${cmd} add 1190 deny ip from 169.254.0.0/16 to any in recv ${LanOut}
##############_LOOPBACK_###################
${cmd} add 1300 allow ip from any to any via lo0
##########_USER_TABLES_####################
${cmd} table 1 add 192.168.85.103/32
${cmd} table 2 add 192.168.85.104/32
${cmd} table 3 add 192.168.85.105/32
##############_CONFIG_PIPES_###############
###############_3Mbit/s_###################
${cmd} pipe 1 config bw 3Mbit/s mask src-ip 0x00000000
${cmd} pipe 11 config bw 3Mbit/s mask dst-ip 0x00000000
###############_8Mbit/s_###################
${cmd} pipe 2 config bw 5Mbit/s mask src-ip 0x00000000
${cmd} pipe 22 config bw 5Mbit/s mask dst-ip 0x00000000
###############_512Kbit/s_#################
${cmd} pipe 3 config bw 512Kbit/s mask src-ip 0x00000000
${cmd} pipe 33 config bw 512Kbit/s mask dst-ip 0x00000000
###############_KERN_NAT_CONFIG_###########
${cmd} nat 1 config log if ${LanOut} reset same_ports deny_in /
redirect_port tcp 192.168.85.103:3333 3333
#################_SSH_#####################
${cmd} add 2000 allow from any to ${IPOut}:22 via ${LanOut}
############_PIPES_OUT_####################
${cmd} add 3000 pipe 1 ip from table\(1\) to any out xmit ${LanOut}
${cmd} add 3010 pipe 2 ip from table\(2\) to any out xmit ${LanOut}
${cmd} add 3020 pipe 3 ip from table\(3\) to any out xmit ${LanOut}
###############_NAT_#######################
${cmd} add 4000 nat 1 ip from any to any via ${LanOut}
###########_PIPES_IN_######################
${cmd} add 5000 pipe 11 ip from any to table\(1\) in recv ${LanOut}
${cmd} add 5010 pipe 22 ip from any to table\(2\) in recv ${LanOut}
${cmd} add 5020 pipe 33 ip from any to table\(3\) in recv ${LanOut}
###########_EXIT_IZ_FAERA##################
${cmd} add 6000 allow from any to any
Вопрос в общем то такой - я приведу свою логику движения в этом фаере, а Вы, пожалуйста скажите, прав я или нет, ибо если прав я дальше буду продолжать уже по аналогии smile
Итак.
Трафик исходящий от юзера будет влетать в фаер c IN, долетать до правила 1000 и вылетать из фаера, так как внутри сети все можно. Ему будет присвоено OUT и он снова влетит в фаер, пролетит до соответствующей ему пайпы (правила 3000-3990), уйдет в DUMMY, обрежется до установленной скорости, вернется в фаер, влетит в НАТ, где создастца запись о маскиррвании и присвоится внешний ИП, затем так как установлено one_pass=0 влетит опять в фаер, после чего вылетит в интернет по правилу 6000.
Трафик возвращающийся к юзеру будет влетать в фаер с IN до правила 4000 (НАТ), где разнатитса, вернется в фаер, обрежется соответствующей ему пайпой, выйдет из фаера, получит OUT, влетит в фаер и сразу же на правиле 1000 вылетит к юзеру.
Трафик для которого указан в НАТЕ редирект портов будет вести себя аналогично трафику, который возвращается к юзеру, за тем лишь изменением что НАТитца он будет исходя из предустановленной записи в НАТе о редиректе.
Весь левый трафик извне будет долетать до НАТа и им отвергаться, так как стоит опция deny_in.
Трафик инициализированный извне на ИП сервера на порт 22 будет с IN долетать до правила 2000 (SSH), вылетать из фаера, долетать с OUT до правила 1000 и вылетать из фаера.
Благодаря маске 0x00000000 должна создаваться отдельная пайпа для каждого юзера. (так ли это и насколько это вообще правильное исполнение?)
Как то вот так у меня получилось. Повторю вопросы:
1. Правильна ли моя логика?
2. Соответствует ли мой скрипт моей логике или я где то накосячил и не заметил?
3. Разумно ли я добавил пайпы, или лучше будет делать как то иначе?
4. Видел у некоторых людей пайпы на влет и на вылет идут блоком, видимо нат где то выше или ниже... КАК тогда режеться входящий или исходящий трафик у них?
5. Что еще стоило бы добавить в правила фаера исходя из моей ситуации?
Спасибо тому человеку который осилил стокамногабукаф (что и куда выслать - в личку smile)