Настройка фаерволла (firewall брандмауэра) в Linux и BSD
Материал из МФТИ-телеком.
Содержание |
[править] Условия и цель
Дано:
- Компьютер: Linux
- Сетевые карты: 1 или 2
- Подключение к интернет: с использованием VPN (PPTP)
- Домашняя сеть: если 2 сетевые карты, то есть
- Внешний IP-адрес: реальный
Цель:
- Защититься от непрошенных гостей из интернета
- Сделать NAT, чтобы компьютеры в домашней сети тоже имели доступ в Интернет
[править] Установка и настройка
[править] Условные обозначения
| eth0 | Интерфейс, смотрящий в локальную сеть |
| eth1 | Интерфейс, смотрящий в домашнюю сеть (если есть) |
| ppp0 | VPN подключение к Интернет |
[править] Linux
Разобьём весь долгий путь на несколько шагов:
- Сборка ядра с нужными опциями
- Установка необходимых программ
- Непосредственно настройка правил для фаерволла
Эти шаги в целом одинаковы для различных дистрибутивов, руководство написано на примере 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
