Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Непонятки с iptables
 
 автор: Саня   (23.11.2011 в 09:36)   письмо автору
 
 

На сервере есть такой набор правил iptables:
-A INPUT -i lo -j ACCEPT # local interface
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # http
-A INPUT -p tcp -m tcp --dport 15689 -j ACCEPT # ssh
-A INPUT -p tcp -m tcp --dport 18927 -j ACCEPT # ftp
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT # smtp
-A INPUT -p udp -m udp --dport 123 -j ACCEPT # ntp
-A INPUT -p tcp -m multiport --dports 0:1024 -j TARPIT 
-A OUTPUT -o lo -j ACCEPT # local interface
-A OUTPUT -j ACCEPT

Используется прекрасный модуль TARPIT, подтверждающий запрос на TCP/IP соединение и устанавливает размер окна равным нулю, что вынуждает атакующую систему прекратить передачу данных. Любые попытки атакующего закрыть соединение игнорируются, таким образом соединение остается открытым, пока не истечет срок тайм аута.
То есть внешне порты выглядят открытыми, а на деле являются ловушками.

В приведённом мной конфиге ловушками являются все tcp порты от 0 до 1024, кроме 80, 15689, 18927 и 25. Проблемы начинаются когда я вешаю TARPIT в цепочку INPUT на ВСЕ порты (опять же, кроме разрешенных).
-A INPUT -p tcp -m tcp -j TARPIT

В итоге перекрываются исходящие соединения.
# curl ya.ru
curl: (7) couldn't connect to host

Снимаю, и:
# curl ya.ru
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><....

Собственно, почему TARPIT на входящие подключения влияет на исходящие?

  Ответить  
 
 автор: cheops   (23.11.2011 в 10:25)   письмо автору
 
   для: Саня   (23.11.2011 в 09:36)
 

>все tcp порты от 0 до 1024, кроме 80, 15689, 18927 и 25
15689 и 18927 вроде как сильно больше 1024? Т.е. закрыты действительно все порты?

  Ответить  
 
 автор: Саня   (23.11.2011 в 10:29)   письмо автору
 
   для: cheops   (23.11.2011 в 10:25)
 

Правило -A INPUT -p tcp -m tcp -j TARPIT применяется ко всем без исключения tcp подключениям, независимо от номера порта. На 80, 15689, 18927 и 25 висит ACCEPT, поэтому подключения на эти порты не дойдут до этого правила, так как оно в конце цепочки. А вот все остальные уже попадут на TARPIT.

Когда добавляю -A INPUT -p tcp -m tcp -j TARPIT в конец цепочки, начинаются глюки с исходящими подключениями, поэтому в качестве полумеры сейчас блокируются только первые 1024.

  Ответить  
 
 автор: cheops   (23.11.2011 в 10:49)   письмо автору
 
   для: Саня   (23.11.2011 в 10:29)
 

Хм... а локальные соединения тоже закрыты? Дело в том что CURL нужны локальные TCP/IP соединения на порты, отличные от 80 (он там что-то сам себе пересылает).

  Ответить  
 
 автор: Саня   (23.11.2011 в 11:05)   письмо автору
 
   для: cheops   (23.11.2011 в 10:49)
 

Всё верно, curl (а так же wget и все остальные) открывают себе эфемерный порт и общаются через него. Только вот непонятно почему порт открывается наружу (то есть исходящее соединение), а попадает в TARPIT, определённом для входящих соединений.

Ради эксперимена заблокировал все порты, кроме эфемерных для моей системы (49152 — 65535), curl не отвалился.

Локальные соединения на все порты открыты правилом -A INPUT -i lo -j ACCEPT

  Ответить  
 
 автор: cheops   (23.11.2011 в 11:15)   письмо автору
 
   для: Саня   (23.11.2011 в 11:05)
 

Скорее всего iptables порт получателя режет, он как раз где-то в этих диапазонах и должен быть. Все-равно ему откуда данные идут и для чего.

  Ответить  
 
 автор: Саня   (23.11.2011 в 12:00)   письмо автору
 
   для: cheops   (23.11.2011 в 11:15)
 

Всё, разобрался. Правило действует на все пакеты, независимо от состояния соединения. То есть curl устанавливает tcp-соединение и отсылает запрос без каких-либо препятствий со стороны фаервола. Удалённая машина отвечает по этому соединению и получает отлуп от фаервола, из-за чего curl думает что удалённой машины не существует и отваливается.

Нужно было настроить правило на отсечение новых входящих пакетов, а пакеты по установленному соединению пропускать: -A INPUT -p tcp -m conntrack --ctstate NEW -j TARPIT

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования