Iptables Tutorial Oskar Andreasson
Всем привет!
Перелапатил кучу литературы и сайтов по IPtables и понял, что это самая запутанная тема в Linux после настройки ядра.
С большим трудом составил более-менее точное представление, как же все-таки работает этот самый netfilter с iptables и перешел к частностям, а именно к настройке конкретного фаервола для сетки.
За основу взял Iptables Tutorial 1.1.19 Oskar Andreasson - http://gazette.linux.ru.net/rus/articles/i...s-tutorial.html, сценарий
http://gazette.linux.ru.net/rus/articles/i...l#RCFIREWALLTXT
описание - http://gazette.linux.ru.net/rus/articles/i...#RCFIREWALLFILE
листинг - http://gazette.linux.ru.net/rus/articles/m...rc.firewall.txt
Появились вопросы. Если кто подскажет, скажу спасибо....
Итак, пункт 7.2.6.4. Цепочка для UDP
автор пишет:
Пакеты UDP из цепочки INPUT следуют в цепочку udp_packets Как и в случае с TCP пакетами, здесь они проверяются на допустимость по номеру порта назначения. Обратите внимание - мы не проверяем исходящий порт пакета, поскольку об этом заботится механизм определения состояния. Открываются только те порты, которые обслуживаются серверами или демонами на нашем брандмауэре. Пакеты, которые поступают на брандмауэр по уже установленным соединениям (установленным из локальной сети) пропускаются брандмауэром автоматически, поскольку имеют состояние ESTABLISHED или RELATED.Как видно из текста сценария, порт 53, на котором "сидит" DNS, для UDP пакетов закрыт, то есть правило, открывающее 53-й порт в сценарии присутствует, но закомментировано. Если вы пожелаете запустить DNS на брандмауэре, то это правило следует раскомментировать.
Я лично разрешаю порт 123, на котором работает NTP (network time protocol). Этой службой обычно пользуются для приема точного времени с серверов времени в Интернет. Однако, вероятнее всего, что вы не используете этот протокол, поэтому соответствующее правило в сценарии так же закомментировано.
Порт 2074 используется некоторыми мультимедийными приложениями, подобно speak freely, которые используются для передачи голоса в режиме реального времени.
И наконец - ICQ, на порту 4000. Это широко известный протокол, используемый ICQ-приложениями Я полагаю не следует объяснять вам что это такое.
Я не знаю, как на счет NTP или speak freely, но скажите pls, зачем для ICQ на 4000 порту окрывать специальное разрешение для INPUT?
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
Разве ICQ-пакеты не должны проходить авматически, если уже определено правило - пропускать пакеты для Established и Related? -
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
Или у него на тачке сервак ICQ стоит, который ждет входящие NEW-пакеты?
Или я не понимаю, как работает ICQ (допустим мы "сидим" за компом фаервола):
1. Соединяемся с сервером ICQ (цепочка OUTPUT - пакет беспрепятственно проходит по правилу - $IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT)
2. Получаем ответный пакеты от сервера ICQ по цепочки INPUT, который уже будет иметь статус ESTABLISHED и, следоватьно, должен беспрепятственно пройти по правилу:
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
Зачем тогда, спрашивается, писать отдельное правило в цепочке upd_packets: $IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT и пропускать через него входящие пакеты через цепочку INPUT: $IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
Получается только для новых (статус NEW) пакетов. Там что - частный сервер ICQ стоит?
- Для комментирования войдите или зарегистрируйтесь
Не знаю для
Не знаю для чего и в каких случаях (возможно передача файлов), но в icq предусмотрена возможность прямого соединения между клиентами. Для этого и открывают порт для new.
OK, спасиб. Мне
OK, спасиб. Мне тоже подумалось, возможно для передачи файлов...
Есть еще два
Есть еще два совершенно непонятных для меня момента -
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
Зачем на loopback интерфейс делать ACCEPT из $LAN_IP и $INET_IP???
Листинг
Лучший способ
Лучший способ изучить iptables это эксперементировать. Поставьте политику drop по умолчанию везде и проверяйте "что да зачем"...
А еще проще - если вы сталкнетесь с необходимостью этих правил то вы поймее зачем они...
Дело в том, что
Дело в том, что иногда "умные" сетевые приложения, даже когда коннектятся к 127.0.0.1, устанавливают в качестве ip адреса источника один из адресов на каком либо сетевом интерфейсе. Я обычно просто делаю правило iptables -A INPUT -i lo -j ACCEPT. Кстати, крайне не рекомендую делать политику для инпут дроп, как в примере листинга. Представьте, что вы запускаете такой скрипт удалённо по ssh, а в скрипте после iptables -P INPUT DROP и до разрешающего правила для ssh опечатка.... Или другой пример: захотел сбросить все правила в таблице фильтр - написал iptables -F. А про политику по дефолту забыл. И придётся топать ногами до сервера )
Почемуже не
Почемуже не рекомендуешь drop по дефолту? Изучать надо на локальной машине... А на боевой если правильно составить правила то по ssh можно смело перезагружать их... тк "установленные" соединения сбрасываются не сразу
Ну если как
Ну если как говориться настроить один раз и забыть, то проблем не будет. А если правила каждый день редактируешь, тут могут быть и ошибки в синтаксисе и т.д, особенно если спешишь )
Rinus пишет:Дело в
Спасибо! С этим разобрался. Еще один, думаю - последний, вопрос.
Зачем разрешать входящие запросы на соединение??? -
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
Какой тогда смысл в фаерволе, если мы разрешаем любые входящие запросы на соединение???
У меня только одно объяснение - чтобы не писать правила для всех протоколов по отдельности: smtp, pop3, dns, ftp и т.д.
Я правильно понял?
Почему "любые"
Почему "любые" входящие? В цепочку allowed попадают пакеты только для определённых в примере портов.
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed
А дальше уже правилом $IPTABLES -A allowed -p TCP --syn -j ACCEPT разрешаются входящие соединения по этим портам.
Аaa... понял! Не
Аaa... понял! Не внимательно смотрел... :-|
Я попробую объединить этот скрипт со скриптами из книги Linux Firewalls, Third Edition By Steve Suehring and Robert Ziegler. И помещу результат сюда на проверку ;-) Может кто что-нибудь дельное подскажет.