Версия для печати
Воскресенье, 06 Май 2012 22:19

Установка и настройка системы распределения трафика на базе Linux. Этап 3.

Автор
Оцените материал
(6 голосов)

Этап 3. Настройка фаервола. 

Для начала давайте скачаем и установим программу, которая нам существенно облегчит жизнь при прописывании правил в iptables — программу webmin. Перейдём на сайт http://www.webmin.com и скачаем эту программу в виде готового rpm-файла. Затем, установим его:

rpm -i webmin-1.520-1.noarch.rpm

Теперь, нужно подготовить iptables. Найдём файл /etc/sysctl.conf и поправим там одну строчку:

net.ipv4.ip_forward = 1

Также, сделаем вот такую команду:

echo "1" > /proc/sys/net/ipv4/ip_forward

Таким образом мы включили так называемый forwarding пакетов в iptables. Найдём, теперь, файл /etc/sysconfig/iptables-config. В нём тоже приведём соответствующую строчку вот в такой вид:

IPTABLES_MODULES="nf_conntrack_ftp ip_nat_ftp ip_queue"

Эти модули нам будут нужны. Вот теперь можно приступать к настройке Iptables. Вообще, эта программа, сама по себе, является целой наукой Улыбаюсь Однако, нам от неё нужно немногое. Нам нужно, чтоб iptables позволяла нашим рабочим станциям пользоваться такими элементарными вещами, как, например, электронная почта и ICQ. Давайте, попробуем это настроить. Откроем файл /etc/sysconfig/iptables и приведём его вот к такому виду:

*nat
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# для ICQ и почты
-A POSTROUTING -p tcp -m tcp -m multiport -o eth0 -j SNAT --to-source <IP-адрес интернет-сетевухи> --dports 5190,110,25
# для FTP
-A POSTROUTING -p tcp -m tcp -o eth0 --dport 21 -j SNAT --to-source <IP-адрес интернет-сетевухи>
# для DNS
-A POSTROUTING -p tcp -m tcp -o eth0 --dport 53 -j SNAT --to-source <IP-адрес интернет-сетевухи>
-A POSTROUTING -p udp -m udp -o eth0 --dport 53 -j SNAT --to-source <IP-адрес интернет-сетевухи>
COMMIT
*filter
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state -i lo --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Правилами ниже, мы открываем любой трафик на локальный интерфейс.
# Получается, что с локальной сети к серверу можно будет подключиться по любому порту,
# а вот по внешнему интерфейсу на сервер никто не залезет.
-A INPUT -i eth1 -j ACCEPT
-A INPUT -j DROP
# Правила ниже позволяют нам осуществлять тот самый форвординг, который мы недавно включили.
# Иными словами, благодаря этим правилам, рабочие станции могут «видеть» ресурсы за сервером.
# А вот уже какие адреса и по каким портам они будут «видеть» — это мы уже разрешили теми правилами выше.
-A FORWARD -m state -i lo --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth1 -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -j DROP
COMMIT
*mangle
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

После того, как вы отредактировали iptables, не забываем перезапустить сам сервис iptables. А после этого, давайте попробуем подключиться к серверу с помощью программы webmin. Открываем любой браузер и вводим http://192.168.1.100:10000, где 192.168.1.100 — локальный адрес вашего сервера. Выйдет запрос логина и пароля. Логином будет root, паролем будет пароль от root. После удачного входа систему нам раскроется нехилый web-интерфейс, с помощью которого можно делать весьма разнообразные манипуляции с сервером. Но нас в нём пока интересует лишь фаервол. Поэтому, в меню слева переходим Networking -> Linux Firewall. Вот здесь то мы и увидим, как в вебмине выглядят правила, которые мы прописали:

Вверху есть переключатель, на котором написано «Packet filtering (filter)». Это означает, что в данный момент нам отображается только таблица filter. Переключим его в «Network address translation (nat)». Теперь нам отобразится таблица nat. И именно здесь мы видим, по каким портам наши рабочие станции смогут «видеть» сеть за сервером:

Думаю, что дальнейшие правила гораздо удобнее будет создавать именно чрез webmin. Понажимав немного на разные кнопочки, полагаю, что вы разберётесь, как это делать.

Ну а теперь, приступим к установке и настройке NetAMS, который будет нам давать отчёт, сколько, откуда и куда у нас ушло трафика, ибо SAMS нам может давать такую информацию лишь по http-трафику. NetAMS, также, как и SAMS разработан отечественными разработчиками. Поэтому, перед тем, как будем всё делать, рекомендую почитать документацию на русском языке. К сожалению, уже готовой сборки под федору нету. Поэтому, эту программу, мы тоже будем собирать и устанавливать из исходников. Для начала, нам надо убедиться, что у нас установлены следующие пакеты:

mysql mysql-server mysql-libs mysql-devel httpd binutils cpp gcc gcc-c++ glibc-devel binutils libmms libpcap libpcap-devel libstdc++ iptables-devel glib2-devel perl-Net-Telnet perl-DBD-MySQL perl-DBI perl-CGI-Application.noarch perl-CGI-Application-Server.noarch perl-Date-Calc perl-GDGraph.noarch libdbi libcgi kernel-PAE-devel (в том случае, если у нас ядро PAE. Если нет, то просто kernel-devel)

Все эти пакеты можно утсановить из стандартных репозиториев Fedora, кроме одного: libmms. Чтобы установить libmms, нужно подключить репозиторий rpmfusion-free-updates. Чтобы это сделать, нужно ввести команду:

yum -y install http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm

И, если бы, у нас была Fedora 12, то можно было бы сразу же приступить к сборке и установке. Но, к сожалению, в Fedora 13 при сборке возникли некоторые проблемы, которые описаны тут. Поэтому, сейчас мы, немного, потанцуем с бубном. Скачаем исходники iptables:

yumdownloader --source iptables

Скачается src.rpm-файл с исходниками, который мы распакуем командой:

rpm2cpio iptables-1.4.7-2.fc13.src.rpm | cpio -idmuv --no-absolute-filenames

В текущий каталог извлекутся 4 файла, из которых нас интересует только iptables-1.4.7.tar.bz2, который и является исходниками iptables. Остальные можно удалить. Из этих исходников нам нужно собрать одну библиотечку, без которой не соберётся NetAMS. Делаем следующие команды:

tar xvf iptables-1.4.7.tar.bz2
cd iptables-1.4.7
./configure --enable-static --enable-libipq
make
cp libipq/.libs/libipq.a /usr/lib

Теперь, будем собирать NetAMS. Перейдём в какой-нибудь удобный для нас каталог и выполним вот такие команды:

wget http://www.netams.com/files/netams-3.4.5.tar.gz
tar xvfz netams-3.4.5.tar.gz
cd netams-3.4.5
./configure.sh

Обратим внимание, что, при конфигурации, у нас должно быть написано: «Will have LIBIPQ support» — это означает, что программа увидела библиотечку, которую мы вручную только что создали. Теперь надо внести небольшую правочку в файл Rules.make. Это, опять же, касается только федоры 13. На 12-ке у меня всё собиралось и без этого. Итак, находим в файле Rules.make вот такую строчку:

LIB += -pthread -lpcap

И правим её вот до такого вида:

LIB += -pthread -lpcap -lcrypt

Сохраняем и запускаем дальнейшую сборку и установку:

make
make install

Ну что ж, будем приступать к конфигурации нетамса. Я пользовался вот этой статьёй. Узнать о всех возможностях этой программы, опять же, предлагаю из документации. В папке /etc создаём файл с названием netams.conf и заполняем его вот таким содержимым:

#begin
#global variables configuration
debug none
language ru
user name admin real-name "admin" password <ваш пароль> permit all
# здесь, мы задали пользователя, который будет иметь доступ к администрированию netams

#services configuration

service server 0
login local
listen 20001
max-conn 6

service processor
lookup-delay 30
flow-lifetime 90
# Ниже, мы перечисляем так называемые политики, которые будут применяться к тому или иному объекту.
# По этим политикам будет идти учёт трафика.
policy name ip target proto ip
policy name tcp target proto tcp
policy name udp target proto udp
policy name udp_openvpn target proto udp port 1194
policy name tcp_openvpn target proto tcp port 1194
policy name www target proto tcp port 80:82 8080 3128
policy name messagers target proto tcp port 5190 2041 2042 2043 2044 5222 5223
policy name mail target proto tcp port 25 110
policy name ftp target proto tcp port 21 49152:65534
policy name t_dns target proto tcp port 53
policy name u_dns target proto udp port 53
policy name dns target policy-or t_dns u_dns
restrict all pass local pass
auto-units 1 type host naming prefix2 IP-
# А уже ниже, мы задаём инюты. Это те или иные объекты, к которым мы будем применять политики, которые насочиняли выше.
unit net name localnet ip 192.168.1.0/24 auto-units 1 acct-policy ip www messagers mail ftp
unit host name server ip <IP-адрес интернет-сетевухи> acct-policy ip www udp_openvpn tcp_openvpn
unit host name DC1 ip 192.168.1.200 acct-policy ip www messagers mail ftp dns
unit host name DC2 ip 192.168.1.201 acct-policy ip www messagers mail ftp dns
# Ниже, нетамс будет сам создавать юниты для наших рабочих станций в сети
# (через некоторое время эксплуатирования можете заглянуть в конфиг и посмотреть, как они будут выглядеть).
# Однако, если нам нужно, для некоторых рабочих станций сделать юниты вручную, то это делается здесь.
# Я написал пример для контроллеров домена, с которых мне интересен не только ip, www, messengers, mail и ftp трафик,
# но также и dns-трафик.

service storage 1
type mysql
user root
password <пароль рута на MySQL-сервер>
accept all

service data-source 1
type ip-traffic
source ipq
# Строчка ниже разрешает нетамсу распознавать url-адреса в пакетах, которые проходят через iptables.
layer7-detect urls
# NetAMS будет подставлять к правилам iptables свои правила, описанные ниже.
# Эти правила позволят нетамсу обрабатывать и вести учёт пакетов, проходящих через iptables.
rule 11 "INPUT -t mangle -p all -j QUEUE"
rule 22 "FORWARD -t mangle -p all -j QUEUE"
rule 33 "OUTPUT -t mangle -p all -j QUEUE"

service monitor 1
monitor to storage 1
# Здесь мы указываем юниты, которые хотим мониторить. По этим юнитам мы сможем смотреть детальную статистику:
# сколько, с каких хостов и по каким портам ушло/пришло трафика.
# Это дополнительная статистика к той, что будет показываться, исходя из настройки политик.
# Позже, я наглядно покажу, чем они отличаются. Если мы хотим знать такую информацию обо всех машинах в нашей сети,
# то просто подставляем сюда юнит localnet
monitor unit localnet

service html
path /var/www/netams/stat
run 2min
htaccess yes
client-pages all
account-pages none

service scheduler
# это задание будет сохранять конфиг каждые 5 минут.
# В нашем случае, это особенно полезно в первое время,
# когда конфиг начнёт заполняться автоматически созданными юнитами, про которые написано выше.
time 5min action "save"

#end

Сохраняем конфиг и переходим в папку /etc/init.d. Здесь нам надо разместить скрипт запуска и останова netams. К сожалению, разработчики NetAMS такой скрипт не предоставили. Но нашёлся добрый человек, который его написал, за что ему огромное человеческое спасибо! Вот сайт этого человека:

http://www.it2k.ru

А вот ссылка на скрипт с его же сайта:

http://www.it2k.ru/wp-content/uploads/2011/03/netams-startup.zip

Повторюсь, что этот скрипт надо разместить в каталог /etc/init.d. Для себя, я в этом скрипте подправил путь к своему конфигу Итак, вот содержимое скрипта:

#!/bin/sh
# NeTAMS        Startup shell script for NeTAMS 
# 
# chkconfig: 2345 70 30 
# description:  NeTAMS (Network Traffic Accounting and Management Software) 
#               Daemon for accounting network traffic data. 
#
# Zuskin Egor 

. /etc/init.d/functions

prog=Netams
DAEMONDIR=/usr/local/sbin
CONFIG=/etc/netams.conf
PID_FILE=/var/run/netams.pid

RETVAL=0

start() {
	echo -n $"Starting $prog: "
	if [ ! -f $PID_FILE ]; then
		if [ -f $CONFIG ]; then
			if [ -f $DAEMONDIR/netams ]; then
				daemon --pidfile=$PID_FILE $DAEMONDIR/netams -qlf $CONFIG
				RETVAL=$?
				echo
				return $RETVAL
			else
				echo -n $"$DAEMONDIR/netams does not exist."
				failure
				echo
				return 1		
			fi
		else
			echo -n $"$CONFIG does not exist."
			failure
			echo
			return 1
		fi	    
	else        
		echo -n $"$prog is loaded"
		failure
		echo
		return 1
	fi
	return $RETVAL
}       

stop() {
	echo -n $"Stopping $prog:"
	killproc -p $PID_FILE -d 10 $DAEMONDIR/netams
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f $PID_FILE
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		stop
		start
		RETVAL=$?
		;;
	status)
		status netams
		RETVAL=$?
		;;        
	*)
		echo $"Usage: $0 {start|stop|restart|status}"
		exit 1
esac

exit $RETVAL

Cохраним его, сделаем исполняемым и поместим в автозапуск:

chmod +x netams
chkconfig netams on

Далее, нам нужно кое-что подправить в конфиге apache и кое-что подправить cgi-скиптах самого нетамса для того, чтобы видеть статистику. Откроем файл /etc/httpd/conf/httpd.conf и раскомментируем в нём следующую строчку:

AddHandler cgi-script .cgi

Затем, в конец конфига добавьте вот это:

<Location "/netams">
Options FollowSymLinks MultiViews
DefaultLanguage ru
AddDefaultCharset WINDOWS-1251

Order Deny,Allow
# запрет для всех на доступ к ресурсу отовсюду,
Deny from all
# кроме локальных адресов
Allow from 192.168.1.0/24

#AuthName "For admins"
#AuthType Basic
#AuthUserFile /var/www/.htpasswd
#require valid-user
# эти строчки тут не зря. Мы их раскоментируем позже.
</Location>

<Location /netams/cgi-bin>
Options FollowSymLinks MultiViews ExecCGI
DefaultLanguage ru
AddDefaultCharset WINDOWS-1251
</Location>

<Location /netams/stat>
Options FollowSymLinks MultiViews ExecCGI
DefaultLanguage ru
AddDefaultCharset WINDOWS-1251

Order Deny,Allow
# запрет для всех на доступ к ресурсу отовсюду,
Deny from all
# кроме локальных адресов
Allow from 192.168.1.0/24
</Location>

<Location "/sams">
Order Deny,Allow
# запрет для всех на доступ к ресурсу отовсюду,
Deny from all
# кроме локальных адресов
Allow from 192.168.1.0/24
</Location>

После чего, перезапустим апач командой:

service httpd restart

Для дого, чтобы подправить cgi-скрипты самого нетамса, пройдём в каталог: /var/www/netams/cgi-bin , откроем файл admintool.cgi , найдём в нём строчку «use CGI qw/:standard/;» и над ней добавим строчку вот такую:

$sc_host="localhost"; $sc_port=20001; $sc_user="admin"; $sc_passwd="ваш_пароль_администратора_нетамс";

Сохраним и скопируем этот файл в каталог /var/www/netams/stat. Затем, в каталоге /var/www/netams/cgi-bin откроем файл config.cgi и заполним там, в соответствии с нашими данными, следующие поля:

$sc_passwd="ваш_пароль_администратора_нетамс";
$sql_password="ваш_пароль_рута_на_mysql";

Точно также отредактируем и файл /var/www/netams/cgi-bin/admin/config.cgi

Теперь, для того, чтобы на страничку NetAMS можно было зайти по адресу http://192.168.1.100/netams , создадим символическую ссылку в каталоге /var/www/html, выполнив команду:

ln -s /var/www/netams /var/www/html/netams

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

service netams start

Затем, посмотрим вывод команды:

ps -eafw | grep netams

И если видим что-то вроде:

root 17604 1 1 17:56 ? 00:00:00 /usr/local/sbin/netams -qlf /etc/netams.conf
root 17702 2202 0 17:58 pts/1 00:00:00 grep netams

Значит, netams стартовал. Теперь, давайте посмотрим, подставил ли нетамс свои три правила к правилам iptables:

iptables -t mangle -nL

Если в появившемся списке мы наблюдаем правила:

Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain INPUT (policy ACCEPT)
target prot opt source destination
QUEUE all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target prot opt source destination
QUEUE all -- 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
QUEUE all -- 0.0.0.0/0 0.0.0.0/0

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

То значит всё в порядке. Попробуем подключиться к NetAMS с помощью telnet:

telnet localhost 20001

Вводим логин admin и пароль администратора нетамс. Далее вводим команды «html», «show config», «show version», «save». Выходим из telnet командой «quit» и перезапускаем NetAMS. (чтобы произошла корректная привязка сгенерированных OID юнитов к базе данных). Теперь, давайте попробуем зайти на страничку http://192.168.1.100/netams . И если перед вами открылась вот такая картинка:

В которой корректно отражены дата, время, название машины, номер версии программы, то мы всё сделали правильно. Остался только один небольшой нюанс: Эту страничку, по идее, должен видеть только системный администратор, а точнее, доступ к ней должен быть только у системного администратора. Поэтому, мы сейчас защитим эту страничку паролем. Для этого, перейдём в каталог /var/www и выполним команду:

htpasswd -cm .htpasswd admin

Программка попросит придумать и ввести свой пароль. После того, как это сделаете, появится файл ./htpasswd. Теперь, чтоб его применить, снова откроем файл /etc/httpd/conf/httpd.conf. Найдём в нём строчки, которые мы специально оставили закомментированными и раскомментируем их:

AuthName "For admins"
AuthType Basic
AuthUserFile /var/www/.htpasswd
require valid-user

Сохраним конфиг и перезапустим демон httpd. Потом снова попробуем зайти на страничку нетамса http://192.168.1.100/netams, перезапустив, при этом, браузер. И вот теперь, чтоб на неё попасть, нужно ввести пароль! И это правильно.

Как я уже и описывал выше, именно Netams, при своём старте, добавляет к существующим правилам iptables три вот такие строчки:

-A INPUT -t mangle -p all -j QUEUE
-A FORWARD -t mangle -p all -j QUEUE
-A OUTPUT -t mangle -p all -j QUEUE

Поэтому, если перезапустить iptables, то эти правила сбросятся, и нетамс не будет получать пакеты для обработки. Из-за чего, нам пришлось бы перезапускать netams вручную после каждого манипулирования с правилами iptables. Однако, Webmin (в случае, если мы редактируем правила через него) нас от этого избавит. В настройке модуля межсетевого экрана (module Linux Firewall) есть опция "Command to run after applying configuration", в которую мы благополучно забьём команду "service netams restart".

Последнее, в чём нам надо подстраховаться — это в том, чтобы SQL-базы нетамса не разрастались до необъятных размеров. Давайте перейдём, например, в папку /home и создадим там файлик под названием, например, clearnetams. Заполним его вот таким содержимым:

#!/bin/bash
mysql netams -e "delete from raw where t_to < unix_timestamp(date_add(now(), interval -3 MONTH));" -u root --password=<пароль рута на MySQL-сервер>
mysql netams -e "delete from monitor where time < unix_timestamp(date_add(now(), interval -3 MONTH));" -u root --password=<пароль рута на MySQL-сервер>
mysql netams -e "delete from summary where t_from < unix_timestamp(date_add(now(), interval -3 MONTH));" -u root --password=<пароль рута на MySQL-сервер>

Сделаем его исполняемым:

chmod +x clearnetams

Этот скрипт будет убивать записи старше 3 месяцев в трёх самых жирных mysql-базах нетамса. Если вас не устраивает, чтоб убивались записи старше 3 месяцев, то можете поменять в параметре «interval -3 MONTH» цифру 3 на нужную вам. Для того, чтобы такая процедура срабатывала систематично, нужно в каталоге /root создать файлик с именем, например, «cron_netams» и заполнить его вот таким содержимым:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

0 0 1 1-12 * /home/clearnetams

А затем, надо набрать команду:

crontab /root/cron_netams

После этого, в каталоге /var/spool/cron будет создан файл "root" с таким же содержимым, что и файл /root/cron_netams. Это означает о том, что в каждый первый день каждого месяца в 0:00 будет запускаться скрипт clearnetams и чистить базы нетамс от старых записей.
Что ж, на этом установка и настройка нетамса закончена. Сейчас, я просто хочу наглядно показать, чем отличается общая статистика, от статистики по конкретному юниту. Когда вы заходите на страничку нетамса, то вначале, вам выводится меню, и, если вы в течение нескольких секунд, не сделали выбор, то программа вас автоматически перебрасывает на страничку основной статистики, которая выглядит вот так, как на рисунке выше. Для того, чтобы посмотреть цифры всех юнитов, нам надо щёлкнуть на ссылочку 18-19 (в моём случае. У вас время может быть и другим. Вобщем ткнуть на ссылку с самым последним временем). И тогда вы увидите информацию о трафике (щёлкайте на «expand policies» возле каждого юнита):

Думаю, объяснять не надо, что тут к чему.

А если мы, когда нам будет показано меню при заходе в нетамс, выберем «Administration interface», а затем, перейдём в пункт «monitor», то нам откроется, с первого взгляда, что-то очень непонятное Улыбаюсь Я, в начале, долго тыкался, чтоб понять, как этим пользоваться. И рассказывать подробно щас лень. Вкратце покажу, что если понажимать все кнопочки «обновить то-то, то-то...», затем выделить юнит, который мы указали в конфиге в блоке мониторинга, и выставить крыжики и менюшки вот таким образом:

 После чего нажать внизу на кнопку «report_ip», то мы увидим вот такую подробную картинку о том, сколько трафика, куда и по каким портам ушло с адреса 192.168.1.116 (юнит под названием 116):

Причём, тут отображается весь трафик, а не только тот, что задан политиками в конфиге. 

Этап 4. Настройка ВПН между двумя офисами.

Вернуться обратно на:
Этап 1
Этап 2

Прочитано 13938 раз Последнее изменение Воскресенье, 04 Ноябрь 2012 15:50
Николай