Модераторы: powerfox, pythonwin, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Firewall, маршрутизатор и NAT, Начинаем работать с netfilter, iptables 
:(
    Опции темы
Imple
Дата 21.8.2008, 10:03 (ссылка) |    (голосов:9) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

Репутация: 18
Всего: 87



Защищаем свой компьютер, настраиваем маршрутизатор и NAT

Поговорим о теме, которая, думаю, будет интересна многим начинающим Linux-пользователям.

Охватим следующие вопросы:
  •  как настроить Firewall - закрыть доступ с определенных адресов, закрыть доступ на некоторые порты, и т.д.
  •  как превратить свой Linux PC в полноценный IP маршрутизатор
  •  как выпустить свою серую сеть в Internet - настройка NAT'а
Постараюсь объяснить все это крайне простым языком, на пальцах, для того чтобы начинающие пользователи навсегда перестали бояться страшных слов iptables, nat и т.д. Тема наверняка уже поднималась много раз, но лишняя статья еще пока никому не помешала. Начнем с самого простого:

Что такое netfilter и iptables?
Netfilter — межсетевой экран (брандмауэр), встроен в ядро Linux версий 2.4 и 2.6. Он выполняет следующие функции:
  •  Фильтрация трафика
  •  NAT
Грубо говоря, netfilter это встроенный фаервол в ядре linux'а. 

iptables - утилита для управления этим самым netfilter'ом.

Что происходит с пакетом, попавшим в сетевую подсистему linux?
Итак, у нас есть некая программа которая генерирует трафик, т.е. обращается к каким либо ресурсам в локальной сети, или сети Internet. Второй вариант - этот трафик к нам поступает извне - подключение удаленных пользователей к нашему почтовому серверу, хакерская атака на SSH и т.д. Либо, третий вариант: проходящий через нашу linux-машину трафик в Internet от компьютеров в локальной сети и обратно. В данном случае - наша linux машина выполняет функцию маршрутизатора. Во всех трех случаях, пакет проходит через netfilter. На данном этапе, мы можем выполнять множество операций с пакетом - отклонить или пропустить его, произвести подмену IP-адреса, для NAT'а, и многое другое.

iptables (от IP-таблицы) управляет таблицами и цепочками, которые содержат определнные нами правила, под обработку которых попадет каждый пакет данных. Например, есть таблица NAT, в которой содержатся правила NAT'а. Есть таблица FILTER, в которой содержатся правила фильтрации трафика.

Весь путь пакета выглядит так:
1. Пакет данных поступает в ядро (от другого компьютера в сети, запущенной у нас программы, и т.д.)
2. Происходят действия, называемые пре-маршрутизацией. Используется таблица NAT.
3. Происходит фильтрация - ряд правил, по которым пакет будет либо отброшен, либо пропущен дальше. Используется таблица FILTER.
4. Происходят действия, называемые пост-маршрутизацией. Используется таблица NAT.
5. Пакет передается в пункт назначения.

Пункты 2 и 4, нам интересны если наша машина является маршрутизатором и мы используем NAT. Пункт 3 - интересен для фильтрации трафика. Теперь разложим все по полочкам.

Основы iptables
Как было сказанно - iptables управляет набором таблиц (table). В каждой таблице есть набор цепочек (chain). Каждая цепочка - упорядоченный набор правил обработки пакета. В каждой linux-системе существует четыре таблицы:
  •  FILTER
  •  NAT
  •  MANGLE
  •  RAW
Таблица FILTER служит для фильтрации трафика, и состоит из трех стандартных цепочек:
  •  INPUT - служит для фильтрации входящего трафика на нашу машину. К примеру в эту цепочку попадает трафик из Internet, на наш почтовый сервер. Именно она интересна более всего новичкам.
  •  OUTPUT - служит для фильтрации исходящего трафика от нашей машины. В эту цепочку попадет трафик от нашего почтового сервера в Internet. Представляет меньше интереса, используют ее для ограничения пользователей компьютера от посещения определенных ресурсов, и т.д.
  •  FORWARD - служит для фильтрации проходящего трафика через нашу машину. Представляет интерес, если наша машина является маршрутизатором.
Все эти цепочки заполняются правилами. При попадании пакета в цепочку, пакет проходит сверху вниз, пока не найдет правила, которому он отвечает. Правило - набор условий и действие, которое следует выполнить, в случае соответствия пакета всем условиям.
К примеру, эти условия подошли бы для цепочки INPUT таблицы FILTER:
  • Запретить доступ с компьютера 192.168.0.1 на мой компьютер, на порты 25, 80 и 110.
  • Полностью запретить доступ с компьютера 10.0.0.1 на мой компьютер
  • Разрешить доступ
Эти простые правила будут рассматриваться сверху вниз - сначала проверяется, не старается ли злобный 192.168.0.1 проникнуть в наши web и mail системы? Нет? А не тот ли это злобый h4x0r 10.0.0.1 который вчера мне пароль к SSH пытался подобрать? Нет, не он? Ну тогда проходи.

А эти правила, для цепочки FORWARD таблицы FILTER:
  • Запретить проход любого трафика из сети 192.168.2.0/24 на сервер ICQ
  • Разрешить проход любого трафика из интернета на компьютеры из сети 192.168.2.0/24
  • Разрешить проход любого трафика с компьютеров 192.168.2.0/24 в интернет
  • Запретить проход любого трафика
Опять - сверху вниз. Не старается ли ленивый сотрудник поболтать в ICQ? Старается? Ну тогда не дадим ему этого. Ну, остальное то своим сотрудникам мы разрешим? Разрешим... пусть все остальное юзают. А вот другим сетям, особенно злобной бухгалтерии и складовщикам фигушки а не интернет. Никому больше ничего не дадим!!!

Фильтрация трафика
Что нам остается? Перевести наши умозаключения из человеческой формы, в язык iptables.
Каждое правило добаляется запуском одной комманды, имеющей следующий вид:

iptables -t таблица -A цепочка правило -j действие

Разберем. Здесь "iptables" - бинарник. "-t" - от table, указание таблицы, с которой мы хотим работать. "-A" сокращение от append - добавить в такую то цепочку, такое то правило. "-j" - от jump, выполнить такое-то действие. Если вам нужна таблица FILTER, ее можно не указывать, так как она подразумевается по умолчанию.

К примеру, добавим такие правила:
Код
iptables -A INPUT -s 192.168.0.1 -p tcp --dport 25 -j DROP
iptables -A INPUT -s 192.168.0.1 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 192.168.0.1 -p tcp --dport 110 -j DROP
iptables -A INPUT -s 10.0.0.1 -i eth1 -j DROP
iptables -A INPUT -j ACCEPT


Разберем детально. Первыми тремя правилами, мы блокируем (-j DROP, отбросить) доступ к нам с (-s, от source, источник) 192.168.0.1 на tcp (-p tcp, от protocol, протокол) порты (--dport, от destination port, порт назначения) 25,80,110. Четвертым правилом, мы не указываем протокол, порты, но указываем сетевой интерфейс, по которому пришел пакет (-i eth1, от interface, интерфейс). Неважно что это, но если оно с eth1 и адреса 10.0.0.1 - оно должно быть отброшено. Пятым правилом, мы не задаем условий, мы просто разрешаем (-j ACCEPT, позволить) весь остальной трафик.

Посмотреть на результаты наших усилий можно следующей коммандой:
Код

iptables -L -n --line-numbers

Разберем и эту комманду. "-L" - вывести список правил. "-n" - не производить DNS-резолвинг. "--line-numbers" - вывести рядом с каждым правилом его порядковый номер.

Вы спросите - а что если пакет дойдет до самого низа цепочки, и так не ответит ни одному из правил? Все очень просто - у каждой цепочки есть действие по умолчанию. ACCEPT, DROP, либо аналогичное. В выводе списка правил, вы можете его заметить (policy, рядом с названием цепочки).

Управлять правилами в таблице тоже очень просто.

Добавить некое правило в конец цепочки INPUT:
Код

iptables -A INPUT -s 10.0.0.2 -j ACCEPT


Вставить некое правило в позицию 3 цепочки INPUT:
Код

iptables -I INPUT 3 -s 10.0.0.2 -j ACCEPT


Удалить правило номер 2 из цепочки INPUT:
Код

iptables -D INPUT 2


Очистить целиком всю цепочку INPUT:
Код

iptables -F INPUT


Внимательный читатель этой статьи и man-а, уже догодался как управлять маршрутизацией трафика. Все тоже самое, только уже не в цепочке INPUT, а в цепочке FORWARD. К примеру, создадим ряд правил:
Код
iptables -A FORWARD -s 192.168.2.0/24 -d login.icq.com -o eth0 -j DROP
iptables -A FORWARD -s 192.168.2.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.2.0/24 -o eth1 -j ACCEPT
iptables -A FORWARD -j DROP


Все просто, правда? Допустим, что в сетевой карте eth1 мы имеем подключенную локальную сеть, а в карте eth0 - интернет от провайдера. Первым правилом мы запрещаем проход с нашей сети (-s 192.168.2.0/24) трафика на сервер icq (-d login.icq.com) в сетевую карту eth0 (-o eth0, от output). Вторым и третим правилом, мы разрешаем проход трафика с нашей (-s 192.168.2.0/24) сети в интернет (-o eth0), и с интернета в нашу сеть (-d 192.168.2.0/24 -o eth1). В конце, мы запрещаем маршрутизацию любого другого трафика.

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

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


Трансляция сетевых адресов (NAT)
С фильтрацией и маршрутизацией разобрались. Приступим к NAT'у. Как и было сказано, таблица FILTER, содержащая цепочки INPUT,FORWARD,OUTPUT - для фильтрации трафика. Для NAT'а - мы прибегнем к одноименной таблице NAT, которая содержит цпочки PREROUTING, POSTROUTING и OUTPUT. Все, что нам нужно для NAT'а, мы будем делать в них.

Суть не меняется, есть правила в цепочках, состоящие из уловия и действия.

Цепочка POSTROUTING (пост-маршрутизация), служит для хранения правил, проход по которым будет выполнятся после процесса маршрутизации (выбора маршрута, прохода по цепочке FORWARD). Цепочка PREROUTING (пре-маршрутизация)- наоборот, до процесса маршрутизации. Для обычного NAT'а пользователей нам интересна цепочка POSTROUTING.

Рассмотрим правило:
Код

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


Во первых, мы указали, что хотим работать с таблицей NAT, так как по умолчанию используется таблица FILTER. Затем, в цепочку POSTROUTING мы добавили правило, что с пакетами из сети 192.168.0.0/24 мы хотим сделать некий MASQUERADE (макскарад). Маскарад пакетов в linux'е - самый простой и быстрый способ соорудить NAT. Когда компьютеры из сети 192.168.0.0/24 будут обращатся к ресурсам интернета, в пакетах будет меняться адрес источника, на адрес самого маршрутизатора, и наоборот.

Реальный пример от начала до конца
Есть некая организация, которая имеет linux-сервер, с установленным на нем web и почтовым сервером. Интерфейс eth0 - смотрит в интернет, eth1 - в локальную сеть. Доступ на POP3 должен быть только из локальной сети клиента - 192.168.1.0/24. При этом, у всех компьютеров кроме вахтового (192.168.1.59) должен быть доступ в интернет. 

Все, что нам нужно выполнить для получения этой цели, можно объеденить в один скрипт:
Код
#!/bin/sh

# Включаем маршрутизацию
echo 1 > /proc/sys/net/ipv4/ip_forward

# Очищаем все правила iptables
iptables -F -t nat
iptables -F -t filter

# Заполням таблицы фильтра правилами
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j DROP
iptables -A INPUT -j ACCEPT

iptables -A FORWARD -o eth0 -s 192.168.1.59 -j DROP
iptables -A FORWARD -o eth0 -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -j DROP

# Включаем NAT для локальной сети
iptables -t nat POSTROUTING -s 192.168.1.0/24 -j MASQUERADE


На последок
На последок скажу как сохранить настройки iptables, чтобы они не потерялись после перезагрузки.

Сохранение:
Код

iptables-save > /etc/firewall.conf


Восстановление:
Код

iptables-restore < /etc/firewall.conf


Очень надеюсь, что данная статья окажется полезной. С удовольствием отвечу на любые вопросы smile

© Imple, специально для любимого форума Винград.

Ну и совсем напоследок:  smile  smile  smile 



Это сообщение отредактировал(а) nickless - 22.8.2008, 02:56


--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
ZeeLax
Дата 26.8.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: 7
Всего: 88



О! Хвала Имплу! Наконец-то рассмотрен этот, всех и каждого интересующий, вопрос!


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Imple
Дата 26.8.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

Репутация: 18
Всего: 87



Ну, не всех, и не каждого... smile Как я и сказал... статья будет интересна тем, кто первые дни в linux'е. Зачем она профи? smile


--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
sergshabal
Дата 30.3.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.1.2009

Репутация: нет
Всего: нет



Да для новичков действительно полезно. Imple спасибо.
Возник правда вопрос:
iptables -A FORWARD -s 192.168.2.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.2.0/24 -o eth1 -j ACCEPT
Правильно ли прокомментирован этот код?

//с интернета в нашу сеть (-d 192.168.2.0/24 -o eth1)

Если несложно втолкуйте мне еще разок.
Спасибо
PM MAIL   Вверх
Sibit
Дата 2.11.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.10.2009
Где: NSK

Репутация: нет
Всего: 1



Спасибо за статью. Очень помогла.
Мне кажется, что в примере скрипта в 21-ой строке пропущен параметр -A
PM MAIL   Вверх
Google
  Дата 24.5.2019, 10:50 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Администрирование"
ZeeLax
Imple
nerezus
Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.

  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование *NIX систем | Следующая тема »


 




[ Время генерации скрипта: 0.8440 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.