Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
03:15, 28 марта 2012

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

Blog post image

Введение

Предлагаю свой вариант настройки шлюза для доступа в Интернет на основе связки CentOS + squid + sarg + iptables + HTB.init. Данное решение подойдет для малой компании.

С помощью Интернет шлюза в локальной сети можно раздавать Интернет, фильтровать сайты, резать скорость доступа во всемирную паутину, формировать отчеты кто куда ходил на какие сайты, ну и самое главное, программное обеспечение из которого строится такой шлюз - бесплатно. Поэтому в организациях где боятся пиратского ПО, желательно ставить Linux.

Данная записка устарела, так как вышла CentOS 7, предлагаю ознакомиться с новой запиской http://yvision.kz/post/461594

   

Краткое содержание

1. Кирпичики из которых построен шлюз

2. Вводные данные

3. Установка операционной системы CentOS 6.5 x64

4. Настройка сетевых адаптеров

5. Установка и базовая настройка Squid

6. Установка анализатора логов Sarg

7. Настройка firewall

8. Установка и настройка шейпера HTB.init

9. Установка и настройка кэширующего DNS сервера

10. Проверка Интернет доступа

11. Установка и настройка DHCP сервера

12. Источники информации

     

1. Кирпичики из которых построен шлюз

 

Связка состоит из:

  • Squid - кэширующий прокси сервер работающий по протоколу http/ftp
  • Sarg - анализатор логов для Squid (у этой программы есть аналоги: Free-SA и LightSquid)
  • iptables - утилита для настройки встроенного фаервола
  • HTB.init - полезный скрипт, шейпер трафика (нарезка канала)
   

2. Вводные данные

 

Здесь описаны данные которые понадобятся при настройке в моих примерах:

  • 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 - локалка
   

3. Установка операционной системы CentOS 6.6 x64

 

Если у вас не установлена операционная система CentOS 6 x64, установите ее. Образ этой операционной системы лежит на следующих ftp серверах:

http://mirror.neolabs.kz/centos/6.6/isos/x86_64/CentOS-6.6-x86_64-bin-DVD1.iso

или

http://mirror.yandex.ru/centos/6.6/isos/x86_64/CentOS-6.6-x86_64-bin-DVD1.iso

Я устанавливал эту систему в минимальной установке.

Теперь когда система установлена, первым делом настройте сетевые адаптеры.

   

4. Настройка сетевых адаптеров

 

У нас сервер играет роль шлюза в Интернет, поэтому он должен иметь два сетевых адаптера.

Операционная система CentOS по умолчанию, дает установленным сетевым картам имена "ifcfg-eth0" и "ifcfg-eth1". В итоге у вас будет два файла:

  • /etc/sysconfig/network-scripts/ifcfg-eth0
  • /etc/sysconfig/network-scripts/ifcfg-eth1

Система Windows адаптеры например обзывает как "Сетевое Подключение по Локальной сети 1" и "Сетевое подключение по Локальной сети 2"

Настройка сетевых адаптеров производится путем редактирования файлов /etc/sysconfig/network-scripts/ifcfg-ethX

В нашем случае этих файлов два, так как сервер имеет всего два сетевых установленных интерфейса.

Откроем первый файл, который отвечает за первый адаптер. Подключим этот интерфейс к Интернету.

# 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.1
IPADDR=10.168.50.2
PREFIX=24
BROADCAST=10.168.50.255
DNS1=217.15.11.11

Жирным шрифтом, я пометил свои изменения, которые произвел в этом файле.

Теперь пришла очередь второго файла, отвечающего за сетевую карту подключенную в локальную сеть.

# 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

Как  только мы настроили сетевую часть, можно непосредственно приступать к настройке прокси сервера.

   

5. Установка и базовая настройка Squid

   

Установим и не много настроим Squid.

# yum install squid -y

Прокси сервер Squid установлен, настроим его под наши скромные нужды, включим прозрачный режим. Открываем файл /etc/squid/squid.conf

# vi /etc/squid/squid.conf

Найти в нем строчку:

http_port 3128

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

transparent

Получится так:

http_port 3128 transparent

Детальную настройку производить не будем, так как нам нужно просто добиться нормальной работы шлюза.

Поставим службу прокси сервера в автозагрузку:

# chkconfig squid on

Запустим его:

# service squid start

Установим вспомогательные пакеты, такие как веб сервер "Apache", утилиту закачки файлов "wget".

# yum install httpd wget gd system-config-firewall-tui mc setuptool -y

Разрешим пересылку пакетов через наш шлюз:

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

Применим новую настройку без перезагрузки:

# sysctl -p

Пришла очередь анализатора логов, займемся установкой Sarg.

   

6. Установка анализатора логов 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 httpd on

# service httpd start

Запустим Sarg в тестовом режиме:

# sarg -x

Здесь мы запустили Sarg в отладочном режиме, на экран будет выведено много информации для отладки. Если в процессе тестового запуска будут ошибки, значить надо устранить проблемы и запустить отладку еще раз. Если все хорошо, вы увидите отчет в директории /var/www/sarg/. Также этот отчет можно посмотреть введя в браузере http://IP/sarg

Blog post image

   

7. Настройка firewall

   

Настройка фаерволла должна идти по следующей последовательности:

1. Чистка всех цепочек

2. Закрыть все и вся. (DROP)

3. Пропускать все уже инициированные и их дочерние соединения.

4. Локальные разрешить.

5. Форвардинг.

6. Пишем что открыть, пробросить и другие свои дополнительные правила  и  т. п.

Итого смотря на эту последовательность, становится ясно как настраивает правильно фаервол.

Осталось настроить фаервол и шейпер. Но для начала надо отключить:

  • Встроенную цепочку iptables - RH-INPUT

Отключаем встроенную цепочку "RH-Input":

# setup

Firewall Configuration -> Убрать звездочку -> OK -> YES-> QUIT

Blog post image

Для настройки фаервола, создайте файл /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

#Пропускать инициированные, а также их дочерние с локалки наружу - пересылка

iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Включаем корректировку MSS (максимальный размер сегмента), чтобы не было фрагментации пакетов. Необходима из за разных значений MTU

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#Разрешаем обращение к 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 из нашей локальной сети

iptables -A FORWARD -i eth1 -s 192.168.50.0/24 -p tcp -m multiport --dports 21,22,25,110,143,443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Разрешаем DNS запросы по протоколу UDP и TCP из нашей локальной сети

iptables -A FORWARD -i eth1 -s 192.168.50.0/24 -p udp -m multiport --dports 53 -j ACCEPT

iptables -A FORWARD -i eth1 -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 PREROUTING -p tcp -m tcp -s 10.168.50.0/255.255.255.0 --dport 80 -j DNAT --to-destination 10.168.50.2:3128

iptables -t nat -A POSTROUTING -s 192.168.50.0/255.255.255.0 -j SNAT --to-source 10.168.50.2

 

Вставляем наш скрипт в автозагрузку:

# 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.init.

   

8. Установка и настройка шейпера HTB.init

   

У нас два интерфейса на роутере, один который зовется eth0 подключен к Интернету, провайдер по нему дает следующие скорости  20 мбит на входящий и 10 мбит на исходящий трафик.

Сетевая карта под именем eth1 подключена в локальную сеть, скорость ее работы 100 мбит.

Наша задача решить с помощью шейпера следующее:

* отдельная полоса для таких сервисов как ssh, http и игрового трафика (CS 1.6).

* разделение канала поровну между машинами

Скрипт HTB.init задействует утилиту tc. Почему используют HTB.init ? Потому что с помощью него, наглядно и легко можно динамически управлять пропускной способностью канала.

Вся идеология этого шейпера строится на классах. Описание классов производится с помощью простых текстовых файлов. Все правила по ограничению скорости лежать в них, эти файлы находятся в папке /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

Создайте каталог для конфигурации:

# mkdir -p /etc/sysconfig/htb

 

Перейдите в каталог конфигурации htb.init:

# cd /etc/sysconfig/htb

 

Настроим скорость входящего трафика для локальной сети - адаптер eth1

Создадим корневой  файл eth1:

# vi eth1

В нем впишем текст:

DEFAULT=20

Здесь строчка DEFAULT=20 задает параметр по которому будет учитываться трафик не попадающий ни под одно правило шейпера.

Теперь создадим файл который будет описывать максимальную скорость этого интерфейса:

# vi eth1-2.full20mbit

Впишем в него текст:

RATE=20Mbit

CEIL=20Mbit

Здесь RATE описывает гарантированную пропускную способность, а CEIL описывает максимальную доступную скорость.

А теперь давайте займемся самими ограничениями (нарезкой канала).

Создадим файл eth1-2:10.ssh:

# vi eth1-2:10.ssh

RATE=128Kbit

CEIL=20Mbit

RULE=*:22

PRIO=1

BURST=128Kb

Здесь мы даем гарантированную ширину канала в 128Кбит для сервиса ssh.

Параметр RATE как раз описывает эту скорость. Как и выше было написано CEIL это у нас максимальная доступная скорость если канал не нагружен.

Параметр как RULE описывает порт который нужно контролировать (наш сервис ssh).

Приоритет задается параметром PRIO, у нас он имеет наивысшее значение.

Создадим файл eth1-2:11.contra:

# vi eth1-2:10.contra

RATE=3Mbit

CEIL=5Mbit

RULE=*:27015

PRIO=1

 

Создадим файл eth1-2:11.web:

# vi eth1-2:10.web

RATE=256Kbit

CEIL=20Mbit

RULE=*:3128

LEAF=sfq

PRIO=1

 

Здесь параметр LEAF=sfq  отвечает за равномерное распределение канала между участниками локальной сети, всем достанется поровну.

# vi eth1-2:20.default

RATE=256Kbit

CEIL=20Mbit

LEAF=sfq

PRIO=5

 

Настроим скорость исходящего трафика

Теперь займемся адаптером внешней сети eth0, здесь нет ограничений.

# vi eth0-2.full10mbit

RATE=10Mbit

CEIL=10Mbit

# vi eth0-2:10.localnet

RATE=10Kbit
CEIL=10Mbit
LEAF=sfq
RULE=192.168.50.0/24
PRIO=10

Последний шаг - запуск системы контроля трафика с помощью следующей команды:

# service htb compile

# service htb start

При запуске HTB выйдет окошко с ошибкой:

find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

Так как ошибка не критичная, и не влияет на работу скрипт, на нее можно не обращать внимания.

Если вы еще не поставили демон в автозагрузку:

# chkconfig htb on

   

9. Установка и настройка кэширующего DNS сервера

   

Установим пакет Bind, который позволит добавить функцию кэширующего DNS сервера на наш шлюз:

# yum install bind -y

Поставим его в автозагрузку:

# chkconfig named on

Настроим его, откроем файл /etc/named.conf

# vi /etc/named.conf

# Прописываем IP адрес который будет слушаться

options {listen-on port 53 { 127.0.0.1; 192.168.50.2;};

# Добавляем строчку и указываем DNS провайдера

forwarders { 217.15.11.11;};

# Указываем кому разрешено брать DNS запросы

allow-query { localhost; 192.168.50.0/24; };

Запускаем службу named:

# service named start

   

10. Проверка Интернет доступа

   

Проверим работу шлюза, для этого возьмем свободный компьютер с установленной Windows XP в нашей локальной сети. В настройках сетевой карты пропишем:

IP адрес - 192.168.50.10

Маска  - 255.255.255.0

Адрес шлюза - 192.168.50.2

DNS сервер - 192.168.50.2 или DNS провайдера - 217.15.11.11

 

Адрес DNS сервера берем нашего шлюза или провайдерский.

Blog post image

Откроем браузер и введем www.google.kz

   

11. Установка и настройка DHCP сервера

   

Чтобы не настраивать всем компьютерам сетевые платы, установим DHCP сервер, который будет автоматически проставляь нужные IP адреса:

# yum install dhcp -y

Создаем конфигурационный файл /etc/dhcp/dhcpd.conf

# Отключаем динамическое обновление DNS

ddns-update-style      none;

# Адрес локальной сети где буду раздаваться адреса

subnet 192.168.50.0 netmask 255.255.255.0 {

# Не обязательные параметры

# Время аренды в секундах

default-lease-time     600;

# Максимальное время аренды в секундах

max-lease-time         7200;

# Параметры передаваемые dhcp-клиентам

# Маска подсети

option subnet-mask 255.255.255.0;

# Адрес широковещательной   рассылки

option broadcast-address 192.168.50.255;

# Адрес шлюза

option routers 192.168.50.2;

# Список DNS-серверов через запятую

option domain-name-servers 192.168.50.2,217.15.11.11;

range 192.168.50.50 192.168.50.254; # Область выдаваемых адресов

}

Запускаем серверную службу DHCP:

# service dhcpd start

Ставим службу в автозагрузку:

# chkconfig dhcpd on

   

12. Источники информации

 

В записке использовалась информация со следующих сайтов:

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/

7. http://www.alsigned.ru/?p=462

 
0