Обсуждение статьи тематического каталога: Интернет шлюз на FreeBSD - часть 2 (freebsd gateway nat pf firewall squid proxy)Ссылка на текст статьи: http://www.opennet.me/base/net/freebsd_gw3.txt.html
забавно, и я тоже делал по лисяре
спасибо за еще один хороший вроде мануал
вроде все так отлично и просто и как раз то что неужно на каждый день
Я вот всё что можно из сервисов сую в chroot... почему бы тут с bind'ом это не сделать? Как ни как а хоть малюсенькая но доп защита.
В FreeBSD уже с версий 6.x Bind по умолчанию сразу в chroot стартует:freebsd:/root@[16:20]# grep "named" /etc/defaults/rc.conf
# named. It may be possible to run named in a sandbox, man security for
named_enable="NO" # Run named, the DNS server (or NO).
named_program="/usr/sbin/named" # Path to named, if you want a different one.
#named_flags="-c /etc/namedb/named.conf" # Uncomment for named not in /usr/sbin
named_pidfile="/var/run/named/pid" # Must set this in named.conf as well
named_uid="bind" # User to run named as
named_chrootdir="/var/named" # Chroot directory (or "" not to auto-chroot it)
named_chroot_autoupdate="YES" # Automatically install/update chrooted
# components of named. See /etc/rc.d/named.
named_symlink_enable="YES" # Symlink the chrooted pid fileОстальные сервисы можно запихнуть в Jail-ы (делал неоднократно, работает хорошо (VSFTPD, Samba, Squid, связка FAMP и прочие).
Потерю производительности при использовании Jail заметить очень трудно - на глаз не видно точно :)
>Остальные сервисы можно запихнуть в Jail-ы (делал неоднократно, работает хорошо (VSFTPD, Samba,
>Squid, связка FAMP и прочие).
>
>Потерю производительности при использовании Jail заметить очень трудно - на глаз не
>видно точно :)А можно попросить поподробней про jail, можно ли как-то автоматизировать создание окружения для jail'а чтобы при обновлении портов, и системы всё это не надо было руками пересобирать (различные библиотеки копировать и т.п. ) или просто как с минимумом трудозатрат это сделать?
Если не поподробней, то хоть ссылочку бы :)
Почитай как правильно алиасы делать.http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/co...
И не плохо было бы мир перестроить...
Вот это "makeoptions DEBUG=-g" зачем на "боевом" сервере? :-)
P.S. pf отлично работает и модулем, пихать его в ядро не обязательно
Люди ну хоть кто нибудь ну хоть когда нибудь , написал нормальный анализатор логов Pf,и перевода в человеческий вид? вывод tcpdump не предлагать:), а если еще и веб морда то былабы красота, в идеале нужна статистика по интерфейсам айпишникам и портам?
>Люди ну хоть кто нибудь ну хоть когда нибудь , написал нормальный
>анализатор логов Pf,и перевода в человеческий вид? вывод tcpdump не предлагать:),
>а если еще и веб морда то былабы красота, в идеале
>нужна статистика по интерфейсам айпишникам и портам?Меня вот эта штука устраивает: /usr/ports/sysutils/pflogx/
А вообще как правило нужно вот такое: tcpdump -n -e -i pflog0 'host XXX && port YYY'
Хватает за глаза.
И еще очень /usr/ports/sysutils/pftop/ пригождается - например: pftop -f "port 5190" :)
>> в идеале
>>нужна статистика по интерфейсам айпишникам и портам?Поставьте себе NetAMS - именно статистика по IP и портам :)
/usr/ports/sysutils/pflogx/ -конвертер в xml
ага этим tcpdump -n -e -i pflog0 'host XXX && port YYY' не насобираться статистику
pftop -f "port 5190" ну а это вообще онлайн отображение соединение
>/usr/ports/sysutils/pflogx/ -конвертер в xml
>ага этим tcpdump -n -e -i pflog0 'host XXX && port YYY'
>не насобираться статистику
>pftop -f "port 5190" ну а это вообще онлайн отображение соединениеОткуда вообще такие мысли - собирать статистику межсетевым экраном - это же не его задачи по дизайну...не для этого он разрабатывался и применяется.
Нужна статистика - ставьте программу, для этого предназначенную.
Мне, например, NetAMS и ng_ipacct+perl+mysql хватает за глаза.
С помощью первого инструмента можно быстро оценить объемы и характер трафика (+ понять, что и куда пошло).
С помощью второго можно вообще любые данные вытянуть (например сколько ping-ов послал Вася в понедельник с 10 до 12 и куда он их послал...).
эх поподробнее бы если можно:)
>эх поподробнее бы если можно:)А что, в Google Вас заблокировали????? :) :): )
NetAMS:
http://netams.com/index.htmlng_ipacct:
http://www.opennet.me/base/net/ng_billing_letter.txt.htmlВо второй - можно такие SQL-запросы напридумывать...закачаешься результатам.
Да и WEB-морду на PHP к этому делу написать не трудно (или Perl-скрипты).
/usr/ports/sysutils/pflogx/ -конвертер в xml
ага этим tcpdump -n -e -i pflog0 'host XXX && port YYY' не насобираться статистику
pftop -f "port 5190" ну а это вообще онлайн отображение соединение
Например http://www.allard.nu/pfw/
Заменить:
client_ports = "{ 21, 22, 25, 110, 123, 80, 443, 3128, 3129, 3389,8080, >=49151 }"На эту (лучше и понятнее):
client_ports = "{ ftp, ssh, smtp, pop3, ntp, http, https, 3128, 3129, rdp, 8080, >=49151 }"И ещё кучу правил можно упростить -- из нескольких сделать одно.
вроде как это редактор файервола , но щас поподробнее изучу
Не навязывайте новичкам PF! Потому как потом у них возникает вопрос: а как сделать так чтобы люди из этой "корпоративной" сети могли подключать наружу ВПН. Или, не дай боже, как отфильтровать пакеты по TTL при ДДОС атаке!
>Не навязывайте новичкам PF! Потому как потом у них возникает вопрос: а
>как сделать так чтобы люди из этой "корпоративной" сети могли подключать
>наружу ВПН. Или, не дай боже, как отфильтровать пакеты по TTL
>при ДДОС атаке!А что, "ассемблером" ipfw (или IPTABLES в Linux) это сделать легче? :)) Может и легче, но зачем?
Не нужно множить сущности. Нужно от них максимально абстрагироваться. Мыслить не процедурами, но декларациями.
>Не нужно множить сущности. Нужно от них максимально абстрагироваться. Мыслить не процедурами,
>но декларациями.Вы только декларациями и мыслите, при том - громкими :D.А благодаря вашему подходу есть риск через много лет однажды с удивлением узнать что "вон то", при том нужное и полезное, чего так хотелось сделать оказывается уже давно на самом деле было можно.Если немного мозг погреть.Да, айпитаблес - явно дальний родственник брэйнфака, зато умеет наверное почти все :).А если реально вломак думать - ну так есть куча гуйных морд и вебфэйсов для него, там вообще думать в стандартных базовых вещах не надо: вбил айпишники, порты и т.п. в формочку и вуаля.Зато как только потребуются хитрые навороты - тот же айпитаблес с его брэйнфакерским синтаксисом - выручит, после небольшого прогрева мозга, в отличие от многих других.
А где настройки ALTQ или зачем собрали это в ядре?
>А где настройки ALTQ или зачем собрали это в ядре?1) ALTQ модулем не подгружается.
2) Если ALTQ нет в ядре, то каждый раз при загрузке правил PF предупреждает (чувак, у тебя нет ALTQ)3) Поэтому многие при сборке ядра сразу его (ALTQ) включают (чтобы не ругался) :)
4) Правила по настройке есть в статьях Сгибнева (см тут на opennet.ru) или в man pf.conf (аналог - только на English).
Вот рабочий пример с использованием CBQ:
altq on ng0 cbq bandwidth 10Mb queue { rsync, ssh, ftp, squid, other }
queue rsync bandwidth 1Mb priority 1
queue ssh bandwidth 1Mb priority 7 cbq(borrow)
queue squid bandwidth 2Mb priority 6 cbq(borrow)
queue ftp bandwidth 2Mb priority 3 cbq(borrow)
queue other bandwidth 2Mb priority 3 cbq(default,borrow)Очереди вешаются на нужные правила (исходящего трафика: FTP, RSYNC, SSH и прочее) :)
Например:
pass in on $if_ext_local proto tcp from any to any port 60606 modulate state queue ssh
pass in on $if_ext_local proto tcp from any to any port 873 modulate state queue rsync
pass in log on $if_ext_local proto tcp from any to any port 80 modulate state queue other
pass in on $if_ext_local proto tcp from any to any port {21 20000><21000} modulate state queue ftp
pass in on $if_ext_local proto tcp from any to any port 63128 modulate state queue squid
>[оверквотинг удален]
>
>1) ALTQ модулем не подгружается.
>2) Если ALTQ нет в ядре, то каждый раз при загрузке правил
>PF предупреждает (чувак, у тебя нет ALTQ)
>
>3) Поэтому многие при сборке ядра сразу его (ALTQ) включают (чтобы не
>ругался) :)
>
>4) Правила по настройке есть в статьях Сгибнева (см тут на opennet.ru)
>или в man pf.conf (аналог - только на English).Да, но пересобирать ядро с ALTQ ради того "чтобы не ругалось" как бы смешно.
Очереди обслуживания в статье не используются.
>Да, но пересобирать ядро с ALTQ ради того "чтобы не ругалось" как бы смешно.
>Очереди обслуживания в статье не используются.Ну кому-то смешно, а кто-то может просто смотреть в будущее и думать, что такой функционал он через некоторое время будет использовать...
Особенно смешно будет тем, кому этот функционал понадобится внезапно (а ядро будет не подготовлено) и сервер перезагружать в рабочее время начальство не дает :)
>>Да, но пересобирать ядро с ALTQ ради того "чтобы не ругалось" как бы смешно.
>>Очереди обслуживания в статье не используются.
>
>Ну кому-то смешно, а кто-то может просто смотреть в будущее и думать,
>что такой функционал он через некоторое время будет использовать...
>
>Особенно смешно будет тем, кому этот функционал понадобится внезапно (а ядро будет
>не подготовлено) и сервер перезагружать в рабочее время начальство не дает
>:)Вы неправы.
Если в статье не предлагаются решения по шейпингу трафика, то не нужно о нём даже говорить и чего-то куда-то вкомпилировать по принципу "а вдруг понадобится...".
Профессионализм отличается от делитантизма тем, что профессионал учитывает всё, но убирает всё лишнее и ненужное.В данном случае, интернет-шлюз, описанный в статье, можно создать БЕЗ перекомпиляции ядра, подгружая PF модулем. А это сразу же снимает вопросы по обновлению исходников системы и времени компиляции.
>>>можно создать БЕЗ перекомпиляции ядраА что - Автор написал, что собирать ядро обязательно и без этого работать не будет?
Мы тут свободные системы и программы обсуждаем - кто как хочет, так и делает...и даже работать будет :)
Хотите - подгружайте модулем (я, например, так и использую - ни разу в жизни PF в ядро не вкомпиливал), хотите - компилируйте ядро...
Я же не виноват, что каждый второй написатель статей вставляет в свои творения описания, как ядро пересобирать...
>>>Если в статье не предлагаются решения по шейпингу трафика,
>>>то не нужно о нём даже говоритьВы взяли на себя роль цензора? Как вы можете Автору указывать, что он может, а что нет...это его творчество и его право...
>А где настройки ALTQ или зачем собрали это в ядре?Очереди не прикручивал. Ядро собрал с запасом на будущее, плюс чтобы алерт глаза не мозолил.
Все таки есть предложение!
Ребят подскажите прав ли яЕсли он пишет правила rdr, то он подразумеваеь, что
все машины в сети, на которые идет проброс портов имеют в качестве шлюза по умолчанию именно этот корпоративный свеже настроенный free7.1+pf серверИначе не должны работать пробросы, нужно будет делать что то типа этого
nat on $int_if proto tcp from any to $ironws port 3389 -> $int_if
прав ли я ?
>[оверквотинг удален]
>Если он пишет правила rdr, то он подразумеваеь, что
>все машины в сети, на которые идет проброс портов имеют в качестве
>шлюза по умолчанию именно этот корпоративный свеже настроенный free7.1+pf сервер
>
>Иначе не должны работать пробросы, нужно будет делать что то типа
>этого
>
>nat on $int_if proto tcp from any to $ironws port 3389 -> $int_if
>
>прав ли я ?Прав.
>Если он пишет правила rdr, то он подразумеваеь, что
>все машины в сети, на которые идет проброс портов имеют в качестве
>шлюза по умолчанию именно этот корпоративный свеже настроенный free7.1+pf сервер
>Иначе не должны работать пробросыЭто должно быть очевидно каждому, кто такие вещи настраивает (иначе учите мат-часть)...
И все таки to> уважаемый авторПожалуйста не для меня, я лично уже уяснил а для тех, кто еще не успел
Сделайте ремейк - допишите в начале статьи или перед настройкой pf об основном шлюзе иначе будут и будут продолжаться вопросы в форумах. Причем сделайте это пожирнее - плиз .
>И все таки to> уважаемый автор
>Пожалуйста не для меня, я лично уже уяснил а для тех, кто
>еще не успел
>Сделайте ремейк - допишите в начале статьи или перед настройкой pf об
>основном шлюзе иначе будут и будут продолжаться вопросы в форумах. Причем
>сделайте это пожирнее - плиз ."Задача: организовать шлюз, раздающий корпоративной сети Интернет
сервисы, пробросить необходимые порты на внутренние серверы с учетом
использования диапазона внешних ip адресов."
Имхо такая формулировка более предполагает использование в сети одного шлюза, нежели нескольких. Есть конечно некоторая степень неоднозначности, но она мала. ;)
(иначе учите мат-часть)...сколько я порезал, сколько перерезал мануалов ну ни где явного упоминания об основном шлюзе не видел, поэтому будьте любезны объясните:
под "учите мать часть" вы понимаете
1. общую образованность и опыт
2. какую-то определенную статью или мануал?
>под "учите мать часть" вы понимаетеПо этой фразой я понимаю:
1) Знание модели OSI (всех 7 уровней)
2) Изучение протокола IPv4 (в ходе его изучения информация о шлюзе по умолчанию ну просто обязана зашиться в подкорку головного мозга...)
>сколько я порезал, сколько перерезал мануаловВначале читать нужно не мануалы и статьи типа этой - а учебники по сетям, протоколам и т.д.
PS: В любом деле логично сначала освоить теорию и потом идти на практику...
в named.conf можно добавить кментарий для forwarders { };
И если есть желание можно упомянуть утилиту pftop.
>в named.conf можно добавить кментарий для forwarders { };Согласен, поправил.
Не проще ли заменить bind на dnsmasq?
Он способен запускаться без собственных настроек,
только с /etc/hosts и /etc/resolv.conf
Использую его везде, где не требуется пересылка зон.
>Не проще ли заменить bind на dnsmasq?
>Он способен запускаться без собственных настроек,
>только с /etc/hosts и /etc/resolv.conf
>Использую его везде, где не требуется пересылка зон.Ну тогда напишите нам об этом ;)
device pfsync - НЕ НУЖЕН.
Это для горячего резервирования на несколких машинах. Те когда основной маршрутизатор загибается, брат близнец подхватывает и продолжает, соединения даже не рвутся, ибо таблица состояний продублированна через pfsync.В ряде случаев хватит и dnsmasq, заодно он DHCP раздаст.
Регэкспы сквида, где мультимедия фильтр, мне кажется можно было записать в одну-две строчки.
Кроме того не обязательно забивать два порта 3128 и 3129 чтобы получить прозрачный и обычный прокси.
Достаточно сделать так:
http_port 127.0.0.1:8080 transparent
http_port 8080
Естественно заворачивать прозрачно 80 порт на 127.0.0.1С PF вообще выглядит всё ужасно :)
Макрос private_nets заменить на таблицу и выкинуть от туда мультикаст подсетку:
table <private_nets> const { 10.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16, 255.255.255.255/32 }
Ещё рекомендуется: set skip on lo0, с антиспуфа можете выкинуть его после этого.
Не у всех IP статический, да ещё и пул, поэтому правильнее писать:
nat on $ext_if0 inet from !($ext_if0) to any -> ($ext_if0) # Nat to internet
Ещё лучше в pass конструкции добавить quick, один фиг это переписка с ipfw правил, и работает линейно.
Ещё bsd = "192.168.0.1/32" - фигово.
table <int_if0_addr> persist const { $int_if0 } ## Address on int_if0 - шикарно :)
ещё есть макросы: self - все адреса на машине, self:network - все подсети машины, если некоторые адреса динамические то нужно брать в скобки, пример: (self)synproxy state - вы с ума сошли!!!!!
Эта штука потребляет в два раза больше ресурсов, чем modulate state, да ещё иногда создаёт грабли, когда непонятно почему соединение не устанавливается или данные не идут.
synproxy state должна использоватся только в правилах публикации внутренних сервисов наружу, и то не всегда. Локалку в инет - модулейтом. От локал хоста и к локал хосту - вообще keep state можно ставить.># Разрешаем нашему шлюзу полный выход с обоих интерфейсов
> pass out on $ext_if proto tcp from any to any
> pass out on $ext_if proto udp from any to any keep state
> pass out on $int_if proto tcp from any to any
> pass out on $int_if proto udp from any to any keep stateТоже ужасно.
pass out from (self) to any flags S/SA modulate state # allow out self to anywere - красота.
>synproxy state должна использоватся только в правилах публикации внутренних сервисов наружусобственно так и сделано
>От локал хоста и к локал хосту - вообще keep state можно ставитьВ этой версии PF keep state подразумевается даже там, где он не прописан
По всему остальному - конструктивно, спасибо.
>># Разрешаем нашему шлюзу полный выход с обоих интерфейсов
>> pass out on $ext_if proto tcp from any to any
>> pass out on $ext_if proto udp from any to any keep state
>> pass out on $int_if proto tcp from any to any
>> pass out on $int_if proto udp from any to any keep state
>
>Тоже ужасно.
>pass out from (self) to any flags S/SA modulate state # allow
>out self to anywere - красота.% pfctl -nf /etc/pf.conf
/etc/pf.conf:XY: syntax errorЛучше так:
pass out all
>>pass out from (self) to any flags S/SA modulate state # allow
>>out self to anywere - красота.
>
>% pfctl -nf /etc/pf.conf
>/etc/pf.conf:XY: syntax error
>
>Лучше так:
>pass out all"pass out quick from (self) to any modulate state"
Без кавычек, фряха 7 и выше (ниже не тестил).
В других версиях бсд список поддерживаемых возможностей для пф может отличатся.
В DragonFlyBSD пф не полный, относительно фряхи.В вашем случае траффик вышел, но записи в таблице состояний не создалось и как он будет возвращатся зависит от погоды и правил остальных.
Более того, с точки зрения скорости вы теряете, ибо пф ответные пакеты всё равно проверяет по таблице состояний, и только после этого пф лезет в правила.
>[оверквотинг удален]
>>>out self to anywere - красота.
>>
>>% pfctl -nf /etc/pf.conf
>>/etc/pf.conf:XY: syntax error
>>
>>Лучше так:
>>pass out all
>
>"pass out quick from (self) to any modulate state"
>Без кавычек, фряха 7 и выше (ниже не тестил).У меня -- ошибка и на этой строчке:
pass out quick from (self) to any modulate state% uname -rsm
FreeBSD 7.2-STABLE amd64>В вашем случае траффик вышел, но записи в таблице состояний не создалось
>и как он будет возвращатся зависит от погоды и правил остальных.man pf.conf
По умолчанию PF использует "flags S/SA" и "keep state" ВЕЗДЕ, если не указано иное.В выводе команды pfctl -s all правило "pass out all" у меня разворачивается в "pass out all flags S/SA keep state".
>Более того, с точки зрения скорости вы теряете, ибо пф ответные пакеты
>всё равно проверяет по таблице состояний, и только после этого пф
>лезет в правила.Я в курсе.
В роли шлюза - вирт. машина:
FreeBSD 7.2 +
Памяти 1 гб
2 сетевые по 1 гб\сек в бридже
2 проц. по 2.4 ггцСкорость передачи данных через нат не превышает 10 магабайт в секунду.
Статистика при передаче:
процессор 30.21% natd (пиковая цифра)
свободно памяти больше половины
snmp показывает что на сетевых интерфейсах скорость не больше 10 мегабайт в секундуГде узкое место? Как добиться увеличения скорости?
>В роли шлюза - вирт. машина:Вот в этом походу и проблема. Что за виртуалка? или это гипервизор?
Это имеет значение.
>[оверквотинг удален]
>
>Скорость передачи данных через нат не превышает 10 магабайт в секунду.
>
>Статистика при передаче:
>процессор 30.21% natd (пиковая цифра)
>свободно памяти больше половины
>snmp показывает что на сетевых интерфейсах скорость не больше 10 мегабайт в
>секунду
>
>Где узкое место? Как добиться увеличения скорости?
> Вот в этом походу и проблема. Что за виртуалка? или
>это гипервизор?
>
> Это имеет значение.
>Гипервизор - VMWare ESXi 4 (на Sun Fire X6250)
Виртуалка - FreeBSD 7.2 (2Gb RAM, 2xGLAN, 2x2.33 E5410 Intel Xeon)
Доброго времени, сделал по мануалу, все заработало. Только, пожалуй, слишком. Такое чувство что в работе вообще сквид не участвует: комментил его порты, перезапускал, интернет все равно пашет.
А хочу всего лишь написать правило, которое будет разрешать определенным пользователям доступ в интернет.
Помогите пожалуйста разобраться. Если можно, то подсткажите как сделать еще авторизацию по логину и пароль