PDA

Просмотр полной версии : Оптимальная настройка iptables для сервера



ZorroX
22.07.2009, 18:34
Нашел кучу настроек для домашнего компьютера, а вот для сервера - 0. Ситуация такая сервер, где расположены форум и еще некоторые ресурсы в лок. сети провайдер. eth0 - домашняя сеть (комп с виндой выходит в интернет через сервер с линуксом через NAT), eth1 сеть провайдера. Необходимо защитить сервер (ресурсы) от атак и прочего, при этом учитывая, что это сервер, где расположены общедоступные ресурсы, и через него выходит в интернет (NAT) другой комп. Буду очень признателен, если кто напишет хотя бы примерный файл с правилами для iptables. Уровень защиты особо сильный не нужен, т.к. сервер подключен только к локальной сети, внешка же отключена.

mr.L
14.08.2009, 06:42
читайте man и howto и пользуйтесь /dev/hands.

Используется только IPTABLES и bash.
Конфигурация:
RH 8.0 - Server/Firewall and etc
eth0 - смотрит наружу IP: 192.168.0.10
eth1- смотрит в мою local'ку IP: 10.0.0.1
В local'ке две машины Workstation and Laptop, иногда брат приезжает с третьей машиной, будем называть его OTHER.
За основу взяты некоторые scripts публично доступные.

1. Нужно считать трафик TCP как INBOUND так и OUTBOUND.
2. Трафик с провайдерской сеткой.
3. Траффик с интернетом.
4. Ну и конечно сколько жрет внешнего трафика каждая машина.

Поехали:
Начнем с того что надо вставить пару строчек (не совсем пару но кто хочет может вынести их в отдельный файл) в ваш script который настраивает iptables.

1. Переменные используемые в скрипте firwall'а:
IPTABLES="/sbin/iptables"
# 1.1 Your external device
INET_IP="192.168.0.10"
INET_IFACE="eth0"
# 1.2 Internet Service Provider's Network
ISP_IP="192.168.0.1"
ISP_IP_RANGE="192.168.0.0/24"
# Local Area Network configuration.
# your LAN's IP range and localnet host's IP. /24 means to only use the first 24
# bits of the 32 bit IP address. the same as netmask 255.255.255.0
LAN_IP="10.0.0.1"
LAN_IP_RANGE="10.0.0.0/24"
LAN_IFACE="eth1"
LAN_IP_WORKSTATION="10.0.0.11"
LAN_IP_LAPTOP="10.0.0.10"

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

2. Настраиваем chains/цепочки INPUT, OUTPUT and FORWARD чтобы отобрать трафика который нас интересует. По команде -j RETURN в цепочках для расчета траффика, пакет вернется на следующее правило которое следует за нашими правилами для INPUT, OUTPUT и FORWARD. Так что не волнуйтесь мышь не проскочит. Эти правила должны стоять первыми в своих цепочках.
# Перенаправляем трафик входящий с внешнего устройства
$IPTABLES -A INPUT -d $INET_IP -i $INET_IFACE -j TRAFFIC
# Перенаправляем трафик локальной сети
$IPTABLES -A FORWARD -o $LAN_IFACE -d $LAN_IP_RANGE -j TRAFFIC_FW
$IPTABLES -A FORWARD -s $LAN_IP_RANGE -o $INET_IFACE -j TRAFFIC_FW
# Перенаправляем трафик исходящий с внешнего устройства
$IPTABLES -A OUTPUT -s $INET_IP -o $INET_IFACE -j TRAFFIC

3. Далее настраиваем chains/цепочки которые будем использовать для расчета трафика
# Create separate chains for TRAFFIC Counter
$IPTABLES -N TRAFFIC
# Для трафика с localnet
$IPTABLES -N TRAFFIC_FW
# Для IN трафика вашего сервера
$IPTABLES -N TRAFFIC_TCP_INBOUND
# Для OUT трафика вашего сервера
$IPTABLES -N TRAFFIC_TCP_OUTBOUND
# Your overall INBOUND and OUTBOUND traffic with external network except ISP ip range
# Ваш INBOUND and OUTBOUND traffic с внешней сетью за исключением провайдерской подсети
$IPTABLES -N TRAFFIC_TCP_INBOUND_EXT
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_EXT
# Your overall INBOUND and OUTBOUND traffic with ISP network
# Ваш INBOUND and OUTBOUND traffic с провайдерской подсетью
$IPTABLES -N TRAFFIC_TCP_INBOUND_ISP
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_ISP
# Your overall INBOUND and OUTBOUND traffic of your server
$IPTABLES -N TRAFFIC_TCP_INBOUND_SERVER
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_SERVER
# Your overall INBOUND and OUTBOUND traffic of your local network
$IPTABLES -N TRAFFIC_TCP_INBOUND_FRWD
$IPTABLES -N TRAFFIC_TCP_INBOUND_WS
$IPTABLES -N TRAFFIC_TCP_INBOUND_LAPTOP
$IPTABLES -N TRAFFIC_TCP_INBOUND_LNET
#
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_FRWD
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_WS
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_LAPTOP
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_LNET

4. Далее настраиваем chains/цепочки чтобы они работали так как нам нужно и разбрасывали трафик по подцепочкам (Будьте внимательны не все команды уместились на одной строке)

#
# Create content for TRAFFIC chains
#************************************************* ********** *****
# Основная цепочка, здесь фильтруется трафик для сервера на IN and OUT
$IPTABLES -A TRAFFIC -p tcp -d $INET_IP -i $INET_IFACE -j TRAFFIC_TCP_INBOUND
$IPTABLES -A TRAFFIC -p tcp -s $INET_IP -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND
$IPTABLES -A TRAFFIC -j RETURN
# Основная цепочка здесь фильтруется трафик для localnetwork на IN and OUT
$IPTABLES -A TRAFFIC_FW -p tcp -d $LAN_IP_RANGE -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_FRWD
$IPTABLES -A TRAFFIC_FW -p tcp -s $LAN_IP_RANGE -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_FRWD
$IPTABLES -A TRAFFIC_FW -j RETURN



# Исходящий трафик с localnetwork
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_LAPTOP -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_LAPTOP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_WORKSTATION -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_WS
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_RANGE -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_LNET
# Redirect для подсчета трафика для ISP и Internet
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_RANGE -o $INET_IFACE -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_RANGE -o $INET_IFACE ! -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -j RETURN
# Исходящий трафик с Work Station
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_WS -j RETURN
# Исходящий трафик с Laptop
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_LAPTOP -j RETURN
# Исходящий трафик с OTHER т.е. весь оставшийся
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_LNET -j RETURN

# Исходящий трафик с Server/Firewall
# Redirect для подсчета траффика для ISP и Internet
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -s $INET_IP -o $INET_IFACE -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -s $INET_IP -o $INET_IFACE ! -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -s $INET_IP -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_SERVER
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -j RETURN

# Трафик предназначенный для ISP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_ISP -j RETURN
# Трафик предназначенный для Internet
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_EXT -j RETURN
# Исходящий трафик с Server/Firewall
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_SERVER -j RETURN



# Входящий трафик на Server/Firewall
# Redirect для подсчета трафика от ISP и Internet
$IPTABLES -A TRAFFIC_TCP_INBOUND -d $INET_IP -i $INET_IFACE -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_INBOUND -d $INET_IP -i $INET_IFACE ! -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_INBOUND -d $INET_IP -i $INET_IFACE -j TRAFFIC_TCP_INBOUND_SERVER
$IPTABLES -A TRAFFIC_TCP_INBOUND -j RETURN
# От ISP
$IPTABLES -A TRAFFIC_TCP_INBOUND_ISP -j RETURN
# От Internet
$IPTABLES -A TRAFFIC_TCP_INBOUND_EXT -j RETURN
# Входящий трафик на Server/Firewall
$IPTABLES -A TRAFFIC_TCP_INBOUND_SERVER -j RETURN

# Входящий трафик на localnetwork
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_LAPTOP -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_LAPTOP
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_WORKSTATION -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_WS
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_RANGE -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_LNET
# Redirect для подсчета трафика от ISP и Internet
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_RANGE -o $LAN_IFACE -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_RANGE -o $LAN_IFACE ! -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -j RETURN
# Входящий трафик на Workstation
$IPTABLES -A TRAFFIC_TCP_INBOUND_WS -j RETURN
# Входящий трафик на Laptop
$IPTABLES -A TRAFFIC_TCP_INBOUND_LAPTOP -j RETURN
# Входящий трафик на OTHER т.е. все отальные
$IPTABLES -A TRAFFIC_TCP_INBOUND_LNET -j RETURN

С настройками iptables покончено

5. Далее пишем скрипт который выполняется cron/кроном он будет запрашивать iptables, подсчитывать и выводить отчеты по трафику либо на /dev/stdout либо в файл путь к которому указывается в начале скрипта.
Пример команды запуска скрипта: /sbin/traflog -s -p
Данная команда выводит на /dev/stdout статистику для вашего сервера.
( Будте внимательны Вывод в файл по умолчанию. )

#!/bin/sh
#
# traflog - logger of iptable's statistic
#
# Path to your system iptables
IPTABLES="/sbin/iptables"
# Path to dir with log output
F_PATH="/var/log/firewall/traflog"
#
# Files have names like 'YearMonthDate . whose trafic
F_LNET="$F_PATH/"`date +"%Y%m%d"`".lnet"
F_SERV="$F_PATH/"`date +"%Y%m%d"`".serv"
F_OVER="$F_PATH/"`date +"%Y%m%d"`".over"
F_ALL="$F_PATH/"`date +"%Y%m%d"`".all"

LAPTOP_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_LAPTOP -v -x -n | grep RETURN | head -c 18 | tail -c 9`
WS_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_WS -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_LNET -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_ISP_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_INBOUND_ISP | head -c 18 | tail -c 9`
LNET_EXT_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_INBOUND_EXT | head -c 18 | tail -c 9`

LAPTOP_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_LAPTOP -v -x -n | grep RETURN | head -c 18 | tail -c 9`
WS_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_WS -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_LNET -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_ISP_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_OUTBOUND_ISP | head -c 18 | tail -c 9`
LNET_EXT_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_OUTBOUND_EXT | head -c 18 | tail -c 9`

SERVER_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_SERVER -v -x -n | grep RETURN | head -c 18 | tail -c 9`
SERVER_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_SERVER -v -x -n | grep RETURN | head -c 18 | tail -c 9`
SERVER_ISP_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND -v -x -n | grep TRAFFIC_TCP_INBOUND_ISP | head -c 18 | tail -c 9`
SERVER_ISP_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND -v -x -n | grep TRAFFIC_TCP_OUTBOUND_ISP | head -c 18 | tail -c 9`
SERVER_EXT_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND -v -x -n | grep TRAFFIC_TCP_INBOUND_EXT | head -c 18 | tail -c 9`
SERVER_EXT_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND -v -x -n | grep TRAFFIC_TCP_OUTBOUND_EXT | head -c 18 | tail -c 9`

SERVER_OVR_IN=`expr $SERVER_EXT_IN + $SERVER_ISP_IN`
SERVER_OVR_OUT=`expr $SERVER_EXT_OUT + $SERVER_ISP_OUT`

OVR_ISP_IN=`expr $LNET_ISP_IN + $SERVER_ISP_IN`
OVR_ISP_OUT=`expr $LNET_ISP_OUT + $SERVER_ISP_OUT`
OVR_EXT_IN=`expr $LNET_EXT_IN + $SERVER_EXT_IN`
OVR_EXT_OUT=`expr $LNET_EXT_OUT + $SERVER_EXT_OUT`

OVR_IN=`expr $SERVER_OVR_IN + $LNET_IN`
OVR_OUT=`expr $SERVER_OVR_OUT + $LNET_OUT`
OVERALL=`expr $OVR_IN + $OVR_OUT`

################################################## ########## #####
# Here is output for local network #
################################################## ########## #####
localtraf() {
echo "" >> $F_LNET
echo `date +"%d/%m/%Y %T"`" TRAFFIC FOR LOCAL NET" >> $F_LNET
echo "Input Output Description" >> $F_LNET
echo "$LAPTOP_IN $LAPTOP_OUT Laptop" >> $F_LNET
echo "$WS_IN $WS_OUT Workstation:" >> $F_LNET
echo "$LNET_ISP_IN $LNET_ISP_OUT Local Network to TSP" >> $F_LNET
echo "$LNET_EXT_IN $LNET_EXT_OUT Local Network to Internet" >> $F_LNET
echo "------------------------------------------------------ --------------" >> $F_LNET
echo "$LNET_IN $LNET_OUT Overall for Local Network" >> $F_LNET
}
################################################## ########## #####
# Here is output for Server #
################################################## ########## #####
servertraf() {
echo "" >> $F_SERV
echo `date +"%d/%m/%Y %T"`" TRAFFIC FOR SERVER" >> $F_SERV
echo "Input Output Description" >> $F_SERV
echo "$SERVER_IN $SERVER_OUT Server" >> $F_SERV
echo "$SERVER_ISP_IN $SERVER_ISP_OUT Server to ISP" >> $F_SERV
echo "$SERVER_EXT_IN $SERVER_EXT_OUT Server to Internet" >> $F_SERV
echo "------------------------------------------------------ --------------" >> $F_SERV
echo "$SERVER_OVR_IN $SERVER_OVR_OUT Overall for Server" >> $F_SERV
}
################################################## ########## #####
# Here is output for Overall #
################################################## ########## #####
overalltraf() {

echo "" >> $F_OVER
echo `date +"%d/%m/%Y %T"`" OVERALL TRAFFIC FOR: "`hostname` >> $F_OVER
echo "Input Output Description" >> $F_OVER
echo "$LNET_IN $LNET_OUT LOCAL NETWORK" >> $F_OVER
echo "$SERVER_OVR_IN $SERVER_OVR_OUT SERVER" >> $F_OVER
echo "$OVR_ISP_IN $OVR_ISP_OUT With ISP" >> $F_OVER
echo "$OVR_EXT_IN $OVR_EXT_OUT Internet" >> $F_OVER
echo "------------------------------------------------------ --------------" >> $F_OVER
echo "$OVR_IN $OVR_OUT TOTALL" >> $F_OVER
}
################################################## ########## #####
# Here is short output for Overall #
################################################## ########## #####
shorttraf() {

echo `date +"%d/%m/%Y %T"`" INBOUND: $OVR_IN OUTBOUND: $OVR_OUT" >> $F_ALL
}
resettraf() {
$IPTABLES -Z
}

case "$1" in

-b)
if [ "$2" = "-p" ]; then
F_ALL="/dev/stdout"
fi
shorttraf
if [ "$2" = "-r" ]; then
resettraf
fi
RETVAL=0
;;
-o)
if [ "$2" = "-p" ]; then
F_OVER="/dev/stdout"
fi
overalltraf
if [ "$2" = "-r" ]; then
resettraf
fi
RETVAL=0
;;
-l)
if [ "$2" = "-p" ]; then
F_LNET="/dev/stdout"
fi
localtraf
if [ "$2" = "-r" ]; then
resettraf
fi
RETVAL=0
;;
-s)
if [ "$2" = "-p" ]; then
F_SERV="/dev/stdout"
fi
servertraf
if [ "$2" = "-r" ]; then
resettraf
fi
RETVAL=0
;;
-a)
if [ "$2" = "-p" ]; then
F_ALL="/dev/stdout"
F_LNET="/dev/stdout"
F_SERV="/dev/stdout"
F_OVER="/dev/stdout"
fi
localtraf
servertraf
overalltraf
shorttraf
if [ "$2" = "-r" ]; then
resettraf
fi
RETVAL=0
;;
*)
echo $"usage: traflog [-bolsa] [-pr]"
echo $" -b log Overall traffic statistic in brif"
echo $" -o log only Overall statistic"
echo $" -l log internet traffic for local network"
echo $" -s log internet traffic for server"
echo $" -a log internet traffic for All"
echo $" -r reset statistic in ALL chains of iptables"
echo $" -p display statistic information only on /dev/stdout"
echo $""
echo $" log path: $FILE"
exit 1
esac
exit $RETVAL



6. И последнее кидаем указанную ниже строчку в /etc/crontab или как он у вас называется, и ждем 23:55 каждого дня чтобы посмотреть статистику дня. Если натерпится выводите командой /sbin/traflog -a -p на экран.

55 23 * * * root /etc/firewall/traflog -a -r
( Непременно с ключом -r чтобы сбросить статистику за прошедший день. )

ну и почитай здесь - есть интересные темы ) - http://www.ingineer.ru/linux/