Библиотека сайта rus-linux.net
Глава 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-адрес или не выступают в роли шлюза для внутренней сети.
Некоторые моменты для обсуждения.
Вы можете спокойно предполагать, что находитесь в постоянной опасности, если подключены к Интернет. Ваш шлюз в Интернет основной источник тревоги, так что я рекомендую следующее:
- На шлюзе должны быть запущены только самые необходимые приложения
- Шлюз должен строго ограничивать типы и число протоколов, проходящих через него (протоколы потенциально опасные, например, telnet и ftp)
- К любым системам, хранящим конфиденциальную информацию, не должно быть прямого доступа из Интернет
Конфигурация скрипта /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