Первый раз в первый класс. Вообщем мой первый bsd-сервер. Уверен что многое не оптимально или вообще не правильно, прошу совета.
Задачи следующие:
1.Организация доступа в интернет для порядка 50 юзеров.
2.Организация эл.почтового обмена для них же, естественно и с внешним миром тоже.
3.Подключение двух провайдеров с равной балансировкой и резервированием.
4.Ну и соответственно обеспечение безопасности всего этого и того что за ним в сети.Что имеем:
Celeron 1100MHz, sdram dimm (avail memory = 511270912 (487 MB)),
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 520M 325M 153M 68% /
devfs 1.0k 1.0k 0B 100% /dev
/dev/ad0s1e 520M 27k 478M 0% /tmp
/dev/ad0s1f 77G 2.6G 68G 4% /usr
/dev/ad0s1d 1.2G 390M 727M 35% /var
райдов нету
Что делаю:
freebsd7.3+pf+(squid+c_icap+squidguard)+(exim4+courier_imap+spamassassin+xams+mysql)+clamav ну и плюс конечно apache22, dnsmasq и ftpd.
машина тестовая !!!
pf.conf (делал по принципу "всех выпускать, никого кроме почты не впускать" :) пока так надо)
-------------------------------------------------------
ext_if1="rl0" #внешний интерфейс 1го прова
ext_if2="rl2" #внешний интерфейс 2го прова
ext_gw1="192.168.1.8" #шлюз 1го прова
ext_gw2="192.168.1.8" #шлюз 2го прова
int_if="rl1" #локальный интерфейс
localnet="172.16.1.0/24" #локальная сеть
den_host="172.16.1.2" #моё
#пропустить проверку на петле
set skip on lo0
#включить логи на интерфейсах
set loginterface rl0
set loginterface rl1
set loginterface rl2
#нормализация трафа
scrub in all
scrub out all
#ограничение полосы #пока не работает
#altq on $int_if cbq bandwidth 8.0Mb queue { std std2 }
#очередь #пока не работает !!!!
#queue std bandwidth 50% cbq{ecn}
#queue std2 bandwidth 50% cbq{ecn}
#используем ftp-proxy для доступа к фтп серверам в инете
nat-anchor "ftp-proxy/*"
#используем ftp-proxy для доступа к фтп серверам в инете
rdr-anchor "ftp-proxy/*"
#редирект для сквида
rdr on $int_if proto tcp from $localnet to any port 80 -> $int_if port 3128
#натим внешние интерфейсы
nat on $ext_if1 from $int_if:network to any -> ($ext_if1)
nat on $ext_if2 from $int_if:network to any -> ($ext_if2)
#редирект на ftp-proxy
rdr pass on $int_if proto tcp from $den_host to any port {ftp,ftp-data} -> 127.0.0.1 port 8021
block all #блок всего по-умолчанию
antispoof quick for { lo0 $int_if }
#используем frp-proxy для доступа к фтп серверам в инет
anchor "ftp-proxy/*"
#пропускаем все исходящие пакеты на внутреннем инт.
pass out log on $int_if from any to $localnet
#разрешаем доступ к ssh для меня
pass in quick log on $int_if proto tcp from $den_host to $int_if port ssh
#запрещаем доступ к ssh для остальных
block in quick log on $int_if proto tcp from $localnet to $int_if port ssh
#доступ к почтальону из инета
pass in quick log on $ext_if1 proto tcp from any to $ext_if1 port smtp
#пропускаем все!!! пакеты для шлюза из локали
pass in quick log on $int_if from $localnet to $int_if
#балансировка каналов
pass in route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin from $localnet to any
#основные выпускающие правила
pass out log on $ext_if1 proto tcp from any to any flags S/SA modulate state
pass out log on $ext_if1 proto {udp, icmp} from any to any
pass out log on $ext_if2 proto tcp from any to any flags S/SA modulate state
pass out log on $ext_if2 proto {udp, icmp} from any to any
#маршрутизация пакетов "откуда пришел туда и выходи" ...нужно? нет?
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
--------------------------------------------------------
далее для контроля над веб-трафиком делаем squid, так как провов двое, то делаю три копии squida, один основной и два парента:
squid.conf (основной)
-------------------------------------------------------
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 172.16.1.0/24 # RFC1918 possible internal network
acl den src 172.16.1.2
http_access allow manager localhost
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128 intercept
hierarchy_stoplist cgi-bin ?
coredump_dir /usr/local/squid/cache
refresh_pattern ^ftp: &n... 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
delay_pools 2
delay_class 1 1
#2mbit
delay_class 1 1
delay_parameters 1 250000/250000
delay_access 1 allow den
delay_access 1 deny all
#на всех остальных
delay_class 2 1
delay_parameters 2 750000/750000
delay_access 2 allow localnet
delay_access 2 allow localhost
delay_access 2 deny all
cache_mem 128 MB
maximum_object_size 10024 KB
cache_dir ufs /usr/local/squid/cache 2048 16 256
cache_store_log /usr/local/squid/logs/store.log
cache_access_log /usr/local/squid/logs/access.log
cache_log /usr/local/squid/logs/cache.log
pid_filename /usr/local/squid/squid.pid
logformat squid %tl.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
logfile_rotate 10
visible_hostname pavlik.sp
#паренты
cache_peer localhost parent 3127 3129 round-robin no-query
cache_peer 127.0.0.1 parent 3130 3131 round-robin no-query
never_direct allow all
#icap ...не хочет работать зараза
#icap_enable on
#icap_preview_enable on
#icap_preview_size 128
#icap_persistent_connections on
#icap_send_client_ip on
#icap_service service_av_req reqmod_precache 0 icap://localhost:1344/srv_clamav
#icap_service service_av_res respmod_precache 1 icap://localhost:1344/srv_clamav
#adaptation_service_set class_av_req service_av_req
#adaptation_service_set class_av_res service_av_res
#adaptation_access class_av_req allow localhost
#adaptation_access class_av_res allow localhost
#squidguard
url_rewrite_program /usr/local/bin/squidGuard -c /usr/local/etc/squid/squidGuard.conf
url_rewrite_children 5
cache_effective_user squid
cache_effective_group squid
shutdown_lifetime 5 seconds
--------------------------------------
парент 1:
squidt.conf
-----------------------------------------
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 172.16.1.0/24 # RFC1918 possible internal network
http_access allow manager localhost
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 127.0.0.1:3127
icp_port 3129
hierarchy_stoplist cgi-bin ?
cache_dir ufs /usr/local/squidt/cache 1024 16 256
cache_access_log /usr/local/squidt/logs/access.log
cache_log /usr/local/squidt/logs/cache.log
coredump_dir /usr/local/squidt/cache
pid_filename /usr/local/squidt/squidt.pid
tcp_outgoing_address 192.168.1.205
refresh_pattern ^ftp: &n... 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
cache_mem 64 MB
maximum_object_size 5012 KB
logformat squid %tl.03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
logfile_rotate 10
shutdown_lifetime 5 seconds
visible_hostname pavlik.sp
--------------------------------------------
аналогично парент 2:
squidh.conf
---------------------------------------------
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 172.16.1.0/24 # RFC1918 possible internal network
http_access allow manager localhost
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 127.0.0.1:3130
icp_port 3131
hierarchy_stoplist cgi-bin ?
cache_dir ufs /usr/local/squidh/cache 1024 16 256
cache_access_log /usr/local/squidh/logs/access.log
cache_log /usr/local/squidh/logs/cache.log
cache_store_log /usr/local/squidh/logs/store.log
coredump_dir /usr/local/squidh/cache
pid_filename /usr/local/squidh/squidh.pid
tcp_outgoing_address 192.168.1.200
refresh_pattern ^ftp: &n... 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
cache_mem 64 MB
maximum_object_size 50012 KB
logformat squid %tl.03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
logfile_rotate 10
shutdown_lifetime 5 seconds
visible_hostname pavlik.sp
------------------------------------------------
По этой связке (pf+squid`ы) веб-трафик (пока только 80й порт) заворачивается на squid и весь остальной трафик просто пропускается наружу, и все это (глядя tcpdump`ом) примерно поровну делется по двум внешним каналам ну и там еще контент фильтруется сквидгвардом и по идее еще на вирусятину должно проверятся, но пока не работает (поэтому закоментарил сicap), но и бог с ним об этом отдельно потом как нибудь. Остается только вопрос по резервированию каналов, т.е. при данном конфиге, если один из каналов падает, то падает всё, яндексогугливание ничего путного не подсказало, кроме как сделать скрипт который тупо по результатам пинга переконфигурит pf и сквида, вот что получилось:
мой первый сомастоятельный скрипт, сильно не пинайте :)
-----------
#!/bin/sh
#
# Проверка каналов на доступность
#
test_host=www.ru
tc_iface=192.168.1.205
hn_iface=192.168.1.200
#Пингуем каналы
/sbin/ping -c 1 -S $tc_iface $test_host > /dev/null 2>&1
tc=$?
/sbin/ping -c 1 -S $hn_iface $test_host > /dev/null 2>&1
hn=$?
#
#Если какой то из каналов не доступен, то отключаем его использование путем подмены #конфигов сквида и PF и делаем метку об отключении канала, если доступны оба - грузим #основные конфиги сквида PF и делаем об этом метку и логируем кое что, заодно проверяем #запущены ли сквиды.
#
if [ ! -f /usr/local/squid/squid.pid ]; then
service squid start \
&& echo `date -v-1d` " Squid is down! Starting Squid..." >> /usr/local/squid/logs/chanels.state
else
if [ $tc != 0 ]; then
if [ ! -f /tmp/teleconnect_down.squid ]; then
pfctl -f /etc/pf_hn.conf \
&& service squid stop \
&& squid -f /usr/local/etc/squid/squid_tc_down.conf \
&& rm /tmp/*.squid \
&& touch /tmp/teleconnect_down.squid \
&& echo `date -v-1d` " Teleconnect is down" >> /usr/local/squid/logs/chanels.state
fi
else
if [ $hn != 0 ]; then
if [ ! -f /tmp/homenet_down.squid ]; then
pfctl -f /etc/pf_tc.conf \
&& service squid stop \
&& squid -f /usr/local/etc/squid/squid_hn_down.conf \
&& rm /tmp/*.squid \
&& touch /tmp/homenet_down.squid \
&& echo `date -v-1d` " HomeNet is down" >> /usr/local/squid/logs/chanels.state
fi
else
if [ $hn = 0 ]; then
if [ $tc = 0 ]; then
if [ ! -f /tmp/all_chanels_active.squid ]; then
pfctl -f /etc/pf.conf \
&& service squid stop \
&& service squid start \
&& rm /tmp/*.squid \
&& touch /tmp/all_chanels_active.squid \
&& echo `date -v-1d` " Now all chanels are avalable" >> /usr/local/squid/logs/chanels.state
fi
fi
fi
fi
fi
fi
-----------------------------------------
сначала я написал этот скрипт только для сквида, т.е. не трогая pf, отрабатывало все корректно, потом когда добавил еще и подмену конфигов pf то начались какие то проблемы с резолвом, но я склонен полагать что это из за того что машина пока тестовая и как уже можно было заметить то два интерфейса (которые роль внешних играют) находятся в одной подсети и с одним шлюзом, что не совсем корректно, вообщем оставил пока этот вопрос до момента ввода сервера в реальную работу.
Далее про почту, тут все делал по статье - http://www.opennet.me/base/net/exim_xams_setup.txt.html и все работает вроде адекватно, правда долго маялся с the bat, который очень любит cram-md5, аутентификатор для него в конфиг я добавил, exim успешно об этом объвлял, но бат категорически отказывался проходит авторизацию, короче проблема оказалась в том что xams согласно своим макросам пароли созданных юзеров в мускуль вносил в шифрованном виде, вообщем оно конечно хорошо, но cram-md5 пароли нужны были в открытом виде, в макросах xams я отключил шифрование и пароли стали кластся в открытом виде, однако я думаю лучше совсем отказаться от md5 например в пользу ssl/tls чем держать базу с открытыми паролями.
Вообщем в оставшихся проблемах у нас:
-Не работает проверка веб-контента через c_icap и кстати пробовал еще и squidclamav, та же песня
-не работает altq в pf, тут я хотел по-ровну поделить канал на всех, но честно признаться глубоко с этим не разбирался :)
Приведенные мной конфиги ну почти в полной мере решают поставленные задачи :) Но хотелось бы услышать советы бывалых админов по поводу конфигов, в частности стабильности и отказоустойчивости ну и конечно же безопасности всей этой моей котовасии :) при указанных нагрузках, т.е. имеем примерно 50 пользователей почти у каждого есть skype и многие пользуют торренты ну и почта конечно же, примерный объем трафика порядка 50ГБ в месяц.
Заранне спасибо за работу.