Меню сайта
Категории каталога
Интернет шлюз на FreeBSD [2008]
Построение шлюза в глобальную сеть на FreeBSD - это один из самых частых случаев использования этой системы. Основные плюсы данного решения это: стабильность, масштабируемость, устойчивость к высоким нагрузкам и естественно бесплатность всего используемого ПО. В этой заметке я опишу свой опыт развертывания Интернет-шлюза на FreeBSD 7.0 RELEASE amd64 с использованием межсетевого экрана IPFW, демона трансляции сетевых адресов natd и прокси-сервер squid. Начнем с установки IPFW. Для этого нужно пересобрать ядро с поддержкой нескольких функций. Заходим в директорию соответствующую архитектуре нашего процессора и делаем копию дефолтного ядра в ROUTER: # cd /usr/src/sys/amd64/conf # cp GENERIC ROUTER Редактируем наше новое ядро и добавляем новые функции: cpu HAMMER ident ROUTER makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols options IPFIREWALL # собственно файрволл options IPFIREWALL_VER # логгинг пакетов, если в правиле написано log options IPFIREWALL_VERBOSE_LIMIT=100 # ограничение логов (повторяющихся) options IPFIREWALL_DEFAULT_TO_ACCEPT # дефолтное правило - разрешающее options IPDIVERT # необходимо для NAT options IPFIREWALL_FORWARD # перенаправление пакетов options DUMMYNET # ограничение скорости Собираем и устанавливаем ядро: # cd /usr/src # make buildkernel KERNCONF=ROUTER # make installkernel KERNCONF=ROUTER Добавляем в rc.conf строки: firewall_enable="YES" firewall_type="open" firewall_logging="YES" natd_enable="YES" natd_interface="rl0"; Перезагружаемся. Если все нормально, то в итоге у нас должен получиться открытый фаервол с NAT. Пока оставим как есть. Следущим этапом у нас будет установка прокси-сервера. # cd /usr/ports/www/squid # make install clean # rehash Дальше редактируем конфигурационный файл сквида. У меня сейчас небольшая офисная сеть без домена, поэтому с авторизацией не занимался - все ограничения идут по ip: /usr/local/etc/squid/squid.conf # порт который слушаем http_port 3128 # порт прозрачного прокси http_port 3129 transparent # список слов, которые будучи обнаруженными в URL вызывают обработку без кэширования hierarchy_stoplist cgi-bin ? # список ACL которые вызывают несовпадение с кэшем, и, запрос с ответом кэшироваться
# не будут acl QUERY urlpath_regex cgi-bin \? # собственно - правило что не кэшируем no_cache deny QUERY # сколько отдаём ему памяти cache_mem 256 MB # Директория для кэша, числа - размер кэша в Mb, # число директорий первого уровня, число директорий второго # уровня в каждой директории первого. cache_dir ufs /usr/local/squid/cache 50000 64 512 # лог доступа - первый параметр путь, второй - формат # форматы описаны в дефолтовом файле. access_log /var/log/squid/access.log # лог активности менеджера хранилища. Показывает, какие # объекты были сохранениы/удалены из кэша и как долго. # мне он не нужен, а места занимает прилично. cache_store_log none # файл hosts, проверяемый при запуске. Из него берётся # доменное имя и добавляется к неполным адресам (которые # не содержат ни одной точки в имени) hosts_file /etc/hosts # директория где хранятся HTML c текстами ошибок error_directory /usr/local/etc/squid/errors/Russian-1251 cache_log /var/log/squid/cache.log #debug_options ALL,5 pid_filename /var/log/squid/squid.pid # порты на которе можно ходить пользователям acl safe_ports port 80 # http acl safe_ports port 21 # ftp acl safe_ports port 443 # ssl acl icq_ports port 5190 # ICQ # пользователи у которых просто интернет - с ограничениями acl inet_users src "/usr/local/etc/squid/inet_users" # пользователи с полными парвами на доступ в инет acl inet_full src "/usr/local/etc/squid/inet_full" # Описываем все сети все IP acl all src 0.0.0.0/0.0.0.0 # описываем локалхост acl localhost src 127.0.0.1/255.255.255.255 # запрещённые в URL выражения (для всего УРЛа) acl deny_url url_regex "/usr/local/etc/squid/deny_url" # запрещённые доменные имена acl deny_domains dstdomain "/usr/local/etc/squid/deny_domains" # пользователи с ограниченным доступом в интернет, только # определённый набор ресурсов и всё. acl inet_restrict src "/usr/local/etc/squid/inet_restrict" # список сайтов для тех у кого их определённый набор acl domains_for_restrict dstdomain "/usr/local/etc/squid/domains_for_restrict" # пользователи ICQ acl inet_icq src "/usr/local/etc/squid/inet_icq" # Разрешаем доступ ко всему группе inet_full http_access allow inet_full # Зарубаем запрещённые куски url, рубим рекламу если надо #http_access deny deny_url # Разрешаем асечный порт тем у кого есть аська http_access allow inet_icq icq_ports # зарубаем запрещённые домены http_access deny deny_domains # зарубаем все порты проме safe_ports http_access deny !safe_ports # разрешаем инет обычным пользователям http_access allow inet_users # разрешаем инет ограниченным пользователям на разрешённые сайты http_access allow inet_restrict domains_for_restrict # блокируем всё лишнее http_access deny all Вкратце по конфигу: слушаем как на стандартном порту, так и прикрутили прозрачный прокси; принимаем запросы http, https ftp, icq; распределение доступа производится на основе правил и файлов, в которых прописываются ip нужных компьютеров.
Дальше создаем и заполняем содержимым все файлы, указанные в этом конфиге, делаем пользователя squid владельцем папки с кэшем, после чего создаем кэш и запускаем сквид:
# chown -R squid:wheel /usr/local/squid # squid -z # /usr/local/etc/rc.d/squid start # ps -waux | grep squid squid 965 0,0 0,1 7688 2076 ?? Is 21:37 0:00,00 /usr/local/sbin/squid -D squid 967 0,0 1,0 28168 20008 ?? S 21:37 0:06,00 (squid) -D (squid) squid 1008 0,0 0,0 2532 844 ?? Is 21:37 0:00,00 (unlinkd) (unlinkd) root 7943 0,0 0,1 6928 1428 p0 S+ 16:02 0:00,00 grep squidТеперь опять вернемся к фаерволу. Он у нас есть, открытый - но толку-то от такого фаервола ? =) Создаем свой скрипт с правилами. У меня он выглядит так:
#!/bin/sh # при работе по SSH, чтобы перечитать конфиг набирать nohup sh /etc/rules # Прежде, чем мы начнем, сбросим список ipfw -q -f flush # Установим префикс команды для набора правил cmd="ipfw -q add" skip="skipto 400" wanip="111.111.111.111" # внешний IP lannet="192.168.0.0/24" # внутренняя сеть eif="rl0" # внешний интерфейс # Нет запретов внутри интерфейса смотрящего в локальную сеть $cmd 010 allow all from any to any via re0 # Нет ограничений на Loopback интерфейсе $cmd 020 allow all from any to any via lo0 # Рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 $cmd 030 deny ip from any to 127.0.0.0/8 $cmd 040 deny ip from 127.0.0.0/8 to any # отправляем всех на прозрачный squid $cmd 050 fwd 127.0.0.1,3129 tcp from $lannet to any 21,80,443,5190 out via $eif # Входящий NAT $cmd 060 divert natd ip from any to any in via $eif # Позволяем пакету проходить, если предыдущий был добавлен в # "динамическую" таблицу правил с разрешением состояния keep-state $cmd 070 check-state ############## Outgoing ################ # Исходящий PING $cmd 100 $skip icmp from any to any keep-state # Исходящий NTP $cmd 105 $skip udp from any to any 123 out via $eif keep-state # Разрешаем DNS $cmd 110 $skip udp from any to any 53 out via $eif keep-state $cmd 111 $skip tcp from any to any 53 out via $eif setup keep-state # Выпускаем пользователей в обход сквида $cmd 140 $skip all from $lannet to any 4899 out via $eif setup keep-state $cmd 150 $skip all from $lannet to any 3389 out via $eif setup keep-state $cmd 160 $skip all from $lannet to any 25 out via $eif setup keep-state $cmd 170 $skip all from $lannet to any 110 out via $eif setup keep-state # Разрешаем полный выход с сервака $cmd 190 $skip all from $wanip to any out via $eif setup keep-state ############# Incoming ################ # Запрещаем весь входящий трафик из зарезервированных адресных пространств $cmd 200 deny all from 192.168.0.0/16 to any in via $eif #RFC 1918 private IP $cmd 201 deny all from 172.16.0.0/12 to any in via $eif #RFC 1918 private IP $cmd 202 deny all from 10.0.0.0/8 to any in via $eif #RFC 1918 private IP $cmd 203 deny all from 127.0.0.0/8 to any in via $eif #loopback $cmd 204 deny all from 0.0.0.0/8 to any in via $eif #loopback $cmd 205 deny all from 169.254.0.0/16 to any in via $eif #DHCP auto-config $cmd 206 deny all from 192.0.2.0/24 to any in via $eif #reserved for docs $cmd 207 deny all from 204.152.64.0/23 to any in via $eif #Sun cluster $cmd 208 deny all from 224.0.0.0/3 to any in via $eif #Class D & E multicast # Запрещаем ident $cmd 215 deny tcp from any to any 113 in via $eif # Запрещаем весь сервис Netbios. 137=имя, 138=дейтаграмма, 139=сессия $cmd 220 deny tcp from any to any 137 in via $eif $cmd 221 deny tcp from any to any 138 in via $eif $cmd 222 deny tcp from any to any 139 in via $eif $cmd 223 deny tcp from any to any 81 in via $eif # Входящий пинг, несколько типов $cmd 300 allow icmp from any to $wanip in via $eif icmptypes 0,8,11 limit src-addr 2 # Разрешаем входящую www функцию, если есть вэб сервер $cmd 310 allow tcp from any to $wanip 80 in via $eif setup limit src-addr 2 # Разрешаем входящие безопасные SSH, номер порта лучше сменить $cmd 320 allow tcp from any to $wanip 22 in via $eif setup limit src-addr 2 # Разрешаем входящую почту SMTP, если есть почтовый сервер $cmd 330 allow tcp from any to $wanip 25 in via $eif setup limit src-addr 2 # Разрешаем входящую почту POP3, если есть почтовый сервер $cmd 340 allow tcp from any to $wanip 110 in via $eif setup limit src-addr 2 # Разрешаем RAdmin, номер порта лучше сменить $cmd 350 allow tcp from any to $wanip 4899 in via $eif setup limit src-addr 2 # Разрешаем уже установленные соединения $cmd 360 allow all from any to any established ########### Final ############### # рубим все, что не ушло в скип $cmd 399 deny log all from any to any # Исходящий NAT $cmd 400 divert natd ip from any to any out via $eif # Выпускаем пакеты из скипа $cmd 410 allow all from any to any # Режем все лишнее с занесением в лог $cmd 999 deny log all from any to anyМеняем в rc.conf строчку firewall_type="open" на firewall_script="/etc/rules" и применяем скрипт с правилами:
# nohup sh /etc/rulesВсе тщательно проверяем и приходим к выводу, что у нас не работает RAdmin =)
Прокинуть порты на внутренние машины можно стандартными средствами natd, но лишние проблемы нам не нужны и поэтому мы пойдем другим путем - поставим из портов rinetd, отвечающий за проброс портов и требующий тривиальной настройки:
# cd /usr/ports/net/rinetd # make install clean # rehashПравим его конфиг, у меня примерно так выглядит:
/usr/local/etc/rinetd.conf
213.221.56.98 4899 192.168.0.100 4899Добавляем его в rc.conf и стартуем:
# echo 'rinetd_enable'="YES" > > rc.conf # /usr/local/etc/rc.d/rinetd startPS: для создания этой статьи активно использовались материалы с сайта
http://www.lissyara.su , за что ему огромная благодарность!
Источник: http://www.opennet.ru/base/net/freebsd_gw2.txt.html
Категория: Net | Добавил: oleg (28.07.2008) | Автор: Alchemist
Просмотров: 1379 | Комментарии: 2 | Рейтинг: 5.0 /1 |
- Оценить -
Отлично
Хорошо
Неплохо
Плохо
Ужасно
Всего комментариев: 2
Порядок вывода комментариев:
По умолчанию
Сначала новые
Сначала старые
2
brother
(16.09.2008 23:38)
0
>> но удивительно, что SQUID не умеет пробрасывать UDP и TCP пакеты
А о NAT ничего не слышал?)
1
SnipeR
(04.09.2008 23:03)
0
Уважаемый Alchemist я хотел бы спросить у вас, а как быть с UDP и TCP портами для игр и остальных программ, использующих другие порты (напр. HL - 27015). Возможно, ли это использовать с использованием SQUID и IPFW и как это необходимо заделать? К сожалению, у меня ещё очень малый опыт при работе с UNIX системами(3-и недели), но удивительно, что SQUID не умеет пробрасывать UDP и TCP пакеты (Возможно, я ошибаюсь) с возможностью ограничения по скорости. Вопрос как это делают и как это сделать ???
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация |
Вход ]
Форма входа
Друзья сайта