Назад Оглавление Вперед

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

В этой главе
Маскарадинг и форвардинг в Linux
Создание ядра с поддержкой маскарада и форвардинга.
Конфигурация скрипта "/etc/rc.d/init.d/firewall" шлюза.
Запрещение доступа к некоторым адресам
Административная утилита IPCHAINS

Маскарадинг и форвардинг в 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 bombs, filter
# 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
# -------------------
# Если вы используете FreeSWAN IPSec VPN, вам нужно заполнить адреса
# адреса шлюзов в IPSECSG и виртуальные интерфейсы для
# FreeS/Wan IPSEC в параметрах FREESWANVI. Смотрите начало
# этого firewall скрипта для установки параметров.
# 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
Назад Оглавление Вперед