четверг, 19 августа 2010 г.

Настройка интернет-шлюза

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

Собсна управление пакетами в ubuntu реализовано через iptables. Очень мощный инструмент, но кнопать команды из консоли долго и трудоемко.
 
Дабы упростить управление пакетами через iptables есть замечательная обертка shorewall.

Итак, приступим-с...
Ставим shorewall:

$sudo apt-get install shorewall

Настраиваем. Настройки хранятся в /etc/shorewall. По началу он этот каталог "голый": есть только 2 файла. Начинаем настройку:

$sudo mcedit /etc/shorewall/shorewall.conf

устанавливаем два параметра: STARTUP_ENABLED=Yes и IP_FORWARDING=Yes

Определяем "зоны", с которыми будет общаться shorewall.Первая зона - локальная сеть, вторая зона - монструозный интернет, ну и служебная зона shorewall. О зонах shorewall узнает из файла zones. Как я уже говорил, shorewall изначально "голый", доп файло конфигурации можно взять в /usr/share/doc/shorewall-common/examples/.

Копипастим /usr/share/doc/shorewall-common/examples/two-interfaces/zones в к себе в конфиги (/etc/shorewall), ну и подправим как нам надо. Собсна, прописываем зоны shorewall`у

$sudo mcedit /etc/shorewall/zones


fw             firewall
net            ipv4
loc            ipv4


loc - зона локальной сети. Вся локальная сеть за исключением интернет-шлюза
net - любой компьютер вне локалки.
fw - firewall. Наш интернет-шлюз.


По умолчанию, политика shorewall: "запрещено все, что не разрешено". Эти политики определяются файлом policy. По этому копируем его к себе в /etc/shorewall

Политика по умолчанию нас вполне устраивает, доп разрешения определим позже. Итак, файл /etc/shorewall/policy должен выглядеть следующим образом:

loc    net    ACCEPT             # разрешены запросы из локальной сети в интернет
loc    $FW   REJECT     info   # будут отвергнуты запросы любого локального компьютера к файрволу

$FW  net     ACCEPT
$FW  loc     ACCEPT              # файрволу вообще все разрешено

net    all      DROP                 # все запросы из интернета просто дропаются

all     all      REJECT    info     # все что не попало под предыдущее правило, запрещено


ключ info означает политику логирования (/var/log/messages).

Концептуальные запреты определены, принцип "запрещено все, что не разрешено" сохраняется. Определим теперь управление "разрешено/запрещено". Для этого есть управляющий файл rules. При анализе пакета сначала ищется правило с этом файле, если там ничего нет - тогда срабатывают правила из policy.

Создаем управляющие правила:

sudo mcedit /etc/shorewall/rules

#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE     ORIGINAL     RATE            USER/
#                                                                        PORT    PORT(S)    DEST           LIMIT           GROUP

#Разрешаем пинговать между всеми сетями firewall
ACCEPT               all               fw               icmp       8         -
ACCEPT               fw               all               icmp       8         -

#Открытие http, https портов из шлюза в мир
Web(ACCEPT)      fw               net

#открываем ssh 
SSH(ACCEPT)       loc              fw

#разрешаем DNS запросы
DNS/ACCEPT        loc              fw
DNS/ACCEPT        loc              net
DNS/ACCEPT        fw               net

#разрешаем mysql запросы
ACCEPT               fw               fw                tcp       3306
ACCEPT               fw               fw                udp      3306

#разрешаем amavisd запросы
ACCEPT               fw               fw                 tcp      10025,10026
ACCEPT               fw               fw                 udp     10025,10026

#разрешаем синхронизацию времени ntpdate
ACCEPT               fw            loc:PDC_IP        udp     123

#domain logons
#Разрешаем полный доступ со стороны контроллера домена и обратно
#The next 4 lines enable unlimited access from the Primary Domain Controller
ACCEPT           loc:PDC_IP       fw                  tcp      #135,139,1024:65535
ACCEPT           loc:PDC_IP       fw                  udp     #137,138,1024:65535
ACCEPT               fw            loc:PDC_IP         tcp      #135,139,1024:65535
ACCEPT               fw            loc:PDC_IP         udp     #137,138,1024:65535

#Разрешаем доменную аутентификацию
# The next 4 lines open the box for share browsing, authentication
# and other MS stuff
ACCEPT               loc              fw                  tcp       135,139
ACCEPT               loc              fw                  udp      137,138
ACCEPT               fw               loc                 tcp       135,139
ACCEPT               fw               loc                 udp      137,138

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Основная настройка практически завершена. Осталось связать сетевые карты и зоны. Это определяется в interfaces.

$sudo mcedit /etc/shorewall/interfaces

###############################################################################
#ZONE   INTERFACE       BROADCAST       OPTIONS
net         ppp0               detect               dhcp,tcpflags,routefilter,nosmurfs,logmartians
loc         eth0                detect               tcpflags,nosmurfs
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE


Осталось настроить преобразования адресов. Для того, чтобы оно работало, правим файл masq

$sudo mcedit /etc/shorewall/masq

###############################################################################
#INTERFACE              SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK
ppp0                        eth0
#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

На этом все! Проверяем конфиг shorewall

$sudo shorewall check

ошибок быть не должно)


Чтобы shorewall запустился при старте, надо еще поправить файл:
$sudo mcedit /etc/default/shorewall

startup = 1;

Перегружаем shorewall

$sudo shorewall restart

Чтоб компьютеры из локалки могли спокойно серфить по инету, нам нужен pdnsd - кеширующий dns-сервер:

$sudo apt-get install pdnsd

При установке будет задан вопрос про тип конфигурации. Выбираем Manual и правим:

$sudo mcedit /etc/defaults/pdnsd

START_DAEMON = yes
AUDO_MODE 

затем

$sudo mcedit /etc/pdnsd.conf

секция global: меняем значение параметра server_ip на 192.168.10.1
(т.е. на IP-адрес карты eth0, которая смотрит в локальную сеть)

добавляем секции:
rr {
name = server_name;
ns = localhost;
a = 192.168.0.1;
}

server {
label = "mydns";
ip    = 208.67.222.222; - это IP-адрес OpenDNS-сервера, сюда можно записать адрес, выдаваемый провайдером
proxy_only = off;
}

Все остальное из файла убираем


- секция rr определяет разрешение локальных ресурсов
- секция servers указывает на внешние dns-сервера


Добавим защиту от "особо умных" кулхацкеров. Будем помещать этих умников в blacklist`ы.
Копируем /usr/share/doc/shorewall/default-config/blacklist в к себе в конфиги (/etc/shorewall) и правим:


$sudo mcedit /etc/shorewall/blacklist

#ADDRESS/SUBNET    PROTOCOL     PORT
85.105.121.99
189.7.89.84
93.178.192.105
113.88.50.71
59.58.240.104
- загоняем IP адреса всех "умников" и спамеров, которые мешают нам жить

Далее настраиваем политики обработки blacklist`a shorewall`лом:
$sudo mcedit /etc/shorewall/shorewall.conf
BLACKLIST_DISPOSITION=REJECT
BLACKLIST_LOGLEVEL = 
BLACKLISTNEWONLY=Yes

BLACKLISTNEWONLY=Yes - проверка осуществляется только для новых запросов на установление соединения (Yes), проверка осуществляется для всех запросов на установление соединения + распространяется на уже установленные соединения.
BLACKLIST_DISPOSITION=REJECT - Пакеты с хостов из чёрного списка будут отбрасываться без уведомления (drop) или с уведомлением (reject).

Теперь указываем какие интерфейсы необходимо пропускать через blacklist:

$$sudo mcedit /etc/shorewall/interfaces

#ZONE    INTERFACE          BROADCAST         OPTIONS
net         ppp0                  detect                  dhcp,tcpflags,nosmurfs,routefilter,logmartians,blacklist
loc         eth0                   detect                  tcpflags,nosmurfs,routefilter,logmartians




На этом все! Интернет-шлюз готов к использованию!!!