Шлюз на CentOS 6 или связка Squid + sarg + iptables + HTB

Предлагаю свой вариант настройки шлюза для доступа в Интернет на основе связки CentOS + squid + sarg + iptables + HTB.
Связка состоит из:
1. Squid — кэширующий прокси сервер
2. Sarg — анализатор логов для Squid (у этой программы есть аналоги: Free-SA и LightSquid)
3. iptables — утилита для настройки встроенного фаервола
4. HTB — полезный скрипт, шейпер трафика.
Вводные данные
IP-адрес сети: 192.168.50.0/255.255.255.0
Внутренний IP-адрес шлюза: 192.168.50.2
Внешний IP-адрес шлюза: 10.168.50.2
IP-адрес DNS сервера провайдера: 217.15.11.11
Сетевые интерфейсы: eth0 — Интернет и eth1 — локалка
Откроем первый файл, который отвечает за первый адаптер. Подключим этот интерфейс к Интернету.
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=»eth0″
HWADDR=»08:00:27:79:17:85″
NM_CONTROLLED=»no»
ONBOOT=»yes»
GATEWAY=10.168.50.2
IPADDR=10.168.50.45
PREFIX=24
BROADCAST=10.168.50.255
DNS1=10.168.50.1

Теперь пришла очередь второго файла, отвечающего за сетевую карту подключенную в локальную сеть.
# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=»eth1″
HWADDR=»08:00:27:1D:7B:43″
NM_CONTROLLED=»no»
ONBOOT=»yes»
IPADDR=192.168.50.2
PREFIX=24

Перезапустим сетевую службу, чтобы наши изминения вступили в силу:
# service network restart

Как только мы настроили сетевую часть, можно непосредственно приступать к настройке прокси сервера.
Установим и не много настроим Squid.
# yum install squid -y
Прокси сервер Squid работает сразу после установки, настроим его под наши скромные нужды:
/etc/squid/squid.conf -> http_port 3128 transparent
Детальную настройку производить не будем, так как нам нужно просто добиться нормальной работы шлюза.
Поставим службу прокси сервера в автозагрузку:
# chkconfig squid on
Запустим его:
# service squid start
Установим вспомогательные пакеты, такие как веб сервер «Apache», утилиту закачки файлов «wget».
# yum install httpd wget gd system-config-firewall-tui mc setuptool
Разрешим пересылку пакетов через наш шлюз:
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
Пришла очередь анализатора логов, установим Sarg:
# wget http://pkgs.repoforge.org/sarg/sarg-2.3.1-1.el6.rft.x86_64.rpm
# rpm -ivh sarg-2.3.1-1.el6.rft.x86_64.rpm
Теперь отредактируем конфигурационный файл /etc/sarg/sarg.conf
# vi /etc/sarg/sarg.conf
Здесь много разных настроек, подправим его под наши нужды:
#### sarg.conf####
access_log /var/log/squid/access.log # Файл лога Squid
graph_font /etc/sarg/fonts/DejaVuSans.ttf # Шрифт используемый Sarg’ом
Откроем файл sarg.conf:
# vi /etc/httpd/conf.d/sarg.conf
В этом файле добавляем строчку:
Allow from All
Эта настройка открывает доступ к отчетам анализатора для всех ПК.
Запустим и поместим веб сервер Apache в автозагрузку:
# chkconfig —level 35 httpd on
# service httpd start
Запустим Sarg в тестовом режиме:
# sarg -x
Здесь мы запустили Sarg в отладочном режиме, на экран будет выведено много информации для отладки. Если в процессе тестового запуска будут ошибки, значить надо устранить проблемы и запустить отладку еще раз. Если все хорошо, вы увидите отчет в директории /var/www/sarg/. Также этот отчет можно посмотреть введя в браузере http://IP/sarg
##############################################################
Осталось настроить фаервол и шейпер.
Отключаем встроенную цепочку «RH-Input»:
# setup
Firewall Configuration -> Убрать звездочку -> OK -> YES-> QUIT
Для настройки фаервола, создайте файл /etc/sysconfig/firewall.sh
# vi /etc/sysconfig/firewall.sh
Теперь в этот файл вставьте следующий текст:
#!/bin/bash
#Очистка всех цепочек
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -X -t nat
iptables -X -t mangle
#Политика по умолчанию — запретить все, что не разрешено
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#Пропускать уже инициированные, а также их дочерние пакеты на вход
iptables -A INPUT -p all -m state —state ESTABLISHED,RELATED -j ACCEPT
#Пропускать новые, инициированные, а также их дочерние на выход
iptables -A OUTPUT -p all -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT
#Разрешаем обращение к lo (127.0.0.1) интерфейсу
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT
#Разрешаем обращение к внутреннему интерфейсу eth1 — всем из локальной сети
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
#Разрешаем обращение к mail, ssh, ftp,dns серверам по протоколу TCP из нашей локальной сети
#Тут нету 80 порта, так как трафик пришедший на этот порт мы отправим на прокси сервер Squid
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.50.0/24 -p tcp -m multiport —dports 22,21,25,110,443 -j ACCEPT
#Разрешаем DNS запросы по протоколу UDP и TCP из нашей локальной сети
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.50.0/24 -p udp -m multiport —dports 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.50.0/24 -p tcp -m multiport —dports 53 -j ACCEPT
#Разрешаем пинги с внутреннего интерфейса
iptables -A INPUT -i eth1 -p ICMP -j ACCEPT
iptables -A OUTPUT -o eth1 -p ICMP -j ACCEPT
#Настройка NAT и редирект c 80 порта на прокси сервер Squid
iptables -t nat -A PREROUTING -p tcp —dport 80 -j REDIRECT —to-ports 3128
iptables -t nat -A POSTROUTING -s 192.168.50.0/255.255.255.0 -j SNAT —to-source 10.168.50.45
Вставляем наш скрипт в автозагрузку:
# chmod +x /etc/sysconfig/firewall.sh

# vi /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/etc/sysconfig/firewall.sh # Наш скрипт правил фаервола!

Теперь давайте прикрутим шейпер HTB.
У нас два интерфейса на роутере, один который зовется eth0 подключен к Интернету, провайдер по нему дает следующие скорости 20 мбит на входящий и 10 мбит на исходящий трафик.
Сетевая карта под именем eth1 подключена в локальную сеть, скорость ее работы 100 мбит.
Наша задача решить с помощью шейпера следующее:
* отдельная полоса для таких сервисов как ssh, voip (SIP), http и игрового трафика (CS 1.6).
* разделение канала поровну между машинами
Скрипт HTB задействует утилиту tc. Почему используют HTB ? Потому что с помощью него, наглядно и легко можно динамически управлять пропускной способностью канала.
Вся идеология этого шейпера строится на классах. Описание классов производится с помощью простых текстовых файлов. Все правила по ограничению скорости лежать в них, эти файлы находятся в папке /etc/sysconfig/htb/
Скачайте скрипт htb.init с сайта sourceforge.
# wget http://sourceforge.net/projects/htbinit/files/HTB.init/0.8.5/htb.init-v0.8.5/download
# mv htb.init-v0.8.5 /etc/init.d/htb
# chmod 755 /etc/init.d/htb
Поставьте его в автозагрузку:
# chkconfig htb on
Создайте каталоги для конфигурации и кеша htb.init:
# mkdir -p /etc/sysconfig/htb
# mkdir -p /var/cache/htb.init
Перейдите в каталог конфигурации htb.ini:
# cd /etc/sysconfig/htb
Создадим корневой файл eth0:
# vi eth0
В нем впишем текст:
DEFAULT=20
Здесь строчка DEFAULT=20 задает параметр по которому будет учитыватся трафик не попадающий ни под одно правило шейпера.
Теперь создадим файл который будет описывать максимальную скорость этого интерфейса:
# vi eth0-2.full20mbit
Впишем в него текст:
RATE=20Mbit
CEIL=20Mbit
Здесь RATE описывает гарантированную пропускную способность, а CEIL описывает максимальную доступную скорость.
А теперь давайте займемся самими ограничениями (нарезкой канала).
Создадим файл eth0-2:10.ssh:
# vi eth0-2:10.ssh
RATE=128Kbit
CEIL=20Mbit
RULE=*:22
PRIO=1
BURST=128Kb
Здесь мы даем гарантированную ширину канала в 128Кбит для сервиса ssh.
Параметр RATE как раз описовывает эту скорость. Как и выше было написано CEIL это у нас максимальная доступная скорость если канал не нагружен.
Параметр как RULE описывает порт который нужно контролировать (наш сервис ssh).
Приоритет задается параметром PRIO, у нас он имеет наивысшое значение.
Создадим файл eth0-2:10.sip:
# vi eth0-2:15.sip
RATE=1Mbit
CEIL=3Mbit
RULE=*:5060
PRIO=1
Создадим файл eth0-2:11.contra:
# vi eth0-2:10.contra
RATE=3Mbit
CEIL=5Mbit
RULE=*:27015
PRIO=1
Создадим файл eth0-2:11.web:
# vi eth0-2:10.web
RATE=256Kbit
CEIL=20Mbit
RULE=*:80
LEAF=sfq
PRIO=1
Здесь параметр LEAF=sfq отвечает за равномерное распределение канала между участниками локальной сети, всем достанится по ровну.
# vi eth0-2:20.default
RATE=256Kbit
CEIL=20Mbit
LEAF=sfq
PRIO=5
Теперь займемся адаптером локальной сети eth1, здесь нет ограничений.
# vi eth1-2.full100mbit
RATE=100Mbit
CEIL=100Mbit
# vi eth1-2:10.localnet
RATE=10Kbit
CEIL=100Mbit
LEAF=sfq
RULE=192.168.50.0/24
PRIO=10
Последний шаг — запуск системы контроля трафика с помощью следующей команды:
# /sbin/htb.init start
Проверим работу шлюза, для этого возмем свободный компьютер с установленной Windows XP. В настройках сетевой карты пропишем:
IP адрес — 192.168.50.10
Маска — 255.255.255.0
Адрес шлюза — 192.168.50.2
DNS сервер — 217.15.11.11
Адрес DNS сервера берем провайдерский.
Откроем браузер и введем www.google.kz
Источники:
1. http://linuxportal.ru/print.php/87_0_3_0_M/
2. http://ras.pl.ua/howto_configure_htb_init_on_office_router/
3. http://linux-bash.ru/mseti/74-htb.html
4. http://www.opennet.ru/docs/RUS/iptables/
5. http://alexvolkov.ru/ustanovka-squid-na-centos.html
6. http://www.theadmin.ru/linux/centos/nastrojka-autentifikacii-squid-v-domene-windows-s-pomoshhyu-ntlm/

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