Настройка фаерволла (firewall брандмауэра) в Linux и BSD

Материал из МФТИ-телеком.

Перейти к: навигация, поиск

Содержание

[править] Условия и цель

Дано:

  • Компьютер: Linux
  • Сетевые карты: 1 или 2
  • Подключение к интернет: с использованием VPN (PPTP)
  • Домашняя сеть: если 2 сетевые карты, то есть
  • Внешний IP-адрес: реальный

Цель:

  • Защититься от непрошенных гостей из интернета
  • Сделать NAT, чтобы компьютеры в домашней сети тоже имели доступ в Интернет


[править] Установка и настройка

[править] Условные обозначения

eth0 Интерфейс, смотрящий в локальную сеть
eth1 Интерфейс, смотрящий в домашнюю сеть (если есть)
ppp0 VPN подключение к Интернет


[править] Linux

Разобьём весь долгий путь на несколько шагов:

  1. Сборка ядра с нужными опциями
  2. Установка необходимых программ
  3. Непосредственно настройка правил для фаерволла

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



[править] Сборка ядра с нужными опциями

Все действия по установке и настройке производятся из-под рута, поэтому для начала станем рутом:

bedman@comp ~ $ su -
Password:
comp ~ #

Убедимся, что в ядро включены следующие опции:

CONFIG_NETFILTER=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_LIMIT=y
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
CONFIG_NETFILTER_XT_MATCH_STATE=y
CONFIG_NF_CONNTRACK_IPV4=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_MATCH_IPRANGE=y
CONFIG_IP_NF_MATCH_OWNER=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_TARGET_LOG=y

Следующие опции нужны только для NAT:

CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NF_NAT=y
CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y

Это можно сделать следующим образом:

comp ~ # zcat /proc/config.gz | less

Замечание: Для большинства бинарных дистрибутивов все необходимые опции в ядро уже включены и скорее всего можно переходить к следующему шагу.

Через make menuconfig необходимые опции выглядит следующим образом:

Linux Kernel Configuration: Настройка netfilter
Networking  --->
  Networking options   --->
    [*] TCP/IP networking
    [*] Network packet filtering framework (Netfilter)  --->
          Core Netfilter Configuration  --->
            <*> Netfilter netlink interface
            <*> Netfilter connection tracking support
            -*- Netfilter Xtables support (required for ip_tables) 
            <M>   "TCPMSS" target support                             <-- нужно только для NAT
            <*>   "conntrack" connection tracking match support
            <*>   Multiple port match support
            <*>   "state" match support
          IP: Netfilter Configuration  --->
            <*> IPv4 connection tracking support (required for NAT)
            <*> IP tables support (required for filtering/masq/NAT)
            <*>   IP range match support
            <*>   Owner match support
            <*>   Packet filtering
            <*>     REJECT target support
            <*>   LOG target support
            <*>   Full NAT                                            <-- нужно только для NAT
            <*>     MASQUERADE target support                         <-- нужно только для NAT


Большинство указанных опций можно либо вкомпиливать в ядро, либо компилить в качестве отдельных модулей. Если в конфигурацию ядра вносились изменения, пересобираем его и грузимся в новое ядро.

[править] Установка необходимых программ

Из программ нам понадобиться только iptables. В Gentoo её можно поставить следующим образом:

comp ~ # emerge -v iptables

Добавим iptables в автозагрузку. В Gentoo это делается так:

comp ~ # rc-update add iptables default

Маршрутизация по-умолчанию выключена. Чтобы её включить, надо отредактировать файл /etc/sysctl.conf (в Gentoo):

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.forwarding = 1


[править] Непосредственно настройка правил для фаерволла

Мы просто приведём скрипт настройки и поясним его комментариями.

#!/bin/bash
# Очистим всё, что было сохранено до этого; обнулим все счётчики
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -Z
iptables -t nat -Z
# Зададим политику по-умолчанию для каждой цепочки
iptables -P INPUT       ACCEPT
iptables -P OUTPUT      ACCEPT
iptables -P FORWARD     ACCEPT
# Создадим новую цепочку и добавим туда все локальные адреса
iptables -N to_local_hosts
iptables -A to_local_hosts   -d 127.0.0.1/8      -j ACCEPT
iptables -A to_local_hosts   -d 193.125.142.0/23 -j ACCEPT
iptables -A to_local_hosts   -d 194.85.80.0/22   -j ACCEPT
iptables -A to_local_hosts   -d 192.168.0.0/16   -j ACCEPT
iptables -A to_local_hosts   -d 192.188.189.0/24 -j ACCEPT
iptables -A to_local_hosts   -d 172.16.0.0/12    -j ACCEPT
iptables -A to_local_hosts   -d 10.0.0.0/8       -j ACCEPT
iptables -A to_local_hosts   -d 81.5.64.0/18     -j ACCEPT
# Создадим аналогичную цепочку для исходящих пакетов
iptables -N from_local_hosts
iptables -A from_local_hosts -s 127.0.0.1/8      -j ACCEPT
iptables -A from_local_hosts -s 193.125.142.0/23 -j ACCEPT
iptables -A from_local_hosts -s 194.85.80.0/22   -j ACCEPT
iptables -A from_local_hosts -s 192.168.0.0/16   -j ACCEPT
iptables -A from_local_hosts -s 192.188.189.0/24 -j ACCEPT
iptables -A from_local_hosts -s 172.16.0.0/12    -j ACCEPT
iptables -A from_local_hosts -s 10.0.0.0/8       -j ACCEPT
iptables -A from_local_hosts -s 81.5.64.0/18     -j ACCEPT
# Создадим новую цепочку и внесём туда адреса всех надоедливых баннеров.
# В случае без NAT имеет смысл заменить все "-j DROP" на "-j REJECT --reject-with tcp-reset"
# для ускорения работы программ
iptables -N ban_banners
#ICQ ads
iptables -A ban_banners -d ads.web.aol.com  -j DROP
iptables -A ban_banners -s ads.web.aol.com  -j DROP
iptables -A ban_banners -d 205.188.165.185  -j DROP
iptables -A ban_banners -s 205.188.165.185  -j DROP
iptables -A ban_banners -d 213.155.151.0/24 -j DROP
iptables -A ban_banners -s 213.155.151.0/24 -j DROP
iptables -A ban_banners -s 80.67.86.9       -j DROP
iptables -A ban_banners -d 80.67.86.9       -j DROP
iptables -A ban_banners -s 80.67.86.6       -j DROP
iptables -A ban_banners -d 80.67.86.6       -j DROP
iptables -A ban_banners -s 84.53.182.81     -j DROP
iptables -A ban_banners -d 84.53.182.81     -j DROP
#counter.rambler.ru
iptables -A ban_banners -d 81.19.66.19 -j DROP
iptables -A ban_banners -s 81.19.66.19 -j DROP
#top100-images.rambler.ru
iptables -A ban_banners -d 81.19.70.8 -j DROP
iptables -A ban_banners -s 81.19.70.8 -j DROP
#ad.adriver.ru
iptables -A ban_banners -d 81.222.128.14 -j DROP
iptables -A ban_banners -s 81.222.128.14 -j DROP
#engine.awaps.net
iptables -A ban_banners -d 213.59.0.100 -j DROP
iptables -A ban_banners -s 213.59.0.100 -j DROP
#ad.bannerbank.ru
iptables -A ban_banners -d 195.161.119.245 -j DROP
iptables -A ban_banners -s 195.161.119.245 -j DROP
#top.list.ru
iptables -A ban_banners -d top.list.ru -j DROP
iptables -A ban_banners -s top.list.ru -j DROP
#top.mail.ru
iptables -A ban_banners -d 194.67.45.105 -j DROP
iptables -A ban_banners -s 194.67.45.105 -j DROP
#counter.yadro.ru
iptables -A ban_banners -d counter.yadro.ru -j DROP
iptables -A ban_banners -s counter.yadro.ru -j DROP
#spylog.com, spylog.ru, ..
iptables -A ban_banners -d 194.67.35.0/24 -j DROP
iptables -A ban_banners -s 194.67.35.0/24 -j DROP
#altastat.com
iptables -A ban_banners -d count1.altastat.com -j DROP
iptables -A ban_banners -s count1.altastat.com -j DROP
#begun.ru
iptables -A ban_banners -d 194.67.27.42 -j DROP
iptables -A ban_banners -s 194.67.27.42 -j DROP
#autocontext.begun.ru
iptables -A ban_banners -d autocontext.begun.ru -j DROP
iptables -A ban_banners -s autocontext.begun.ru -j DROP
#autoscroll.begun.ru
iptables -A ban_banners -d autoscroll.begun.ru -j DROP
iptables -A ban_banners -s autoscroll.begun.ru -j DROP
#www.youthcareer.ru
iptables -A ban_banners -d www.youthcareer.ru -j DROP
iptables -A ban_banners -s www.youthcareer.ru -j DROP
#www.danasoft.com
iptables -A ban_banners -d www.danasoft.com -j DROP
iptables -A ban_banners -s www.danasoft.com -j DROP
#imho.ru
iptables -A ban_banners -d 212.42.42.100 -j DROP
iptables -A ban_banners -s 212.42.42.100 -j DROP
#MSN Messenger banner
iptables -A ban_banners -d 207.68.178.61  -j DROP
iptables -A ban_banners -s 207.68.178.61  -j DROP
iptables -A ban_banners -d 207.68.178.239 -j DROP
iptables -A ban_banners -s 207.68.178.239 -j DROP
iptables -A ban_banners -d 65.54.239.214  -j DROP
iptables -A ban_banners -s 65.54.239.214  -j DROP
iptables -A ban_banners -d 65.54.239.24   -j DROP
iptables -A ban_banners -s 65.54.239.24   -j DROP
iptables -A ban_banners -d 65.54.239.144  -j DROP
iptables -A ban_banners -s 65.54.239.144  -j DROP
iptables -A ban_banners -d 65.54.194.118  -j DROP
iptables -A ban_banners -s 65.54.194.118  -j DROP
iptables -A ban_banners -d 65.54.195.185  -j DROP
iptables -A ban_banners -s 65.54.195.185  -j DROP
iptables -A ban_banners -d 207.68.178.16  -j DROP
iptables -A ban_banners -s 207.68.178.16  -j DROP


# Разрешим все пакеты, идущие через loopback-интерфейс
iptables -I INPUT 1 -i lo -j ACCEPT
# Разрешим все пакеты, идущие из домашней сети (при наличии второй сетевой карты)
iptables -I APPEND -i eth1 -j ACCEPT
# Выкинем все битые и странные пакеты
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
# Запретим доступ с некоторых IP-адресов (раскомментируйте нужные) (актуально при наличии samba-сервера)
# Пишут вирусы в расшаренные папки, пусть лечаться.:)
#iptables -A INPUT -i eth0 -s 193.125.143.106 -j DROP
#iptables -A INPUT -i eth0 -s 172.18.1.50 -j DROP
#iptables -A INPUT -i eth0 -s 193.125.143.49 -j DROP
# Создадим отдельную цепочку для компьтеров-ботов в Интернете (раскомментируйте нужные) (актуально при наличии web-сервера)
iptables -N bad_guys
# GET /user/soapCaller.bs
#iptables -A bad_guys -d 208.180.74.193 -j DROP
#iptables -A bad_guys -s 208.180.74.193 -j DROP
# GET /w00tw00t.at.ISC.SANS.DFind:)
#iptables -A bad_guys -d 89.190.33.45 -j DROP
#iptables -A bad_guys -s 89.190.33.45 -j DROP
# phpMyAdmin
#iptables -A bad_guys -d 195.26.11.148 -j DROP
#iptables -A bad_guys -s 195.26.11.148 -j DROP
# GET /w00tw00t.at.ISC.SANS.DFind:)
#iptables -A bad_guys -d 87.118.116.80 -j DROP
#iptables -A bad_guys -s 87.118.116.80 -j DROP
# GET /cacti/cmd.php
#iptables -A bad_guys -d 200.153.31.11 -j DROP
#iptables -A bad_guys -s 200.153.31.11 -j DROP
# POST /horde/admin/cmdshell.php
#iptables -A bad_guys -d 217.10.144.146 -j DROP
#iptables -A bad_guys -s 217.10.144.146 -j DROP
# GET /mailz, GET /horde, GET /README
#iptables -A bad_guys -d 132.248.160.34 -j DROP
#iptables -A bad_guys -s 132.248.160.34 -j DROP


# Непосредственно забаним баннеры
iptables -A INPUT -j ban_banners
iptables -A OUTPUT -j ban_banners
iptables -A FORWARD -j ban_banners


# Необходимо, чтобы избежать потерь пакетов из-за разных ограничений на их размеры
# Нужно только для NAT
#iptables -A FORWARD -p TCP --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# Разрешим куски фрагментированных пакетов
iptables -A INPUT -f -j ACCEPT
iptables -A OUTPUT -f -j ACCEPT
iptables -A FORWARD -f -j ACCEPT


# Разрешим доступ на все локальные адреса
iptables -A OUTPUT -j to_local_hosts
# Разрешим доступ в Интернет только для некоторых пользователей
# root  (исходящие ICMP пакеты проходят через это правило
iptables -A OUTPUT -m owner --uid-owner 0 -j ACCEPT
# beduser (считая, что у него uid 1000)
#iptables -A OUTPUT -m owner --uid-owner 1000 -j ACCEPT
# apache  (чтобы web-сервер был виден из Интернет)
#iptables -A OUTPUT -m owner --uid-owner 80 -j ACCEPT
# Запретим пользователя `portage`
# Актуально для Gentoo, чтобы emerge не лазил в Интернет
# Используем REJECT, чтобы wget сразу вываливался с ошибкой
#iptables -A OUTPUT -m owner --uid-owner 250 -j REJECT --reject-with icmp-host-unreachable


# Разрешим доступ к нашим сервисам (например, ssh, http, samba) из локальной сети
iptables -A INPUT -p TCP -m multiport --dports http,ssh,135:139,445 -j from_local_hosts
iptables -A INPUT -p UDP -m multiport --dports 135:139,445 -j from_local_hosts
# Разрешим доступ к нашему web-серверу со всего мира
#iptables -A INPUT -p TCP -m multiport --dports http -j bad_guys
#iptables -A INPUT -p TCP -m multiport --dports http -j ACCEPT
# Разрешим ICMP-запросы из локальной сети
iptables -A INPUT -p ICMP -j from_local_hosts
# Разрешим мультикаст
iptables -A INPUT -m addrtype --dst-type MULTICAST -j ACCEPT
iptables -A OUTPUT -m addrtype --dst-type MULTICAST -j ACCEPT
# Разрешим пакеты, пришедшие в ответ на отправленные нами (keep state)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ! NEW -j DROP
# Добавим правила для NAT
# (считаем, что 10.0.0.0/28 -- домашняя подсеть)
# Не будем пересылать пакеты, которые могли достигнуть адресата напрямую
#iptables -I FORWARD -i eth1 -d 10.0.0.0/28 -j DROP
# Перешлём остальные пакеты из домашней подсети
#iptables -A FORWARD -i eth1 -s 10.0.0.0/28 -j ACCEPT
# Перешлём пакеты в домашнюю подсеть
#iptables -A FORWARD -i eth0 -d 10.0.0.0/28 -j ACCEPT
#iptables -A FORWARD -i ppp0 -d 10.0.0.0/28 -j ACCEPT
# Собственно NAT.:)
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# Настроим проброс нескольких портов на машину из домашней подсети (например, чтобы на ней полноценно работали клиенты p2p-сетей)
# (считаем, что 10.0.0.3 -- адрес машины их домашней подсети)
#iptables -t nat -A PREROUTING -p TCP --dport 12345 -i ! eth1 -j DNAT --to 10.0.0.3:12345
#iptables -t nat -A PREROUTING -p UDP --dport 12345 -i ! eth1 -j DNAT --to 10.0.0.3:412345
# Поменяем политику по-умолчанию для каждой цепочки (выкинем все пакеты, которые были приняты раньше)
iptables -P INPUT       DROP
iptables -P OUTPUT      DROP
iptables -P FORWARD     DROP
# Включим маршрутизацию пакетов не дожидаясь перезагрузки
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
# Сохраним заданные правила, чтобы при загрузке они автоматически восстановились (только для Gentoo)
#/etc/init.d/iptables save
Личные инструменты