Обновлена 10.10.2013
Возник вопрос, как быстро установить простенький шлюз-роутер в интернет для небольшого офиса на FreeBSD.
Внимание!
Перед установкой следует позаботиться о достаточном количестве файловых дескрипторов для пользователя, от которого работает squid, при включённом кешировании.
В 9.2-Stable обнаружен баг: любое создание интерфейса вырубало форвардинг, устанавливало параметр net.inet.ip.forwarding в 0. Что бы этого не было, нужно устанавливать gateway_enable=”YES” в rc.conf
1) Включения IPFW
Есть 2 способа: включить в ядро и добавить в /etc/rc.conf
– Добавления в rc.conf
Добавляем следующее:
firewall_enable="YES"
firewall_script="/etc/fire.wall"
– Пересборка ядра
Примечание
В src/UPDATING (RELENG-9) появилась запись, информирующая об удалении опции IPFIREWALL_FORWARD. Теперь этот функционал работает “из коробки”, достаточно просто загрузить модуль ядра ipfw.ko. В stable/9 это изменение уже тоже есть, но в релиз оно не попадёт. И так, начиная с 9.1 уже не нужно будет пересобирать ядро для ipfw fwd. Более того, при пересборке с этой опцией make будет ругаться на то, что не знает такой опции. Так что, если у вас пошла ругань – просто исключите эту опцию
Пересобираем ядро с такими опциями
options IPFIREWALL # собственно файрволл
options IPFIREWALL_VERBOSE # логгинг пакетов, если в правиле написано `log`
options IPFIREWALL_VERBOSE_LIMIT=1000 # ограничение логов (повторяющихся) - на случай атак типа флудинга
options IPFIREWALL_FORWARD # перенаправление (форвардинг) пакетов например, для прозрачного прокси
options IPDIVERT # если нужен NAT (трансляция адресов)
options DUMMYNET # если понадобится ограничивать скорость инета пользователям (обычно - да :))
options IPFIREWALL_DEFAULT_TO_ACCEPT # дефолтовое правило (последнее) будет разрешающим (во всех других) случаях - запрещающее
2) Устанавливаем squid
Обновляем порты и ставим “кальмара”. Рекомендую ставить версию 2.6, так как она наиболее описана в инете и проблемы решаемы.
#cd /usr/ports/www/squid26 && make install clean
Далее переходим к настройке squid’a.
Предлагаю дефолтовый минимальный конфиг по правилу всем всё разрешено. В дальнейшем это можно изменить.
http_port 127.0.0.1:3128 transparent
maximum_object_size 16384 KB
maximum_object_size_in_memory 8 KB
cache_mem 128 MB
cache_dir ufs /usr/local/squid/cache 40000 16 256
coredump_dir /usr/local/squid/cache
logformat skel_squid %{%d/%b/%Y:%H:%M:%S}tl %6tr %>a %Ss/%03Hs %
access_log /usr/local/squid/logs/access.log skel_squid
cache_log /usr/local/squid/logs/cache.log
cache_store_log /usr/local/squid/logs/store.log
pid_filename /usr/local/squid/logs/squid.pid
logfile_rotate 10
acl all src 0.0.0.0/0.0.0.0
acl CONNECT method CONNECT
http_access allow all
cache_mgr hostmaster@domain.ua
cache_effective_user squid
cache_effective_group squid
visible_hostname server.domain.ua
cachemgr_passwd QuErY all
Настройки можно изменить по своему вкусу 🙂 (Благодаря опции logformat squid теперь пишет логи с датой в привычном формате, а не колличество секунд с 1980 года)
Для запуска squid’a прописываем следующую строчку в /etc/rc.conf
squid_enable="YES"
Теперь создаём своп и потом запускаем
#squid -z
#/usr/local/etc/rc.d/squid start
Проверяем запущен ли он
# /usr/local/etc/rc.d/squid status
squid is running as pid 855.
Сквид запущен, но он не выполняет ничего. Для этого нужно завернуть всех на него. Это мы будем делать в файерволе, чуть ниже.
3) NAT
Для нормальной работы достаточно 2 строчек в /etc/rc.conf
natd_enable="YES"
natd_flags="-f /etc/natd.conf"
и правила в файрволе (натится у нас внешний интерфейс, em0)
ipfw add divert natd all from any to any via em0
и собственно файла трансляции /etc/natd.conf
unregistered_only yes
use_sockets yes
same_ports yes
port 8668
alias_address 11.11.11.11 # внешний IP
4) Форвардинг пакетов между сетевухами, подсетями (касается только тех, кто не пересобирал ядро с опцией options IPFIREWALL_FORWARD).
Для того, что бы сервер пересылал пакеты между подсетями, нужно в /etc/rc.conf доабвить такую строку (и перегрузить сервак):
gateway_enable="YES"
5) Настраиваем файервол
После пересборки ядра файервол уже будет работать. По дефолту там будет всего одно правило : разрешить всё всем
65535 allow ip from any to any
Теперь создадим свой набор правил и пропишем путь к нему в /etc/rc.conf
firewall_script="/etc/fire.wall"
Теперь при загрузке сервера правила для ipfw будут автоматом подгружаться из файла/etc/fire.wall. Содержимое этого файла ниже
#!/bin/sh
FwCMD="/sbin/ipfw "
${FwCMD} -f flush
# deny flood traffic
${FwCMD} add 101 allow all from any to any via lo0
${FwCMD} add 102 deny all from any to 127.0.0.0/8
${FwCMD} add 103 deny all from 127.0.0.0/8 to any
${FwCMD} add 110 deny icmp from any to any frag
# squid
${FwCMD} add 1001 allow all from 10.10.10.0/24 to me 3128
${FwCMD} add 1002 fwd 127.0.0.1,3128 tcp from 10.10.10.0/24 to any dst-port 80
# NAT
${FwCMD} add 5000 divert natd all from any to any via em0
Вот собственно и всё. Для проверки того, что всё-таки ходят через squid запустим просмотр счётчиков ipfw с разницей в секунд 10-15 и внимательно посмотрим на правило 1002:
01002 19298810 5402770824 fwd 127.0.0.1,3128 tcp from 10.10.10.0/24 to any dst-port 80
01002 19301461 5404069931 fwd 127.0.0.1,3128 tcp from 10.10.10.0/24 to any dst-port 80
Если значения меняются, значит заворот идёт. Так же можно посмотреть в логи squid’a – если появляются новые записи, значит всё ок.
6) Ротация логов squid’a
Не забываем добавить ротацию логов в cron:
58 23 * * * root /usr/loca/sbin/squid -k rotate
Примечание
Если вдруг понадобится отключить ipfw, вкомпиленный в ядро, делаем так:
#sysctl net.inet.ip.fw.enable=0