RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 8. Сетевой брандмауэр с поддержкой маскарадинга и форвардинга

Маскарадинг и форвардинг в Linux

Краткий обзор.

Конфигурирование Linux-сервера на маскарадинг и форвардинг трафика из внутренней локальной сети, имеющей приватные адреса (192.168.1.0/24), в Интернет требует специальных настроек ядра и Вашего конфигурационного скрипта брандмауэра. Этот вид установок известен как шлюз. Данная конфигурация должна быть установлена, только если у Вас возникнет в этом необходимость, поэтому ей посвящена отдельная глава.

Создание ядра с поддержкой маскарада и форвардинга

Первое, о чем Вы должны подумать, это чтобы Ваше ядро было создано с поддержкой файрвола и файрволинга. Помните, что все серверы должны быть настроены на блокирование неиспользуемых портов, даже если они не выступают в роли брандмауэра. В ядре 2.2.14 нужно ответить Yes на следующие вопросы:

Networking options:
Network firewalls (CONFIG_FIREFALL) [N] Y
IP:Firewalling (CONFIG_IP_FIREWALL) [N] Y
IP:TCP syncookie support (CONFIG_SYN_COOKIES) [N] Y

ЗАМЕЧАНИЕ. Если при создание ядра использовали материалы из главы 3, то все необходимые опции (Network firewalls, IP:Firewalling и IP:TCP syncookie support) уже были отмечены.

IP-маскарадинг и IP ICMP-маскарадинг требуются только для шлюза.

IP:Masquerading (CONFIG_IP_MASQUERADE) [N] Y
IP:ICMP Masquerading (CONFIG_IP_MASQUERADE_ICMP) [N] Y

Маскарадинг необходим, если один из компьютеров локальной сети, для которой Linux-сервер (или шлюз) является брандмауэром, пытается послать пакеты в Интернет, и шлюз притворяется этим компьютером. Другими словами, при пересылке всех пакетов из внутренней сети во внешнюю, шлюз делает вид, что все пакеты идут от него. Это работает в обе стороны, если внешний хост отвечает, то шлюз будет пересылать все пакеты во внутреннюю сеть нужному компьютеру. В результате все внутренние компьютеры полностью невидимы для внешнего мира, но при этом имеют туда доступ и могут получать оттуда ответы.

IP-маскарадинг работает только, если у Вас включен IP-форвардинг. Эта возможность по умолчанию отключена, и чтобы включить ее используйте следующие команды:

Под Red Hat 6.1

[root@deep /]# echo "1" > /proc/sys/net/ipv4/ip_forward

Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. В Red Hat 6.1 это можно также сделать внеся изменения в файл /etc/sysconfig/network:

FORWARD_IPV4="false"

Должен читаться:

FORWARD_IPV4="yes"

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

[root@deep /]# /etc/rc.d/init.d/network restart
Bringing up interface lo        [ OK ]
Bringing up interface eth0      [ OK ]
Bringing up interface eth1      [ OK ]

Лично я предпочитаю второй способ включения форвардинга.

Под Red Hat 6.2:

Редактируйте файл /etc/sysctl.conf и добавьте следующую строку:

# Enable packet forwarding
net.ipv4.ip_forward = 1

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

[root@deep /]# /etc/rc.d/init.d/network restart
Setting network parameters      [ OK ]
Bringing up interface lo        [ OK ]
Bringing up interface eth0      [ OK ]
Bringing up interface eth1      [ OK ]

ЗАМЕЧАНИЕ. Строка IP forwarding, введенная выше, нужна только, если Вы ответили Yes на вопрос IP:Masquerading (CONFIG_IP_MASQUERADE) при конфигурировании ядра и решили сделать из сервера шлюз с маскарадингом для внутренней сети.

Если Вы включили IP Masquerading, тогда будут автоматически скомпилированы модули ip_masq_ftp.o (для обмена файлами по протоколу ftp), ip_masq_irc.o (для irc-чатов), ip_masq_quake.o (догадайтесь сами, для чего он), ip_masq_vdolive.o (для VDOLive-видео), ip_masq_cuseeme.o (для CU-SeeMe broadcasts) и ip_masq_raudio.o (для RealAudio). Они нужны, чтобы работал маскарадинг для этих протоколов. Вам нужно будет создать модульное ядро, ответив Yes на вопрос Enable loadable module support (CONFIG_MODULES), вместо монолитного, чтобы разрешить использование функции маскарадинга и модулей, подобных ip_masq_ftp.o.

Основной код маскарадинга, включаемый опцией "IP: masquerading", обрабатывает только TCP или UDP-пакеты (и ICMP-ошибки для существующих соединений). Опция IP:ICMP Masquerading включает дополнительную поддержку для маскарадинга ICMP-пакетов, таких как ping или исследований, проводимых программой tracer из Windows 95.

ЗАМЕЧАНИЕ. Помните, что у других серверов, например, веб или почтового, эти опции включать не надо, так как они имеют постоянно присвоенный им IP-адрес или не выступают в роли шлюза для внутренней сети.

Некоторые моменты для обсуждения.

Вы можете спокойно предполагать, что находитесь в постоянной опасности, если подключены к Интернет. Ваш шлюз в Интернет основной источник тревоги, так что я рекомендую следующее:

  1. На шлюзе должны быть запущены только самые необходимые приложения
  2. Шлюз должен строго ограничивать типы и число протоколов, проходящих через него (протоколы потенциально опасные, например, telnet и ftp)
  3. К любым системам, хранящим конфиденциальную информацию, не должно быть прямого доступа из Интернет

Конфигурация скрипта /etc/rc.d/init.d/firewall для шлюза

Это конфигурационный скрипт для шлюза. Он позволяет неограниченный трафик через Loopback-интерфейс, ICMP, DNS-сервер и клиент (53), SSH-сервер и клиент (22), HTTP-сервер и клиент (80), HTTPS-сервер и клиент (443), POP-клиент (110), NNTP NEWS-клиент (119), SMTP-сервер и клиент (25), IMAP-сервер (143), IRC-клиент (6667), ICQ-клиент (4000), FTP-клиент (20 и 21), RealAudio QuickTime-клиент и исходящий TRACEROUTE.

Если Вы не хотите использовать какие-нибудь сервисы, открытые в этом файле по умолчанию, закомментируйте их, добавив в начало строки символ #. Если же Вы хотите использовать сервисы, которые я запретил, удалите символ комментария #. Если Вы настраиваете на сервере маскарадинг, не забудьте раскомментировать модули, необходимые для маскарадинга нужных Вам сервисов (ip_masq_irc.o, ip_masq_raudio.o и т.д) в секции MODULES MASQUERADING.

Создайте скрипт firewall (touch /etc/rc.d/init.d/firewall) на шлюзе:

#!/bin/sh
# ----------------------------------------------------------------------------
# Last modified by Gerhard Mourani: 04-25-2000
# ----------------------------------------------------------------------------
# Copyright (C) 1997, 1998, 1999 Robert L. Ziegler
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for educational, research, private and non-profit purposes,
# without fee, and without a written agreement is hereby granted.
# This software is provided as an example and basis for individual firewall
# development. This software is provided without warranty.
#
# Any material furnished by Robert L. Ziegler is furnished on an
# "as is" basis. He makes no warranties of any kind, either expressed
# or implied as to any matter including, but not limited to, warranty
# of fitness for a particular purpose, exclusivity or results obtained
# from use of the material.
# ----------------------------------------------------------------------------
# Invoked from /etc/rc.d/init.d/firewall.
# chkconfig: - 60 95
# description: Starts and stops the IPCHAINS Firewall \
# used to provide Firewall network services.
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
if [ ${NETWORKING} = "no" ]
then
exit 0
fi
if [ ! -x /sbin/ipchains ]; then
exit 0
fi
# See how we were called.
case "$1" in
start)
echo -n "Starting Firewalling Services: "
# Некоторые определения для упрощения управления.
# ----------------------------------------------------------------------------
# EDIT THESE TO SUIT YOUR SYSTEM AND ISP.
EXTERNAL_INTERFACE="eth0" # Интерфейс подключенный к Интернет
LOCAL_INTERFACE_1="eth1" # Внутренний LAN-интерфейс
LOOPBACK_INTERFACE="lo" # loopback-интерфейс
IPADDR="my.ip.address" # Ваш IP-адрес
LOCALNET_1="192.168.1.0/24"
# Диапазон внутренних адресов, которые Вы используете
IPSECSG="my.ipsecsg.address"
# Разделяемый пробелами список удаленных VPN-шлюзов
FREESWANVI="ipsec0" # Разделяемый пробелам список виртуальных интерфейсов
ANYWHERE="any/0" # Совпадает с "любыми" IP-адресами.
NAMESERVER_1="my.name.server.1" # 1-й DNS-сервер.
NAMESERVER_2="my.name.server.2" # 2-й DNS-сервер.
MY_ISP="my.isp.address.range/24" # диапазон адресов ISP & NOC
SMTP_SERVER="my.smtp.server" # Ваш сервер-концентратор почты.
POP_SERVER="my.pop.server" # Внешний pop-сервер, если есть
NEWS_SERVER="my.news.server" # Внешний news-сервер, если есть
SYSLOG_SERVER="syslog.internal.server" # Ваш внутренний сервер syslog
LOOPBACK="127.0.0.0/8" # Зарезервированный диапазон loopback-адресов
CLASS_A="10.0.0.0/8" # Приватная сеть класса A
CLASS_B="172.16.0.0/12" # Приватная сеть класса B
CLASS_C="192.168.0.0/16" # Приватная сеть класса C
CLASS_D_MULTICAST="224.0.0.0/4" # Широковещательные адреса класса D
CLASS_E_RESERVED_NET="240.0.0.0/5" # Зарезервированные адреса класса E
BROADCAST_SRC="0.0.0.0" # Широковещательный адрес источника
BROADCAST_DEST="255.255.255.255" # Широковещательный адрес получателя
PRIVPORTS="0:1023" # Диапазон привилегированных портов
UNPRIVPORTS="1024:65535" # Диапазон непривилегированных портов
# ----------------------------------------------------------------------------
# SSH стартует на 1023 и работает до 513 для
# каждого дополнительного одновременно входящего соединения.
SSH_PORTS="1022:1023" # диапазон привилегированных портов для SSH
# traceroute обычно использует -S 32769:65535 -D 33434:33523
TRACEROUTE_SRC_PORTS="32769:65535"
TRACEROUTE_DEST_PORTS="33434:33523"
# ----------------------------------------------------------------------------
# Политика по умолчанию DENY
# Явно разрешаются входящие и исходящие соединения
# Удаления всех существующих правил принадлежащих этому фильтру
ipchains -F
# Очистка всех существующих правил и пользовательских цепочек
ipchains -X
# Установка политики по умолчанию deny.
# Don't even bother sending an error message back.
ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY
# Установка таймаута для маскарадинга в 10 часов для tcp-соединений
ipchains -M -S 36000 0 0
# Не перенаправлять фрагменты. Предварительно их собирать.
ipchains -A output -f -i $LOCAL_INTERFACE_1 -j DENY
# ----------------------------------------------------------------------------
# MODULES MASQUERADING
# Раскомментируйте все необходимые модули, перечисленные ниже.
# Эти модели нужны для маскарадинга их собственных сервисов.
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio ports=554,7070,7071,6970,6971
/sbin/modprobe ip_masq_irc
#/sbin/modprobe ip_masq_vdolive
#/sbin/modprobe ip_masq_cuseeme
#/sbin/modprobe ip_masq_quake
# ----------------------------------------------------------------------------
# LOOPBACK
# Неограниченный трафик на loopback-интерфейсe.
ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT
ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT
# ----------------------------------------------------------------------------
# Сетевые вампиры
# Запрещение доступа jerks
# /etc/rc.d/rc.firewall.blocked содержит список
# ipchains -A input -i $EXTERNAL_INTERFACE -s address -j DENY
# правил для блокирования любого доступа.
# Сброс любых соединений от проблемных сайтов
#if [ -f /etc/rc.d/rc.firewall.blocked ]; then
# . /etc/rc.d/rc.firewall.blocked
#fi
# ----------------------------------------------------------------------------
# SPOOFING & BAD ADDRESSES
# Сброс поддельных пакетов.
# Игнорирование заведомо неправильных адресов отправителя.
# Защита Вас от отправки пакетов с плохими адресами.
# Блокирование поддельных пакетов, имеющих Ваш адрес, как адрес отправителя.
ipchains -A input -i $EXTERNAL_INTERFACE -s $IPADDR -j DENY -l
# Блокирование пакетов идущих как бы в или из приватной сети класса A
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_A -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_A -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_A -j REJECT -l
ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_A -j REJECT -l
# Блокирование пакетов идущих как бы в или из приватной сети класса B
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_B -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_B -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_B -j REJECT -l
ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_B -j REJECT -l
# Блокирование пакетов идущих как бы в или из приватной сети класса C
# ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_C -j DENY -l
# ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_C -j DENY -l
# ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_C -j REJECT -l
# ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_C -j REJECT -l
# Блокирование пакетов идущих как из loopback интерфейса
ipchains -A input -i $EXTERNAL_INTERFACE -s $LOOPBACK -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $LOOPBACK -j REJECT -l
# Блокирование пакетов с широковещательным адресом
# в качестве адреса отправителя
ipchains -A input -i $EXTERNAL_INTERFACE -s $BROADCAST_DEST -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $BROADCAST_SRC -j DENY -l
# Блокирование широковещательных адресов класса D (in.h) (NET-3-HOWTO)
# Широковещательный адрес не может быть адресом отправителя.
# Широковещание использует UDP.
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_D_MULTICAST -j DENY -l
# Блокирование зарезервированных адресов класса E
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_E_RESERVED_NET -j DENY -l
# Блокирование адресов определенных как зарезервированные IANA
# 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
# 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
# 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
ipchains -A input -i $EXTERNAL_INTERFACE -s 1.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 2.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 5.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 7.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 23.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 27.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 31.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 37.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 39.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 41.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 42.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 58.0.0.0/7 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 60.0.0.0/8 -j DENY -l
#65: 01000001 - /3 includes 64 - need 65-79 spelled out
ipchains -A input -i $EXTERNAL_INTERFACE -s 65.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 66.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 67.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 68.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 69.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 70.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 71.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 72.0.0.0/8 -j DENY √l
ipchains -A input -i $EXTERNAL_INTERFACE -s 73.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 74.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 75.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 76.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 77.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 78.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 79.0.0.0/8 -j DENY -l
#80: 01010000 - /4 masks 80-95
ipchains -A input -i $EXTERNAL_INTERFACE -s 80.0.0.0/4 -j DENY -l
# 96: 01100000 - /4 makses 96-111
ipchains -A input -i $EXTERNAL_INTERFACE -s 96.0.0.0/4 -j DENY -l
#126: 01111110 - /3 includes 127 - need 112-126 spelled out
ipchains -A input -i $EXTERNAL_INTERFACE -s 112.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 113.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 114.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 115.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 116.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 117.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 118.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 119.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 120.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 121.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 122.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 123.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 124.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 125.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 126.0.0.0/8 -j DENY -l
#217: 11011001 - /5 includes 216 - need 217-219 spelled out
ipchains -A input -i $EXTERNAL_INTERFACE -s 217.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 218.0.0.0/8 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -s 219.0.0.0/8 -j DENY -l
#223: 11011111 - /6 masks 220-223
ipchains -A input -i $EXTERNAL_INTERFACE -s 220.0.0.0/6 -j DENY -l
# ----------------------------------------------------------------------------
# ICMP
# Предотвращение атак denial of service, базирующихся на ICMP-бомбочках.
# incoming Redirect (5) и outgoing Destination Unreachable (3).
# Заметим, что отключение Destination Unreachable (3) обычно
# нецелесообразно, так как он используется при согласовании
# размера фрагмента пакета.
# Для двунаправленного ping.
# Типы сообщений: Echo_Reply (0), Echo_Request (8)
# Для предотвращения атак ограничьте адрес отправителя диапазоном
# Ip-адресов Вашего ISP.
# Для исходящих traceroute.
# Типы сообщений: INCOMING Dest_Unreachable (3), Time_Exceeded (11)
# default UDP base: 33434 to base+nhops-1
#
# Для входящих traceroute.
# Типы сообщений: OUTGOING Dest_Unreachable (3), Time_Exceeded (11)
# Для блокирования этого, запретите  OUTGOING 3 и 11
# 0: echo-reply (pong)
# 3: destination-unreachable, port-unreachable, fragmentation-needed, etc.
# 4: source-quench
# 5: redirect
# 8: echo-request (ping)
# 11: time-exceeded
# 12: parameter-problem
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 0 -d $IPADDR -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 3 -d $IPADDR -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 4 -d $IPADDR -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 11 -d $IPADDR -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 12 -d $IPADDR -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $MY_ISP 8 -d $IPADDR -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
         -s $IPADDR 0 -d $MY_ISP -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
         -s $IPADDR 3 -d $MY_ISP -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
         -s $IPADDR 4 -d $ANYWHERE -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
         -s $IPADDR 8 -d $ANYWHERE -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
         -s $IPADDR 12 -d $ANYWHERE -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
         -s $IPADDR 11 -d $MY_ISP -j ACCEPT
# ----------------------------------------------------------------------------
# UDP INCOMING TRACEROUTE
# traceroute обычно использует -S 32769:65535 -D 33434:33523
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $MY_ISP \
         $TRACEROUTE_SRC_PORTS -d $IPADDR $TRACEROUTE_DEST_PORTS \
         -j ACCEPT -l
ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
         -s $ANYWHERE $TRACEROUTE_SRC_PORTS \
         -d $IPADDR $TRACEROUTE_DEST_PORTS -j DENY -l
# ----------------------------------------------------------------------------
# DNS-сервер
# ----------
# DNS: полный сервер
# сервер/клиент к серверу запросы и ответы
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $ANYWHERE $UNPRIVPORTS \
         -d $IPADDR 53 -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p udp -s $IPADDR 53 \
         -d $ANYWHERE $UNPRIVPORTS -j ACCEPT
# DNS-клиент (53)
# ---------------
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $NAMESERVER_1 53 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p udp -s $IPADDR $UNPRIVPORTS \
         -d $NAMESERVER_1 53 -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $NAMESERVER_2 53 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p udp -s $IPADDR $UNPRIVPORTS \
         -d $NAMESERVER_2 53 -j ACCEPT
# TCP-запросы от клиентов разрешены, если UDP закончились
# ошибкой. Это случается очень редко. Обычно, клиенты используют
# TCP для пересылки зон от первичного к вторичному серверу или хакером.
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
         -s $NAMESERVER_1 53 -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
         -s $IPADDR $UNPRIVPORTS -d $NAMESERVER_1 53 -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
         -s $NAMESERVER_2 53 -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
         -s $IPADDR $UNPRIVPORTS -d $NAMESERVER_2 53 -j ACCEPT
# ----------------------------------------------------------------------------
# Принимаем TCP только для избранных портов
# ------------------------------------------------------------------
# SSH-сервер (22)
# ---------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE $UNPRIVPORTS \
         -d $IPADDR 22 -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y -s $IPADDR 22 \
         -d $ANYWHERE $UNPRIVPORTS -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE $SSH_PORTS \
         -d $IPADDR 22 -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y -s $IPADDR 22 \
         -d $ANYWHERE $SSH_PORTS -j ACCEPT
# SSH-клиент (22)
# ---------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 22 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 22 -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 22 \
         -d $IPADDR $SSH_PORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $SSH_PORTS \
         -d $ANYWHERE 22 -j ACCEPT
# ------------------------------------------------------------------
# HTTP-клиент (80)
# ----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 80 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 80 -j ACCEPT
# ------------------------------------------------------------------
# HTTPS-клиент (443)
# ------------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 443 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 443 -j ACCEPT
# ------------------------------------------------------------------
# POP-клиент (110)
# ----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $POP_SERVER 110 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $POP_SERVER 110 -j ACCEPT
# ------------------------------------------------------------------
# NNTP NEWS-клиент (119)
# ----------------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $NEWS_SERVER 119 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $NEWS_SERVER 119 -j ACCEPT
# ------------------------------------------------------------------
# FINGER-клиент (79)
# ------------------
# ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 79 \
#          -d $IPADDR $UNPRIVPORTS -j ACCEPT
# ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
#          -d $ANYWHERE 79 -j ACCEPT
# ------------------------------------------------------------------
# SYSLOG-клиент (514)
# -----------------
# ipchains -A output -i $LOCAL_INTERFACE_1 -p udp -s $IPADDR 514 \
#          -d $SYSLOG_SERVER 514 -j ACCEPT
# ------------------------------------------------------------------
# AUTH-сервер (113)
# -----------------
# Reject лучше, чем deny, для пакетов, входящих на порт auth. (NET-3-HOWTO)
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE \
         -d $IPADDR 113 -j REJECT
# AUTH-клиент (113)
# -----------------
# ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 113 \
#          -d $IPADDR $UNPRIVPORTS -j ACCEPT
# ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
#          -d $ANYWHERE 113 -j ACCEPT
# ------------------------------------------------------------------
# SMTP-клиент (25)
# ----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 25 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 25 -j ACCEPT
# ------------------------------------------------------------------
# IRC-клиент (6667)
# -----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 6667 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 6667 -j ACCEPT
# ------------------------------------------------------------------
# ICQ-клиент (4000)
# -----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 2000:4000 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 2000:4000 -j ACCEPT
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $ANYWHERE 4000 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p udp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 4000 -j ACCEPT
# ------------------------------------------------------------------
# FTP-клиент (20 и 21)
# -------------------
# исходящий запрос
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 21 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 21 -j ACCEPT
# NORMAL режим, канал данных
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE 20 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
# NORMAL mode, ответ канал данных
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y -s $IPADDR \
         $UNPRIVPORTS -d $ANYWHERE 20 -j ACCEPT
# PASSIVE mode, создание канала данных
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE $UNPRIVPORTS -j ACCEPT
# PASSIVE mode, ответ канала данных
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE \
         $UNPRIVPORTS -d $IPADDR $UNPRIVPORTS -j ACCEPT
# ------------------------------------------------------------------
# RealAudio / QuickTime клиент
# ----------------------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 554 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 554 -j ACCEPT
# TCP более безопасный метод: 7070:7071
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 7070:7071 \
         -d $IPADDR $UNPRIVPORTS -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE 7070:7071 -j ACCEPT
# UDP предпочтительный метод: 6970:6999
# Для машин из LAN UDP требует модуля маскарадинга
# RealAudio и программу ipmasqadm.
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $ANYWHERE $UNPRIVPORTS \
         -d $IPADDR 6970:6999 -j ACCEPT
ipchains -A output -i $EXTERNAL_INTERFACE -p udp -s $IPADDR $UNPRIVPORTS \
         -d $ANYWHERE $UNPRIVPORTS -j ACCEPT
# ------------------------------------------------------------------
# WHOIS-клиент (43)
# -----------------
# ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 43 \
#          -d $IPADDR $UNPRIVPORTS -j ACCEPT
# ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS \
#          -d $ANYWHERE 43 -j ACCEPT
# ------------------------------------------------------------------
# OUTGOING TRACEROUTE
# -------------------
ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
         -s $IPADDR $TRACEROUTE_SRC_PORTS \
         -d $ANYWHERE $TRACEROUTE_DEST_PORTS -j ACCEPT
# ----------------------------------------------------------------------------
# Неограниченный трафик с локальной сетью.
# Все внутренние машины имеют доступ к firewall-у.
ipchains -A input -i $LOCAL_INTERFACE_1 -s $LOCALNET_1 -j ACCEPT
ipchains -A output -i $LOCAL_INTERFACE_1 -d $LOCALNET_1 -j ACCEPT
# ----------------------------------------------------------------------------
# FreeS/WAN IPSec VPN
# -------------------
# Если Вы используете FreeS/WAN IPSec VPN, нужно заполнить адреса
# шлюзов в IPSECSG и виртуальные интерфейсы для
# FreeS/Wan IPSEC в параметрах FREESWANVI. Смотрите начало
# этого скрипта для установки параметров.
# IPSECSG это список удаленных шлюзов, разделенных пробелами. FREESWANVI это
# список виртуальных интерфейсов для FreeS/Wan IPSEC, разделенных пробелами
# Включите только те, которые фактически используются
# Позволяем IPSEC-протокол от удаленных шлюзов на внешний интерфейс
# Протокол IPSEC использует три основных типа пакетов:
# IKE использует UDP-протокол и 500 порт,
# ESP испоьзует порт номер 50 и AH использует порт номер 51
# ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $IPSECSG -j ACCEPT
# ipchains -A output -i $EXTERNAL_INTERFACE -p udp -d $IPSECSG -j ACCEPT
# ipchains -A input -i $EXTERNAL_INTERFACE -p 50 -s $IPSECSG -j ACCEPT
# ipchains -A output -i $EXTERNAL_INTERFACE -p 50 -d $IPSECSG -j ACCEPT
# ipchains -A input -i $EXTERNAL_INTERFACE -p 51 -s $IPSECSG -j ACCEPT
# ipchains -A output -i $EXTERNAL_INTERFACE -p 51 -d $IPSECSG -j ACCEPT
# Разрешаем весь трафик к виртуальному интерфейсу FreeS/WAN
# ipchains -A input -i $FREESWANVI -s $ANYWHERE -d $ANYWHERE -j ACCEPT
# ipchains -A output -i $FREESWANVI -s $ANYWHERE -d $ANYWHERE -j ACCEPT
# Пересылка всего из виртуального интерфейса в IPSEC-туннель
# ipchains -A forward -i $FREESWANVI -s $ANYWHERE -d $ANYWHERE -j ACCEPT
# Отключение защиты от IP spoofing, чтобы IPSEC работал правильно
# echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter
# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
# ----------------------------------------------------------------------------
# Маскарадинг внутреннего трафика.
# Весь внутренний трафик маскарадится.
ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQ
# ----------------------------------------------------------------------------
# Включение регистрации выбранных запрещенных пакетов
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -d $IPADDR -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -p udp -d $IPADDR $PRIVPORTS \
         -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
         -d $IPADDR $UNPRIVPORTS -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 5 -d $IPADDR -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
         -s $ANYWHERE 13:255 -d $IPADDR -j DENY -l
# ----------------------------------------------------------------------------
;;
stop)
echo -n "Shutting Firewalling Services: "
# Remove all existing rules belonging to this filter
ipchains -F
# Delete all user-defined chain to this filter
ipchains -X
# Reset the default policy of the filter to accept.
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT
;;
status)
status firewall
;;
restart|reload)
$0 stop
$0 start
;;
*)
echo "Usage: firewall {start|stop|status|restart|reload}"
exit 1
esac
exit 0

Сделайте этот скрипт исполняемым и измените права доступа:

[root@deep /]# chmod 700 /etc/rc.d/init.d/firewall
[root@deep /]# chown 0.0 /etc/rc.d/init.d/firewall

Создайте символическую ссылку в rc.d для Вашего Firewall следующей командой:

[root@deep /]# chkconfig --add firewall
[root@deep /]# chkconfig --level 345 firewall on

Сейчас Ваши правила для firewall готовы к использованию с System V init (System V init запускает все нормальные процессы, которые надо стартовать во время загрузки системы) и будут автоматически стартовать при каждой загрузке сервера.

Ручная остановка firewall:

[root@deep /]# /etc/rc.d/init.d/firewall stop
Shutting Firewalling Services:  [ OK ]

Запуск firewall вручную:

[root@deep /]# /etc/rc.d/init.d/firewall start
Starting Firewalling Services:  [ OK ]

Запрещение доступа с некоторых адресов

Иногда, Вы можете встретить адреса, с которых Вы бы хотели закрыть весь доступ на все Ваши серверы. Вы можете создать файл rc.firewall.blocked в каталоге /etc/rc.d и раскомментировать следующие строки в скрипте firewall:

if [ -f /etc/rc.d/rc.firewall.blocked ]; then
. /etc/rc.d/rc.firewall.blocked
fi

Создайте файл rc.firewall.blocked (touch /etc/rc.d/rc.firewall.blocked) и добавьте в него все IP-адреса, доступ с которых хотите заблокировать. Например,

204.254.45.9
187.231.11.5

Дополнительная документация.

Для получения большей информации, Вы можете прочитать следующие man:

$ ipchains (8) управление IP firewall
$ ipchains-restore (8) восстановление цепочек IP firewall из stdin
$ ipchains-save (8) запись цепочек IP firewall на stdout

Административная утилита Ipchains

Опции, описываемые ниже, лишь некоторые из существующих, которые наиболее часто используются. Для получения полной информации обо всех параметрах запуска ipchains, читайте страницы руководства (man) и документацию.

ipchains

Утилита ipchains используется для администрирования firewall в Linux. Мы можем использовать ее для установки правил firewall, так как мы уже делали в этой книге. Когда правила созданы, мы можем, используя ряд команд, поддерживать и контролировать их.

Для просмотра всех правил в выбранной цепочке используйте команду:

[root@deep /]# ipchains -L

Если название цепочки не определено, то выводятся все правила.

Для получения всех правил в цепочке input используйте команду:

[root@deep /]# ipchains -L input

Для получения всех правил в цепочке output используйте команду:

[root@deep /]# ipchains -L output

Для получения всех правил в цепочке forward используйте команду:

[root@deep /]# ipchains -L forward

Это, конечно, работает только, если Вы настроили маскарадинг на Вашем сервере.

Для получения списка всех правил маскарадинга в выбранной цепочке используйте команду:

[root@deep /]# ipchains -ML

Эта опция позволяет просматривать текущие маскарадные соединения. Чтобы эта команда работала, Вам надо на сервере иметь настроенный маскарадинг.

Для получения списка правил в цифровом формате (выводятся адреса, а не имена) в выбранной цепочке используйте команду:

[root@deep /]# ipchains -nL

Поиск

 

Найди своих коллег!