Страница 1 из 5
Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-08-24 8:53:58
Grishun_U_S
Добрый день!
Возникли некоторые проблемы с altq.
Что имеем :
шлюз (внутренний ифейс 192.168.0.133, внешний 10.1.1.1)
за шлюзом комп с адресом 192.168.0.15
Правила очередей такие :
Код: Выделить всё
altq on $ext_if_cheap cbq queue { clients, local }
queue clients bandwidth 95% priority 5
queue local bandwidth 5% priority 1 cbq(default borrow)
##--everithing LOCAL
pass out on $ext_if_cheap from $ext_if_cheap to any keep state queue local
##--everithing LOCAL
##--everithing for 192.168.0.0/24 LAN
pass out on $ext_if_cheap from $trusted_lan to any keep state queue clients
##--everithing for 192.168.0.0/24 LAN
На самом шлюзе (на нем поднят НАТ) крутятся торент-качалка и иногда wget.
Проблема в том, что очереди ведут себя неадекватно, отдавая лишь половину полосы клиенту 192.168.0.15 (и то не сразу, а через неск. минут) когда тот активно качает и не давая вообще ничего, если на самом шлюзе качает wget. Даже аська не может приконнектиться.
Пробовал priq, все примерно то же самое.
Потом я поднял тестовый стенд 192.168.0.25 с полосой в 1 Мбит и стал скачивать с него клиентами 192.168.0.15 и 192.168.0.133 каждый раз меняя процентное соотношение полосы этих клиентов и пробуя разные очереди (cbq, priq и даже hfsc), пробуя добавлять один borrow или borrow на каждую очередь. Почти во всех случаях altq ведет себя адекватно, время реакции не более 2 секунд, немного начинает подглючивать когда в правилах более одного borrow.
Выходит что какую-то роль играет то обстоятельство, что трафик, идущий с самого шлюза непосредственно получает преимущество. Не NAT-ли всему виной?
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-08-24 19:14:48
Grishun_U_S
Я к тому что писать что-то в статью не разобравшись до конца как это работает не есть гут..... хотя видимо придется....
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-09-12 7:03:31
Grishun_U_S
а... все.. разобрался.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-09-12 12:19:18
Covax
Тихо сам с собою я веду беседу.....
Поделись с народом.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-09-12 12:40:40
Grishun_U_S
Covax писал(а):Тихо сам с собою я веду беседу.....
Поделись с народом.
Да, типа того...
Все таки статью я со временем надеюсь дописать.
Вобщем основная фишка в том, что нельзя давать очередям 100% ширины канала. Можно дать где-то 98% (max) иначе очереди не будут работать корректно. Пока все.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-09-12 15:05:49
Covax
Другие источники советуют делать на 3-5% меньше.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-09-30 16:41:55
m0ps
Covax писал(а):Другие источники советуют делать на 3-5% меньше.
если канал синхронный, а если нет, то надо процентов на 10 меньше
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-23 20:19:25
Grishun_U_S
Работаю сейчас над связкой pf+transparent proxy. Народ,
ОГРОМНАЯ просьба проверить следующие правила rdr :
Код: Выделить всё
#1
rdr on $int_if proto { tcp, udp } from $int_if:network to any port www -> $int_if port 8080
pass all
Код: Выделить всё
#2
rdr on $int_if proto { tcp, udp } from $int_if:network to any port www -> 127.0.0.1 port 8080
pass all
У меня ну нивкакую не появляются пакеты на портах 8080 этих интерфейсов.
Не могу понять почему.
Пробовал играть настройками форвардинга (net.inet.ip.forwarding=0/1) -- безрезультатно.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-23 21:10:07
m0ps
должно работать. а чем проверял есть пакеты на порту или нет? tcpdump'ом или логи со сквида? если со сквида, то там есть одна особенность в указании прослушиваемого порта, из-за которой может не работать.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-23 21:17:45
Grishun_U_S
m0ps писал(а):должно работать. а чем проверял есть пакеты на порту или нет? tcpdump'ом или логи со сквида? если со сквида, то там есть одна особенность в указании прослушиваемого порта, из-за которой может не работать.
tcpdump'om смотрел
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-23 21:38:24
m0ps
а если попробовать написать:
Код: Выделить всё
rdr pass on $int_if inet proto { tcp, udp } from $int_if:network to any port www -> $int_if port 8080
добавить pass (хотя у тебя и так pass all; ну на всякий случай) и inet
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-24 0:10:52
~>cerber<~
не забыл про
Код: Выделить всё
pass in proto { tcp, udp } from $int_if:network to 127.0.0.1 port www keep state
?
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-24 9:35:15
m0ps
~>cerber<~ писал(а):не забыл про
Код: Выделить всё
pass in proto { tcp, udp } from $int_if:network to 127.0.0.1 port www keep state
?
да у него ж вроде pass all есть
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-24 10:28:31
Grishun_U_S
m0ps писал(а):а если попробовать написать:
Код: Выделить всё
rdr pass on $int_if inet proto { tcp, udp } from $int_if:network to any port www -> $int_if port 8080
добавить pass (хотя у тебя и так pass all; ну на всякий случай) и inet
непонятно зачем нужен inet Пример из openbsd pf faq :
Код: Выделить всё
rdr on fxp0 proto tcp from any to any port { 22 80 } -> 192.168.0.6
хотя попробую чем черт не шутит.
Кто - нибудь пробовал мою ситуацию у себя воспроизвести?
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-24 19:40:48
Grishun_U_S
Короче все оказалось донельзя просто...
Не включил pf
решило вопрос. Мне пора в отпуск...
Кстати насчет
inet в правилах -- его можно не писать.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-25 9:37:21
m0ps
inet - это только IPv4
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-25 10:03:28
Grishun_U_S
m0ps писал(а):inet - это только IPv4
нет, оно вообще ни на что не влияет. pf добавит это слово в правила в любом случае, например :
Правило, которое я написал руками :
Код: Выделить всё
pass out on $ext_if_expensive from $trusted_lan to $wan_services keep state
правила, которые сформировалось на основании написанного руками:
Код: Выделить всё
pass out on tun1 inet from 192.168.0.0/24 to 85.113.63.251 flags S/SA keep state
pass out on tun1 inet from 192.168.0.0/24 to 85.113.59.8 flags S/SA keep state
pass out on tun1 inet from 192.168.0.0/24 to 85.113.62.200 flags S/SA keep state
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-25 10:25:46
m0ps
Grishun_U_S писал(а):m0ps писал(а):inet - это только IPv4
нет, оно вообще ни на что не влияет.
синтаксическая схема правила pf:
Код: Выделить всё
action [direction] [log] [quick] [on interface] [af] [proto protocol] \
[from src_addr [port src_port]] [to dst_addr [port dst_port]] \
[flags tcp_flags] [state]
af
Address family — inet для адресов IPv4 и inet6 для адресов IPv6. Обычно пакетный фильтр может определить требуемый протокол по указанным в правиле адресам.
эт так, для справки. хотя здесь и вправду это было не причем.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-26 13:13:01
Grishun_U_S
m0ps писал(а):
синтаксическая схема правила pf:
Код: Выделить всё
action [direction] [log] [quick] [on interface] [af] [proto protocol] \
[from src_addr [port src_port]] [to dst_addr [port dst_port]] \
[flags tcp_flags] [state]
af
Address family —
inet для адресов IPv4 и inet6 для адресов IPv6. Обычно пакетный фильтр может определить требуемый протокол по указанным в правиле адресам.
эт так, для справки. хотя здесь и вправду это было не причем.
Спасибо.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-11-26 20:34:04
Grishun_U_S
Настроил вроде бы проброс на 127.0.0.1:8080 всего веб трафика, который идет через нас.
Правила такие :
Код: Выделить всё
TRANSLATION RULES:
rdr on re0 inet proto tcp from 192.168.0.15 to any port = http -> 127.0.0.1 port 8080
rdr on re0 inet proto tcp from 192.168.0.15 to any port = https -> 127.0.0.1 port 8080
FILTER RULES:
scrub in all fragment reassemble
pass all flags S/SA keep state
No queue in use
Запускаю tcpdump в отдельном сеансе putty и вижу
пусто :
Код: Выделить всё
gateway6# tcpdump -i lo0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 96 bytes
несмотря на то, что инет ходит. Ну все думаю, значит ходит мимо прокси. Глушу squid:
опа! Инет пропал! Значит все-таки ходит через прокси!! Это радует.
В связи с этим вопрос :
1) Почему tcpdump не ловит эти пакеты? Хотя если пингануть lo0 пакеты идут.
Дезинформатор хренов.
Следующий вопрос заключается в том,
2) кэшировать ли DNS запросы?
Пока сделал с помощью ната :
Код: Выделить всё
TRANSLATION RULES:
nat on re0 inet from 192.168.0.0/24 to 85.113.63.225 port = domain -> 192.168.0.88
nat on re0 inet from 192.168.0.0/24 to 85.113.62.225 port = domain -> 192.168.0.88
rdr on re0 inet proto tcp from 192.168.0.15 to any port = http -> 127.0.0.1 port 8080
rdr on re0 inet proto tcp from 192.168.0.15 to any port = https -> 127.0.0.1 port 8080
FILTER RULES:
scrub in all fragment reassemble
pass all flags S/SA keep state
No queue in use
И третий вопрос заключается в том,
можно ли обойтись без [/size] ? (вместо этого пользоваться pf
)
Если ядро настроено на
, то оно отбросит пакеты, dst которых не принадлежит интерфейсам нашего компьютера, весь вопрос в том, что срабатывает раньше :
правило pf
или же ядро отбросит пакет раньше?
Исходя из результатов эксперимента, без
инет не ходит.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-12-04 18:36:51
Grishun_U_S
Что-то тема заглохла, а вы все носы посвешали.
Запощу-ка я приемчик один для разрядки обстановки так скть.
Скрипт sh, который обновляет правила фаервола, если в них нет ошибок :
Код: Выделить всё
#!/bin/sh
pfctl -nf /usr/local/etc/pf-casual-rules.cfg
if test $? = 0; then
pfctl -f /usr/local/etc/pf-casual-rules.cfg
echo "rules reloaded"
else
echo "there are some mistakes"
fi
Бывает так что серв давно сдан, но просят порт там пробросить или еще что-то открыть/закрыть.
Если мне нужно менять правила на сильно удаленной машине поступаю следующим образом :
1) завожу временный файл с правилами, над которыми буду работать, допустим /usr/local/etc/pf-temp-rules.cfg
2) пишу к нему скрипт аналогичный скрипту выше
3) ставлю в cron перезагрузку через 10 минут
делаю с помощью
4) выполняю скрипт обновления временных правил и если что-то пойдет не так как хотелось бы, то через 10 минут комп перезагрузится и сработают старые правила. Если же с правилами все ОК -- убиваю shutdown вручную.
Ответы на вопросы в прошлом посте (для себя)
1) tcpdump не ловит, потому что rdr срабатывает ПОСЛЕ него (не важно на каком интерфейсе слушать)
2) ДНС запросы кэшировать смысла нет (просто хотелось обойтись вообще без ната -- так безопаснее)
3) gateway_enable ставим в "YES" (опять же хотелось обойтись маршрутизацией средствами pf для больше безопасности)
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2008-12-22 20:58:13
Grishun_U_S
Тякс, ну вот впринципе подобрался вплотную к желаемой архитектуре сети.
DMZ городить не буду, т.к. 99% мелких офисов ее не имеет.
Конфигурация сети :

- архитектура сети, для которой написан конфиг
Наша локальная сеть : 192.168.0.0/24
В ней компы :
1) boss (просил "крутой номер") 192.168.0.168
2) buh (просила "номер чтоб легко запомнить") 192.168.0.100
3) admin (себе "номер" по остаточному принципу) 192.168.0.25
4) WinPeak (сервер CRM) 192.168.0.60
5) gatewayX (наш шлюз с PF), внутренний интерфейс имеет адрес 192.168.0.133 (внешний интерфейс имеет динамический белый адрес)
DNS сервер провайдера :
На шлюзе поднят транспарентный прокси.
Список разрешенных сервисов для наших пользователей
Все остальное заблокировано.
Smtp сервера у нас нет, бедные юзеры шлют письма через вебинтерфейсы бесплатных почтовиков.
Необходимо пробросить порт rdp с внешки внутрь сети, т.к. менеджер часто работает из дома.
Полосу (у нас 1Мбит, симметричный канал) делим следующим образом :
40% боссу
18% бухгалтеру
15% админу (если канал свободен, то дать больше)
12% серверу WinPeak
8% для доступа по ssh снаружи
5% выделим в отдельную очередь ack пакеты
2% DNS запросы
(тут скорее всего сделаю 2 набора правил : cbq и hfsc)
На ssh устанавливаем лимит подключений, например 1 в 60 секунд. Превысившых лимит брутфорсеров отключаем от нас по всем портам и баним на сутки.
Еще на шлюзе установлен SAMS и нам нужно иметь доступ снаружи, чтобы из дома прибавить траффик бухгалтеру (ессесно только с распоряжения Босса).
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2009-01-04 20:40:04
Grishun_U_S
собсно, конфиг версия 1 (altq на очередях cbq) :
Код: Выделить всё
##--macroses
int_if="re0"
ext_if="re0"
dns_serv="153.53.53.53"
proxy_if="lo0"
proxy_port="8080"
boss="192.168.0.168"
buh="192.168.0.100"
admin="192.168.0.25"
WinPeak="192.168.0.60"
allowed_icmp_types="{ echoreq, unreach }"
non_route_nets_inet="{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, \
169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"
##--tables
table <BRUTEFORCERS> persist
##--options
set skip on lo0
set block-policy return
set timeout { frag 10, tcp.established 3600 }
scrub in all
##--queues
altq on $ext_if cbq bandwidth 970Kb queue { qboss, qbuh, qadmin, qWinPeak, qssh, qdns, qack }
queue qboss bandwidth 40% priority 2 cbq ( borrow )
queue qbuh bandwidth 18% priority 2 cbq ( borrow )
queue qadmin bandwidth 15% priority 2 cbq ( borrow )
queue qWinPeak bandwidth 12% priority 3 cbq ( default borrow )
queue qssh bandwidth 8% priority 4 cbq ( borrow )
queue qdns bandwidth 2% priority 5 cbq ( borrow )
queue qack bandwidth 5% priority 6 cbq ( borrow )
##--nat & rdr
nat on $ext_if from $ext_if:network to any port { ntp, nntp, domain } -> $ext_if
# rdr from int_if:network to any:www -> proxy:proxy_port
rdr on $int_if proto tcp from $int_if:network to any port www -> $proxy_if port $proxy_port
# rdr from inet to me:rdp -> WinPeak:rdp
rdr on $ext_if proto tcp from any to $ext_if port rdp -> $WinPeak port rdp
##--rules
block all
# block&log suckers
antispoof log quick for { lo0, $int_if, $ext_if }
#NB!block drop in log quick on $ext_if from $non_route_nets_inet to any
block drop in log quick on $int_if from !$int_if:network to any
block drop in log quick on { $int_if, $ext_if } proto tcp from any to any port smtp
block quick from <BRUTEFORCERS>
# ssh
pass in on $int_if proto tcp from $int_if:network to $int_if port ssh queue ( qssh, qack ) synproxy state ( max-src-conn-rate 1/60, overload <BRUTEFORCERS> flush global )
pass in on $ext_if proto tcp from any to $ext_if port ssh queue ( qssh, qack ) synproxy state ( max-src-conn-rate 1/60, overload <BRUTEFORCERS> flush global )
# users's www -> proxy
pass in on $int_if proto tcp from $boss to $proxy_if port $proxy_port queue ( qboss, qack ) modulate state
pass in on $int_if proto tcp from $buh to $proxy_if port $proxy_port queue ( qbuh, qack ) modulate state
pass in on $int_if proto tcp from $admin to $proxy_if port $proxy_port queue ( qadmin, qack ) modulate state
# users's ntp (udp)
pass in on $int_if proto udp from $boss to any port ntp queue ( qboss, qack ) keep state
pass in on $int_if proto udp from $buh to any port ntp queue ( qbuh, qack ) keep state
pass in on $int_if proto udp from $admin to any port ntp queue ( qadmin, qack ) keep state
# users's nntp (tcp)
pass in on $int_if proto tcp from $boss to any port nntp queue ( qboss, qack ) modulate state
pass in on $int_if proto tcp from $buh to any port nntp queue ( qbuh, qack ) modulate state
pass in on $int_if proto tcp from $admin to any port nntp queue ( qadmin, qack ) modulate state
# users's dns (udp)
pass in on $int_if proto udp from $boss to any port domain queue ( qdns, qack ) keep state
pass in on $int_if proto udp from $buh to any port domain queue ( qdns, qack ) keep state
pass in on $int_if proto udp from $admin to any port domain queue ( qdns, qack ) keep state
# WinPeak RDP (tcp)
pass in on $ext_if proto tcp from any to $WinPeak port rdp queue ( qWinPeak, qack ) synproxy state
pass out on $int_if proto tcp from any to $WinPeak port rdp modulate state
# out ntp (udp)
pass out on $ext_if proto udp from $ext_if to any port ntp keep state
# out nntp (tcp)
pass out on $ext_if proto tcp from $ext_if to any port nntp modulate state
# out www (tcp)
pass out on $ext_if proto tcp from $ext_if to any port www modulate state
# dns queries (udp)
pass out on $ext_if proto udp from $ext_if to $dns_serv port domain keep state
# SAMS web management from elsewhere
pass in log on $ext_if proto tcp from any to $ext_if port www synproxy state
# icmp
pass log inet proto icmp all icmp-type $allowed_icmp_types
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2009-01-05 18:30:43
Grishun_U_S
Статья
тут, набросал кое-что, завтра продолжу
Чтоб не было непоняток как в прошлый раз
На этот раз напишу прямо : конструктивная критика приветствуется.
Re: Готовится статья "PF : Конфиг для офисов"
Добавлено: 2009-01-06 13:08:51
Grishun_U_S
Ну.... все готово, прошу любить и жаловать!