Введение
Предлагаю свой вариант настройки шлюза для доступа в Интернет на основе связки 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
7. Настройка firewall
Настройка фаерволла должна идти по следующей последовательности:
1. Чистка всех цепочек
2. Закрыть все и вся. (DROP)
3. Пропускать все уже инициированные и их дочерние соединения.
4. Локальные разрешить.
5. Форвардинг.
6. Пишем что открыть, пробросить и другие свои дополнительные правила и т. п.
Итого смотря на эту последовательность, становится ясно как настраивает правильно фаервол.
Осталось настроить фаервол и шейпер. Но для начала надо отключить:
- Встроенную цепочку iptables - RH-INPUT
Отключаем встроенную цепочку "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#Пропускать инициированные, а также их дочерние с локалки наружу - пересылка
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=10KbitCEIL=10MbitLEAF=sfqRULE=192.168.50.0/24PRIO=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 сервера берем нашего шлюза или провайдерский.
Откроем браузер и введем 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