1 (23.02.2010 20:54:25 отредактировано forkostya)

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

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

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

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

[size=6]1. Введение[/size]

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

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

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

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

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

ЗАДАЧА:
Допустим, во внутренней сети есть 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-адрес, то настроить 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 - наш внутренний адрес шлюза.

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

[size=6]3. Проброс порта в локальную сеть (DNAT)[/size]

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

ЗАДАЧА:
Допустим, во внутренней сети есть 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 в нужном для него виде.

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

[size=6]4. Перенаправление порта[/size]

Если мы хотим использовать наш прокси-сервер в прозрачном режиме (без явного указания прокси-серверов в клиентском ПО), то для этого необходимо добавить некоторые правила в файерволе:
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

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

[size=6]5. Проброс порта в пределах одной сети (DNAT + SNAT)[/size]

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

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

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

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

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

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

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

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

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

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

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

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

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

2

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

В начале было слово...

3

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

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

это должно быть очевидно, но могу поправить, если скажете как ab

4

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

forkostya пишет:

или так

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

5

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

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

6

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

7

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

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

8 (05.07.2011 09:07:20 отредактировано Nigelist)

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

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

http://10pix.ru/img1/4583/4888064.th.png

9

#!/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
Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

10

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

11

http://www.opennet.ru/docs/RUS/iptables/

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

12

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

13

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

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

14

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

15 (08.07.2011 16:13:41 отредактировано Kettler)

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

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

iptables -F
iptables -F -t nat

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

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

16

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

17 (11.07.2011 08:37:42 отредактировано Nigelist)

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

18

Nigelist пишет:

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

да нет

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

19

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

20

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

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

21

Nigelist пишет:

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

покажите  вывод ifconfig ethX где X ваш сетевой интерфейс к которому подключен интернет.

It is good day to die ...
MS Windows 10
Заметки о главном...

22

Kettler пишет:

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

Подробнее описать что?
Вот выхлоп пинга:

+ открыть спойлер

 Консоль:
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=48 time=138 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=48 time=207 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=48 time=216 ms
64 bytes from 8.8.8.8: icmp_req=4 ttl=48 time=198 ms
64 bytes from 8.8.8.8: icmp_req=5 ttl=48 time=215 ms
64 bytes from 8.8.8.8: icmp_req=6 ttl=48 time=214 ms
64 bytes from 8.8.8.8: icmp_req=7 ttl=48 time=215 ms
64 bytes from 8.8.8.8: icmp_req=8 ttl=48 time=217 ms
64 bytes from 8.8.8.8: icmp_req=9 ttl=48 time=259 ms
....
64 bytes from 8.8.8.8: icmp_req=330 ttl=48 time=224 ms
64 bytes from 8.8.8.8: icmp_req=331 ttl=48 time=255 ms
64 bytes from 8.8.8.8: icmp_req=332 ttl=48 time=232 ms
64 bytes from 8.8.8.8: icmp_req=333 ttl=48 time=227 ms
64 bytes from 8.8.8.8: icmp_req=334 ttl=48 time=235 ms
64 bytes from 8.8.8.8: icmp_req=335 ttl=48 time=226 ms
64 bytes from 8.8.8.8: icmp_req=336 ttl=48 time=229 ms
64 bytes from 8.8.8.8: icmp_req=337 ttl=48 time=222 ms
64 bytes from 8.8.8.8: icmp_req=338 ttl=48 time=196 ms
64 bytes from 8.8.8.8: icmp_req=339 ttl=48 time=144 ms
64 bytes from 8.8.8.8: icmp_req=340 ttl=48 time=196 ms
64 bytes from 8.8.8.8: icmp_req=341 ttl=48 time=290 ms
64 bytes from 8.8.8.8: icmp_req=342 ttl=48 time=199 ms
64 bytes from 8.8.8.8: icmp_req=343 ttl=48 time=260 ms
64 bytes from 8.8.8.8: icmp_req=344 ttl=48 time=206 ms
64 bytes from 8.8.8.8: icmp_req=345 ttl=48 time=251 ms
^C
--- 8.8.8.8 ping statistics ---
346 packets transmitted, 233 received, +109 errors, 32% packet loss, time 345674ms
rtt min/avg/max/mdev = 114.755/259.251/765.278/128.101 ms, pipe 4

i2ks пишет:

покажите  вывод ifconfig ethX где X ваш сетевой интерфейс к которому подключен интернет.

Вот

+ открыть спойлер

 Консоль:
ifconfig eth0
eth0      Link encap:Ethernet  HWaddr d0:27:88:19:e6:2d
          inet addr:192.168.29.4  Bcast:192.168.29.255  Mask:255.255.255.0
          inet6 addr: fe80::d227:88ff:fe19:e62d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:84938 errors:0 dropped:0 overruns:0 frame:0
          TX packets:155834 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6085279 (5.8 MiB)  TX bytes:224257912 (213.8 MiB)
          Interrupt:26 Base address:0xc000

23 (11.07.2011 12:18:46 отредактировано i2ks)

Nigelist пишет:

346 packets transmitted, 233 received, +109 errors, 32% packet loss, time 345674ms

проблема с физикой или оборудованием не может быть?  oO
хотя в выхлопе ifconfig счетчики об ошибках молчат.

А если с модема по пинговать тот же ip?

It is good day to die ...
MS Windows 10
Заметки о главном...

24 (11.07.2011 12:32:45 отредактировано Nigelist)

i2ks пишет:

проблема с физикой или оборудованием не может быть? oO
хотя в выхлопе ifconfig счетчики об ошибках молчат.

А если с модема по пинговать тот же ip?

Пинговал с другой машины IP-адрес сервера, по которому сервер получает интернет.
Сейчас гляну, сколько будет ошибок:

+ открыть спойлер

 Консоль:
ping 192.168.29.4 /t

Обмен пакетами с 192.168.29.4 по 32 байт:

Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
...
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
Ответ от 192.168.29.4: число байт=32 время=2мс TTL=64
Ответ от 192.168.29.4: число байт=32 время=2мс TTL=64
Ответ от 192.168.29.4: число байт=32 время=2мс TTL=64
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64
Ответ от 192.168.29.4: число байт=32 время<1мс TTL=64

Статистика Ping для 192.168.29.4:
      Пакетов: отправлено = 252, получено 252, потеряно = 0 (0% потерь),
Приблизительное время приема-передачи в мс:
      Минимальное: = 0мсек, Максимальное = 3 мсек, Среднее = 0 мсек

25

Nigelist, здесь то видно то что все в порядке. А с этого клиета в мир есть доступ? если сделать так: ping 8.8.8.8 тот же результат будет?

It is good day to die ...
MS Windows 10
Заметки о главном...

26

i2ks, нормально пинг проходит:

http://10pix.ru/img1/4932/4954444.th.png

27

http://ru.wikipedia.org/wiki/Iptables  smile

Диагноз: Gentoo'шник в стадии ремиссии. Лечению не поддаётся.

28 (11.07.2011 16:27:12 отредактировано Kettler)

? подскажите ваш тонкий намёк.

Nigelist mtu 1500 в сети?
Попробуй ещё такое правило.
iptables -I OUTPUT -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

29

Kettler пишет:

Nigelist mtu 1500 в сети?

Nigelist пишет:

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

о как =)

It is good day to die ...
MS Windows 10
Заметки о главном...

30 (11.07.2011 16:48:25 отредактировано Kettler)

не заметил) но надеюсь в сети такое же

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.