LinuxForum.Fans
Тема

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

Автор: forkostya 35 сообщений 46004 просмотров
#1447

Автор: Кузнецов Константин

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

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

----------------------------------------------------------------------------

1. Введение

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


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

----------------------------------------------------------------------------

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

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

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

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

РЕШЕНИЕ:
1). Для того, чтобы разрешить FORWARDING пакетов, необходимо:
а) установить значение "1" в файле /proc/sys/net/ipv4/ip_forward. При загрузке оно меняется на "0", так что можно устанавливать это значение в скрипте коммандой

text
echo "1" > /proc/sys/net/ipv4/ip_forward

либо через sysctl. Для этого идем в файл /etc/sysctl.conf и раскомментируем строчку:

net.ipv4.ip_forward=1

б) разрешить в файерволе в цепочке FORWARD таблицы FILTER проходить всем

text
iptables -P FORWARD ACCEPT

или только определенным пакетам

text
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 мы сможем так

text
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

или так

text
iptables -t nat -A POSTROUTING -d ! 192.168.0.0 -j MASQUERADE

или так

text
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-адрес, то настроить SNAT мы сможем так

text
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 62.5.246.190

или так

text
iptables -t nat -A POSTROUTING -d ! 192.168.0.0 -j SNAT --to-source 62.5.246.190

или так

text
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 будут выглядеть так

text
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80,110 -j DNAT --to-destination 192.168.0.4

или так

text
iptables -t nat -A PREROUTING -p tcp -d 62.5.246.190 --dport 80,110 -j DNAT --to-destination 192.168.0.4

или так

text
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 будет выглядеть проще, чем было:

text
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 отбрасывает пакет, т.к. он ничего не ждет от сервера, он ждет от шлюза.
По-этому нам нужно будет изменить и адрес отправителя, например так:

text
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:

text
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128

2. Все бы хорошо, но что если наш шлюз и сам выступает в роли web-сервера? Тогда все запросы к нему на 80 порт будут заворачиваться на порт 3128 и наш сайт станет недоступным, т.к. он висин на 80 а не на 3128. Можно, конечно изменить правило так, чтобы перенаправлялись на порт 3128 только те пакеты, которые не предназначены для нашего шлюза так:

text
а) 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

А если они по внешнему адресу будут пытаться заходить? Тогда добавим это?

text
б) 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 порт на этот сервер. В этом случае они даже не дойдут до правила с перенаправлением порта.

text
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. Проброс порта в пределах одной сети (DNAT + SNAT)

Этот случай рассмотрим на примере сайта domain.ru. Допустим, мы хотим посылать запросы из дома на 80 tcp порт нашего сервера (web) и видеть там domain.ru. Для этого необходимо:
1. Узнать ip-адрес mtuci.ru (nslookup domain.ru или просто ping domain.ru)
2. Установить правило в цепочке PREROUTING, которое будет перенаправлять запросы (DNAT) на ip-адрес domain.ru

text
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination ip.ip.ip.ip

3. Установить правило в цепочке POSTROUTING, которое будет изменять отправителя на себя (на внешний адрес нашего сервера-шлюза), иначе ответы с domain.ru будут слаться напрямую, и наш компьютер, не ждавший их от него, отбросит, он ведь ждет ответ с нашего сервера, а не с domain.ru

text
iptables -t nat -A POSTROUTING -p tcp -d ip.ip.ip.ip --dport 80 -j SNAT --to-source 62.5.246.190

Черный список
В логах ssh вы увидели, что постоянно с одного ip-адресы кто-то пытается угадать пароль на протяжении длительного времени. С помощью нашего файервола мы можем блокировать запросы с определенных адресов. Например:

text
iptables -t nat -A PREROUTING -p tcp -s ip.ip.ip.ip -j DROP

Если мы сделаем -j REJECT, то удаленный компьютер получит уведомление об отбросе соединения и попытается понять, чем оно было вызвано. Рано или поздно он методом перебора критериев сменит и ip-адрес. А если мы сделаем -j DROP, то он ничего не получит в ответ, как будто наш компьютер выключен.
Но самое правильное действие - изначально настраивать файервол как можно конкретнее, т.е. если вы и разрешаете соединения на 22 порт (ssh), то только для определенного компьютера (вашего
домашнего ip-адреса) или только из локальной сети. Для всех остальных соединений - По-умолчанию DROP.

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

text
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Остальное - дополнительные возможности для "особых" ситуаций.

----------------------------------------------------------------------------

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

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

#2336

в статье встречаются "или так" ... "Или так"... А в чем разница не указано..

#2360

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

Протокол (-p)
Ip-адрес отправителя (-s)
Порт отправителя (--sport)
Ip-адрес получателя (-d)
Порт получателя (--dport)
Состояние (новый, ответный и т.п.) (-m state --state)
На какой интерфейс пришло (-i)
С какого интерфейса уходит (-o)
это должно быть очевидно, но могу поправить, если скажете как :)
#174485

А что за адрес 62.5.246.190 указывается в настройках?

forkostya написал:
или так
text
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 - наш внутренний адрес шлюза.

#174489

Подправьте статью вы не где не указываете маску!

#174497

Kettler, а по моему вопросу ничего не скажете?

#174511

62.5.246.190 ип адрес который вам даёт провайдер.
Если у вас динамический тогда проще
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

#174516

Kettler, у меня например ADSL-модем. Внутренний IP-адрес модему я назначаю сам, внешний IP-адрес модему назначает провайдер, он динамический. Модем хочу пропустить через сервер с двумя сетевушками. Как его настроить?

-------------- Upd --------------
Накидал примерную схему подключения к настраиваемому proxy-серверу:

#174648
text
#!/bin/bash
echo "1" > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F
iptables -F -t nat
iptables -F -t mangle

iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT

#SNAT iptables -t nat -A POSTROUTING -s 192.168.51.0/24 -j SNAT --to-source 192.168.61.1 iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#174672

Kettler, спасибо. А более подробные статьи на эту тему не подскажете?

#175580

Kettler, а этот скрипт никак не блокирует пакеты на сетевой карте, смотрящей в локальную сетку? Дело в том, что пока модем подключен к свитчу, и модем указывается как шлюз на каждой машине, где нужен интернет. Для сервера на сетевой карте которая смотрит в локалку, тоже указал шлюз, проставил DNS, но интернета нету. Хотя раньше интернет был.

#175582

Нет. Проверяй ип адреса.

#175665

Kettler, пинг на сервер и модем идет нормально. Во всем офисе есть интернет. На сервере нету. Перед этим настраивал только samba.

#175695

на сервере какие айпи адреса?

И пока отчисти всё

iptables -F
iptables -F -t nat

как соберёшь выше схему потом пробуй скрипт в деле.

#175811

Kettler, интернет теперь есть, но все равно пропадает через раз. И непонятно почему. Вроде сетевая карта, через которую сервер получает интернет, работает нормально.

#176125

А не оттого ли проблемы с интернетом, что я не поставил DNS-сервер? И еще одно отличие, от предыдущих установок - дополнительно поставил firmware-linux, firmware-linux-free firmware-linux-nonfree.

#176126
Nigelist написал:
А не оттого ли проблемы с интернетом, что я не поставил DNS-сервер? И еще одно отличие, от предыдущих установок - дополнительно поставил firmware-linux, firmware-linux-free firmware-linux-nonfree.

да нет

#176133

Kettler, не подскажете в каком направлении рыть? Первый раз сталкиваюсь с этой проблемой.

#176152

ping 8.8.8.8 минут пять делай.
Опиши подробнее.

Войдите или зарегистрируйтесь, чтобы ответить.