Шлюз в интернет с минимальными затратами, используя ipfw, natd, squid

Обновлена 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *