пятница, 28 декабря 2012 г.

Брандмауэр - шлюз в интернет для локальной сети (iptables)


Брандмауэр - шлюз в интернет для локальной сети (iptables)


План:

1. Введение
2. Шлюз - маршрутизация с подменой адреса (SNAT)
3. Проброс порта в локальную сеть (DNAT)
4. Перенаправление порта (REDIRECT)
5. Используемые и рекомендуемые источники

1. Введение


Что делать, если компьютеров много, а провайдер выделил только 1 ip-адрес для доступа в интернет?
Как защитить компьютеры локальной сети от атак из интернета?
Как предоставить доступ внешним пользователям к внутренним ресурсам сети?

На все эти вопросы мы с вами сможем ответить, научившись настраивать шлюз.
В отличие от предыдущего раздела, теперь нам необходимо работать с пакетами, не предназначенными компьютеру, на котором установлен брандмауэр. Ничего сложного в этом нет.
Мы будем рассматривать новую таблицу NAT (цепочки PREROUTING, POSTROUTING) и цепочку FORWARD из уже знакомой нам таблицы FILTER.
Через цепочку FORWARD будут проходить пакеты, предназначенные не для нашего сервера (forwarding), в цепочке PREROUTING мы будем менять информацию о получателе пакета (DNAT), а в цепочке POSTROUTING - об отправителе (SNAT).

2. Шлюз - маршрутизация с подменой адреса (SNAT)


ДАНО:
Допустим, у нас есть две сети (eth1 - внутренняя и eth0 - Интернет) и, соответственно, два провода, входящие в одну машину (предполагаемый шлюз).

ЗАДАЧА:
Допустим, во внутренней сети есть N компьютеров, к которым нужно подключить Интернет (через наш шлюз).

ПЛАН РЕШЕНИЯ:
1). Разрешить forwarding пакетов
По-умолчанию компьютер не пропускает сквозь себя пакеты из разных сетей.
2). Настроить SNAT для всех пакетов, которые уходят в Интернет
SNAT - подмена адреса отправителя на свой. Иначе наш получатель не сможет однозначно идентифицировать, кому отправлять ответ.

РЕШЕНИЕ:
1). Для того, чтобы разрешить FORWARDING пакетов, необходимо:
а) установить значение "1" в файле /proc/sys/net/ipv4/ip_forward. При загрузке оно меняется на "0", так что можно устанавливать это значение в скрипте коммандой
echo "1" > /proc/sys/net/ipv4/ip_forward
либо через sysctl. Для этого идем в файл /etc/sysctl.conf и раскомментируем строчку:
net.ipv4.ip_forward=1
б) разрешить в файерволе в цепочке FORWARD таблицы FILTER проходить всем
iptables -P FORWARD ACCEPT
или только определенным пакетам
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp --doprt 80 -J ACCEPT
iptables -A FORWARD -p tcp --doprt 110 -J ACCEPT
iptables -A FORWARD -s 192.168.0.4 -j ACCEPT

2). Если наш профайдер выделил нам
а) динамический ip-адрес, то настроить SNAT мы сможем так
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
или так
iptables -t nat -A POSTROUTING -d ! 192.168.0.0 -j MASQUERADE
или так
iptables -t nat -A POSTROUTING -s 192.168.0.0 -d ! 192.168.0.1 -j MASQUERADE

где 192.168.0.0 - наша локальная подсеть, а 192.168.0.1 - наш внутренний адрес шлюза.
б) статический ip-адрес, например 62.5.246.190, то настроить SNAT мы сможем так
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 62.5.246.190
или так
iptables -t nat -A POSTROUTING -d ! 192.168.0.0 -j SNAT --to-source 62.5.246.190
или так
iptables -t nat -A POSTROUTING -s 192.168.0.0 -d ! 192.168.0.1 -j SNAT --to-source 62.5.246.190

где 192.168.0.0 - наша локальная подсеть, а 192.168.0.1 - наш внутренний адрес шлюза.

3. Проброс порта в локальную сеть (DNAT)


ДАНО:
Допустим, у нас есть две сети (внутренняя и Интернет) и, соответственно, два провода, входящие в одну машину (уже настроенный шлюз).

ЗАДАЧА:
Допустим, во внутренней сети есть 2 сервера (web и почтовый), к которым необходимо подключаться из Интернета (из дома, например).

ПЛАН РЕШЕНИЯ:
1). Настроить DNAT для всех пакетов, пришедших из Интернета на 80 (web) и 110 (почта) порты, и перенаправить их на соответствующие внутренние адреса серверов.

РЕШЕНИЕ:
1). Допустим, что оба сервиса (web и почта) висят на одном сервере (192.168.0.4), тогда правила DNAT будут выглядеть так
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80,110 -j DNAT --to-destination 192.168.0.4
или так
iptables -t nat -A PREROUTING -p tcp -d 62.5.246.190 --dport 80,110 -j DNAT --to-destination 192.168.0.4
или так
iptables -t nat -A PREROUTING -p tcp -s ! 192.168.0.0 --dport 80,110 -j DNAT --to-destination 192.168.0.4

Выбирайте более предпочтительный для себя вариант.
Если мы собираемся с внутрисетевых компьютеров подключаться к web и почтовому серверу так же через наш внешний адрес (такое может быть, если заходить по доменному имени сайта, которое связано с внешним адресом шлюза), то тут необходимо переделать правило DNAT и дописать еще одно правило SNAT.
Правило DNAT будет выглядеть проще, чем было:
iptables -t nat -A PREROUTING -p tcp --dport 110,80 -j DNAT --to-destination 192.168.0.4
Еще одно правило SNAT необходимо для того, чтобы ответные пакеты с почтового или web-сервера слались так же на шлюз. Объясняю:
а) На компьютере1 формируется пакет (отправитель: компьютер1, получатель: шлюз, порт: 110)
б) На шлюзе он ловится и изменяется (отправитель: компьютер1, получатель: сервер, порт:110)
в) На сервере он ловится и отсылается ответ (отправитель: сервер, получатель: компьютер1, с порта: 110)
г) Компьютер1 отбрасывает пакет, т.к. он ничего не ждет от сервера, он ждет от шлюза.
По-этому нам нужно будет изменить и адрес отправителя, например так:
iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d 192.168.0.4 --dport 110,80 -j SNAT --to-source 192.168.0.1

А шлюз, получив ответный пакет, сам его изменит и переправит компьютеру1 в нужном для него виде.

4. Перенаправление порта


Если мы хотим использовать наш прокси-сервер в прозрачном режиме (без явного указания прокси-серверов в клиентском ПО), то для этого необходимо добавить некоторые правила в файерволе:
1. Добавляем правила перенаправления портов. Наш файервол слушает соединения на порте tcp 3128. Мы хотим, чтобы все запросы из нашей локальной сети на удаленные web-сервера проходили через прокси. Для этого мы добавляем правило в цепочку PREROUTING:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
2. Все бы хорошо, но что если наш шлюз и сам выступает в роли web-сервера? Тогда все запросы к нему на 80 порт будут заворачиваться на порт 3128 и наш сайт станет недоступным, т.к. он висит на 80 а не на 3128. Можно, конечно изменить правило так, чтобы перенаправлялись на порт 3128 только те пакеты, которые не предназначены для нашего шлюза так:
а) iptables -t nat -A PREROUTING -p tcp -s 192.168.0.0/24 -d ! 192.168.0.1 --dport 80 -j REDIRECT --to-ports 3128
А если они по внешнему адресу будут пытаться заходить? Тогда добавим это?
б) iptables -t nat -A PREROUTING -p tcp -s 192.168.0.0/24 -d ! 62.5.246.190 --dport 80 -j REDIRECT --to-ports 3128
Этого делать не стоит. Представим, что пользователь пытается зайти на наш web-сервер из внутренней сети по внутреннему адресу 192.168.0.1:80. Файервол пойдет по правилам с этим пакетом. Правило (а) он пройдет мимо, а вот на правиле (б) он применит политику на пакет и изменит порт назначения на 3128. Таким образом, у нас будет сайт доступен либо только по внешнему адресу, либо только по внутреннему. Т.е. в одном правиле указать оба адреса (чтобы было или внутренний или внешний) не получится (начиная с версии iptables 1.4.5 можно http://www.opennet.ru/opennews/art.shtml?num=23472). Как же тогда быть? Очень просто: добавим вперед правила, разрешающие прием пакетов на 80 порт на этот сервер. В этом случае они даже не дойдут до правила с перенаправлением порта.
iptables -t nat -I PREROUTING 1 -p tcp -d 192.168.0.1 --dport 80 -j ACCEPT
iptables -t nat -I PREROUTING 1 -p tcp -d 62.5.246.190 --dport 80 -j ACCEPT

5. Используемые и рекомендуемые источники 


Руководство по iptables (Iptables Tutorial 1.1.19)

3 комментария:

  1. друзья, в последнее время наблюдаю огромный наплыв посетителей именно на эту страницу и именно из Украины. С чем это связано?

    ОтветитьУдалить
  2. Приветствую! Наплыв, ибо пилят шлюзы на убунте))) Всё дорожает, вот и раскидываем адсл на офис из 50 или более машин)) Спасибо.

    ОтветитьУдалить
  3. Ну хоть отпишитесь тогда, полезно ли. Если бы был фидбэк, я бы не забрасывал, а вёл бы блог

    ОтветитьУдалить