Wednesday, August 23rd, 2017

Интернет шлюз на FreeBSD

Published on Март 30, 2009 by   ·   Комментариев нет

Построение шлюза в глобальную сеть на FreeBSD — это один из самых частых

read more

случаев использования этой системы. Основные плюсы данного решения это:
стабильность, масштабируемость, устойчивость к высоким нагрузкам и
естественно бесплатность всего используемого ПО. В этой заметке я опишу
свой опыт развертывания Интернет-шлюза на 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_VERBOSE           # логгинг пакетов, если в правиле написано 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 start

PS: для создания этой статьи активно использовались материалы с сайта
http://www.lissyara.su, за что ему огромная благодарность!

zp8497586rq























Смотрите также:

Readers Comments (Комментариев нет)

Comments are closed.

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]