Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: HOWTO: Iptables для новичков  (Прочитано 521678 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2025 : 08 Октября 2014, 13:43:46 »
Прокси-сервер.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн CALL|KA

  • Участник
  • *
  • Сообщений: 105
  • Водитель НЛО
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2026 : 02 Декабря 2014, 12:15:12 »
Доброго времени суток. Прошу прощения за большое количество символов, но, к сожаления, нет знакомых, которые могли бы помочь в изучении iptables.
Во время прочтения статей по iptables появились вопросы по правилам. Как написано в мануале, правило состоит из условия, действия и счетчика.
Пример №1:
iptables -A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -j ACCEPT
-A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -это условие
-j ACCEPT -это действие
Правильно?
Ключ -j является производным (сокращением) от какого слова? Jump?
Почему перед некоторыми ключами ставится символ "-", а перед другими "--"?
dport это сокращение от destination port?
Если ssh будет висеть на нестандартном порту, то при этом правиле iptables будет нормально пропускать трафик?
Какая разница между ключами -A и -I? Первый дописывает правило в конец цепочки, а второй - на указанную позицию?
На какую позицию в цепочке ставится правило с ключом -I без дополнительных аргументов?
"Существует множество модулей которые могут использоваться для расширения возможностей iptables, такие как connlimit, conntrack, limit и recent.
Эти модули дополняют iptables новой функциональностью для того, чтобы были возможны более сложные правила фильтрации. "
Модули устанавливаются вместе с iptables или необходима ручная установка?

Хочу, для лучшего понимания, уяснить, как правильно "прочитать" правило.
iptables -A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -j ACCEPT
Добавить(A - append) в талицу filter, в цепочку INPUT правило для пакетов, приходящих на (-i) интерфейт eth1,
источником (-s) которых является сеть 10.8.0.0/24, по протоколу tcp, порт назначения ssh. Применить действие принять (ACCEPT).

Пример №2:
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
Добавить в таблицу filter в конец цепочки FORWARD правило, запрещающее весь трафик, ответить "хост недоступен".

Пример #3:
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o tun0 -j MASQUERADE
Добавить в таблицу nat в конец цепочки POSTROUTING правило для пакетов, источником которых является сеть 192.168.20.0/24, ( -o tun0 - что это? Output tun0?). Действие MASQUERADE.
Можно ли -s 192.168.20.0/24 заменить на -s eth0? Т.е. на интерфейс, соответствующий подсети 192.168.20.0/24.

Пример #4:
iptables -I FORWARD -i eth1 -o tun0 -j ACCEPT
Добавить в таблицу filter в цепочку FORWARD правило. Принимать пакеты, которые идут с интерфейса tun0 на eth1.

Пример #5:
# iptables -A interfaces -i lo -j ACCEPT
В таблице filter будет созданна новая цепочка interfaces и туда добавлено правило, разрешающее прием трафика на интерфейс lo.

alexxnight

  • Гость
Re: HOWTO: Iptables для новичков
« Ответ #2027 : 02 Декабря 2014, 13:33:58 »
[!] -p, --protocol протокол

вместо --dport ssh можно указать цифровое значение, например 22

Цитировать
-j ACCEPT -это действие
Да

Цитировать
Ключ -j является производным (сокращением) от какого слова? Jump?
Да

Цитировать
dport это сокращение от destination port?
Да

Цитировать
Какая разница между ключами -A и -I?
Что такое -A, Вы уже поняли.
-I 1 "вставляет" правило на место 1 в цепочке правил

Цитировать
-o tun0
Исходящие пакеты на интерфейс tun0

Цитировать
Можно ли -s 192.168.20.0/24 заменить на -s eth0? Т.е. на интерфейс, соответствующий подсети 192.168.20.0/24.
Да, только исходящий пакет с интерфейса... -i eth0

Цитировать
Пример #4:
Принимать пакеты, которые идут с интерфейса tun0 на eth1.
Наоборот. Пакеты с интерфейса eth1 на tun0


А вообще, Вы молодец, но слишком все любите раскладывать по полочкам :)

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2028 : 02 Декабря 2014, 14:14:07 »
Доброго времени суток. Прошу прощения за большое количество символов, но, к сожаления, нет знакомых, которые могли бы помочь в изучении iptables.
Во время прочтения статей по iptables появились вопросы по правилам. Как написано в мануале, правило состоит из условия, действия и счетчика.
Пример №1:
iptables -A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -j ACCEPT
-A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -это условие
-j ACCEPT -это действие
Правильно?
Нет.
Условия - это:
-i eth1
-s 10.8.0.0/24
-p tcp
--dport ssh
Действие (вернее, в терминах iptables - ЦЕЛЬ) - это ACCEPT. Кстати, цели у правила может и не быть…

Цитировать
Ключ -j является производным (сокращением) от какого слова? Jump?
Хотя ОБЫЧНО короткие опции имеют длинные аналоги, огульно утверждать, что каждая короткая опция имеет "исходный" длинный аналог - попросту неверно. man find для примера. А для ответа на ваш вопрос - man iptables.

Цитировать
Почему перед некоторыми ключами ставится символ "-", а перед другими "--"?
Стандарт GNU. Один дефис предваряет однобуквенную опцию или набор однобуквенных опций. При этом то, понимает приложение нагромождения типа "-jvVktN" как набор опций "-j -v -V -k -t -N" или как один параметр "jvVktN" - зависит целиком и полностью от самого приложения. Никаких "общих правил" тут нет. Читайте маны.

Цитировать
dport это сокращение от destination port?
Читайте маны. Это не сокращение, это обозначение.

Цитировать
Если ssh будет висеть на нестандартном порту, то при этом правиле iptables будет нормально пропускать трафик?
Загляните в файл /etc/services (в Windows - "%SystemRoot%\System32\drivers\etc\services") - просветитесь. Вся трансляция имён сервисов в номера зависит от этого файла.

Цитировать
Какая разница между ключами -A и -I? Первый дописывает правило в конец цепочки, а второй - на указанную позицию?
На какую позицию в цепочке ставится правило с ключом -I без дополнительных аргументов?
Серьёзно, начните с начала - прочитайте хотя бы man, чтобы иметь представление о формате команды. -A,--append - добавить [в конец], -I,--insert - вставить [в начало].

Цитировать
"Существует множество модулей которые могут использоваться для расширения возможностей iptables, такие как connlimit, conntrack, limit и recent.
Эти модули дополняют iptables новой функциональностью для того, чтобы были возможны более сложные правила фильтрации. "
Вместо conntrack используте модуль state, пожалуйста.

Цитировать
Модули устанавливаются вместе с iptables или необходима ручная установка?
Часть идёт вместе с iptables, часть можно/нужно устанавливать/включать вручную.
Список текущих активных условий (и не только) можно посмотреть в файлах
/proc/net/ip_tables_*

Цитировать
Хочу, для лучшего понимания, уяснить, как правильно "прочитать" правило.
iptables -A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -j ACCEPT
Добавить(A - append) в талицу filter, в цепочку INPUT правило для пакетов, приходящих на (-i) интерфейт eth1,
источником (-s) которых является сеть 10.8.0.0/24, по протоколу tcp6, порт назначения ssh22. Применить действие принятьПРИНЯТЬ (ACCEPT).
Все символьные ссылки на цифровые значения разрешаются в момент чтения правила. На самом деле, даже имя интерфейса разрешается в его номер, но в диком виде номера интерфейсов знают только разработчики модулей ядра. Так что оставим.

Цитировать
Пример №2:
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
Добавить в таблицу filter в конец цепочки FORWARD правило, запрещающее весь трафик, ответить "хост недоступен".
Доступ к хосту запрещён, вообще-то.

Цитировать
Пример #3:
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o tun0 -j MASQUERADE
Добавить в таблицу nat в конец цепочки POSTROUTING правило для пакетов, источником которых является сеть 192.168.20.0/24, ( -o tun0 - что это? Output tun0?). Действие MASQUERADE.
-o tun0 обозначает именно это пакеты, уходящие(собирающиеся уходить)  с интерфейса tun0.

Цитировать
Можно ли -s 192.168.20.0/24 заменить на -s eth0? Т.е. на интерфейс, соответствующий подсети 192.168.20.0/24.
Нет конечно.

Цитировать
Пример #4:
iptables -I FORWARD -i eth1 -o tun0 -j ACCEPT
Добавить в таблицу filter в цепочку FORWARD правило. Принимать пакеты, которые идут с интерфейса tun0 на eth1.
Строго обратно. Правило разрешает транзит пакетов с eth1 на tun0.

Цитировать
Пример #5:
# iptables -A interfaces -i lo -j ACCEPT
В таблице filter будет созданна новая цепочка interfaces и туда добавлено правило, разрешающее прием трафика на интерфейс lo.
Не будет ничего создано. Если цепочка не была создана заранее, вывалится ошибка.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2029 : 02 Декабря 2014, 14:38:52 »

iptables -A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -j ACCEPT
-A INPUT -i eth1 -s 10.8.0.0/24 -p tcp --dport ssh -это условие
-j ACCEPT -это действие
Правильно?
Нет.
Кстати, INPUT - это цепочка в таблице и к условию не относится


вместо --dport ssh можно указать цифровое значение, например 22
Не можно, а нужно, чтобы потом самому не путаться.
Дело в том, что netfilter фактически не знает какой порт относится к какому протоколу, поэтому при запросе загруженных правил, Вы не увидите в качестве source- или destination порта, ни ftp, ни http, ни ssh - а только их стандартные номера портов.
НО!!! iptables (мы помним, что iptables - это всего лишь инструмент управления правилами netfilter, да?) принимает в качестве аргумента эти аббревиатуры, но самому netfilter скармливает уже цифры, полученные из /etc/protocols.
Тоже самое относится к доменным именам сайтов: iptables примет ya.ru в качестве параметра условия, но netfilter в загруженном правиле получит отрезольвенные на момент получения команды IP-адреса.
Можете проверить
sudo iptables -A FORWARD -d ya.ru -p tcp --dport ssh -j LOG
sudo iptables-save | grep LOG

Цитировать
Какая разница между ключами -A и -I?
Что такое -A, Вы уже поняли.
-I 1 "вставляет" правило на место 1 в цепочке правил
Угу
-A- append(добавить)
-I - insert(вставить)
Цитировать
-o tun0
Исходящие пакеты на интерфейс tun0
С интерфейса tun0

Цитировать
Можно ли -s 192.168.20.0/24 заменить на -s eth0? Т.е. на интерфейс, соответствующий подсети 192.168.20.0/24.
Да, только исходящий пакет с интерфейса... -i eth0
и получите другое по логике правило. Так как -s[ource-address], а -i[nput-interface]. Пакеты приходящие на интерфейс могут иметь source-address отличный от присоединённой этому интерфейсу сети.
« Последнее редактирование: 02 Декабря 2014, 14:46:19 от fisher74 »

alexxnight

  • Гость
Re: HOWTO: Iptables для новичков
« Ответ #2030 : 02 Декабря 2014, 15:55:48 »
Да, спасибо, что поправили мои косяки :)

Оффлайн CALL|KA

  • Участник
  • *
  • Сообщений: 105
  • Водитель НЛО
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2031 : 04 Декабря 2014, 13:06:04 »
Загляните в файл /etc/services (в Windows - "%SystemRoot%\System32\drivers\etc\services") - просветитесь. Вся трансляция имён сервисов в номера зависит от этого файла.
Вот это действительно открытие дня для меня.

Спасибо большое всем, кто ответил.

Пользователь решил продолжить мысль [time]05 Декабрь 2014, 13:55:52[/time]:
Как узнать какие правила необходимо вносить в iptables? Я имею в виду порты.
Пусть примером будет среднестатистическая машина с браузером, vnc-сервером и клиентом, dc++ и торрентом.
Чем и как смотреть необходимые порты? nmap? netstat? Или читать спецификации программ?

Понятно, что в инете можно найти готовые примеры, но хочется разобраться самому.

Еще вопрос. Есть 2 правила, разрешающие входящие подключении на 22й порт.
Почему во втором явно указывается на использование модуля tcp (-m tcp), а в первом нет?
Во втором правиле указывается дополнительное условие (--ctstate NEW)? Для чего оно в данном примере?
В вики сказано "NEW — пакет открывает новый сеанс". Т.е. разрешить только новые соединения? Совсем запутался.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT

Если я правильно понимаю, то необходимо использовать
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
или
iptables -A INPUT -m state --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
?

Есть ли разница междуНа обработку трафика обе директивы будет иметь одинаковое значение?
iptables -P INPUT DROP
iptables -A INPUT -j DROP #с условием, что это правило будет последнее в цепочке
« Последнее редактирование: 05 Декабря 2014, 14:36:00 от CALL|KA »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2032 : 05 Декабря 2014, 16:21:15 »
Для среднестатистической машины никакие правила не нужны.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

alexxnight

  • Гость
Re: HOWTO: Iptables для новичков
« Ответ #2033 : 05 Декабря 2014, 18:16:12 »
Вместо conntrack используте модуль state, пожалуйста.

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

to CALL|KA
Если у Вас есть желание заморочиться, то...
модуль conntrack, если очень просто, отслеживает соединения.
также он присваивает пакетам различные статусы в рамках текущего соединения.
Если пакет первый в соединении, то он получит статус NEW. Для tcp протокола это (по правилам) syn пакет, поэтому его и надо отслеживать:
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT
но перед этим
iptables -A INPUT -i lo -j ACCEPT
iptabels -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
« Последнее редактирование: 05 Декабря 2014, 18:26:39 от alexxnight »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2034 : 05 Декабря 2014, 23:59:41 »
Это не совет, это приказ, выраженный в виде вежливой просьбы.
Исторически, модуль state был первым, и содержал рудиментарные функции контроля состояния соединений. На его основе был написан намного более полнофункциональный модуль conntrack. Со временем, изменения, внесённые в conntrack, были портированы и в state, после чего conntrack стал просто алиасом state для сохранения обратной совместимости на время переходного периода. Период затянулся, но вполне может кончиться в самый неподходящий момент.
Если коротко - всегда используйте оригинальные (первичные, полные) имена модулей, функций, параметров, если хотите иметь минимум головной боли с поддержкой своей системы на протяжении десятилетий, если только у вас нет ОЧЕНЬ хорошей причины их не использовать.
Например, если вам досталась в наследство отлаженная и работающая система, использующая старую семантику. Не надо бросаться всё переписывать. Вы потратите своё время впустую, а система будет работать так же, как работала до вашего вмешательства. Потратьте это время на документирование настроек системы, тогда в случае проблем вам легче будет искать их причины.

Пользователь решил продолжить мысль 06 Декабря 2014, 00:16:27:
Если пакет первый в соединении, то он получит статус NEW. Для tcp протокола это (по правилам) syn пакет, поэтому его и надо отслеживать:
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT
но перед этим
iptables -A INPUT -i lo -j ACCEPT
iptabels -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Если у вас "перед этим" стоит RELATED,ESTABLISHED=ACCEPT, писать NEW слегка бессмысленно. Ибо бесполезная трата процессорных циклов. Практически нереально, чтобы какие-то другие пакеты попали в это правило.
« Последнее редактирование: 06 Декабря 2014, 00:16:27 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

alexxnight

  • Гость
Re: HOWTO: Iptables для новичков
« Ответ #2035 : 06 Декабря 2014, 17:31:32 »
Не вспомню где я читал, но у меня отложилась в голове информация, что state является устаревшим и его хотят в будущем совсем убрать, и настоятельно рекомендовано разработчиками использовать conntrack... Поищу инфу на эту тему...

Цитировать
Если у вас "перед этим" стоит RELATED,ESTABLISHED=ACCEPT, писать NEW слегка бессмысленно. Ибо бесполезная трата процессорных циклов. Практически нереально, чтобы какие-то другие пакеты попали в это правило.

Не скажите...
Например, приходит первый tcp пакет не syn.
Вот это правило его не примет, и пакет уйдет по умолчанию в DROP
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT

И сл. правило сработает только для правильно установившихся соединений.
iptabels -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Такая легкая защита от NEW-NOT-SYN...

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2036 : 06 Декабря 2014, 18:13:14 »
Поэтому перед всеми обычно ставят INVALID -j DROP.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

alexxnight

  • Гость
Re: HOWTO: Iptables для новичков
« Ответ #2037 : 06 Декабря 2014, 21:56:21 »
INVALID однозначно -j DROP :)
А как это решит NEW-NOT-SYN?
Пришел первый пакет tcp, не syn. conntrack присвоит ему статус NEW, система не будет разбираться в правильности установления соединения.
INVALID - это, например, если придет с того же хоста но на другой порт, а соединение уже было установлено и не закрыто.
Или я что-то упускаю?

Нашел в вики следующее об использовании модуля state:
Цитировать
Идеологический предшественник критерия conntrack. Имеет единственный параметр --state, аналогичный параметру --ctstate критерия conntrack (но, в отличие от него, не поддерживающий состояния DNAT и SNAT).

Долгое время был основным критерием определения состояния, и до сих пор фигурирует во многих руководствах и примерах. Однако в настоящее время разработчики iptables рекомендуют использовать вместо него критерий conntrack. Возможно, что критерий state вообще будет удален из будущих версий iptables/netfilter
вот ссылка

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28510
    • Просмотр профиля
Re: HOWTO: Iptables для новичков
« Ответ #2038 : 07 Декабря 2014, 14:28:56 »
C каких пор педивикия стала аргументом в споре?
state является алиасом(!!, не отдельным модулем) conntrack уже лет шесть, если не больше.
« Последнее редактирование: 07 Декабря 2014, 14:31:00 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

alexxnight

  • Гость
Re: HOWTO: Iptables для новичков
« Ответ #2039 : 07 Декабря 2014, 17:55:41 »
C каких пор педивикия стала аргументом в споре?
state является алиасом(!!, не отдельным модулем) conntrack уже лет шесть, если не больше.

Продолжайте мысль...

 

Страница сгенерирована за 0.035 секунд. Запросов: 25.