Чуть-чуть Ubuntu. Часть 3 - базовая настройка iptables

Ну что, неофиты? Готовы к настройке брандмауэра? :) Приступим.

Для начала - определение:

Брандмауэр, файрволл, файрвол, файервол, фаервол, сетевой экран - комплекс аппаратных или программных средств, осуществляющий контроль и фильтрацию проходящих через него сетевых пакетов в соответствии с заданными правилами.

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

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

По умолчанию Ubuntu полностью открыта для всех соединений (исходящих и входящих), однако нет ни одного доступного сервиса. Можем убедиться в этом просканировав тестовую машину:

Для создания правил будем использовать скрипт, который будет каждый раз подгружаться при старте системы. Создадим файл и сделаем его исполняемым:

mechmessiah@vbox-ubuntu:~$ touch iptables.rules
mechmessiah@vbox-ubuntu:~$ chmod 755 iptables.rules

Обращаем внимание на папку, в которой создаём этот файл - она нам позже пригодится. Теперь добавим в самом начале такую строку:

#!/bin/sh

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

Межсетевым экраном в Linux является netfilter, а вот фрондэндом для неё является утилита iptables. С ней и будем работать. Просмотрим текущие правила:

root@vbox-ubuntu:/# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Не вдаваясь в подробности (их вы можете с лихвой вычитать в инете) пробежимся по основным моментам:

Три цепочки правил - они основные.
INPUT - все пакеты, которые направлены к нам.
OUTPUT - все пакеты, которые отправляем мы.
FORWARD - пакеты, которые у нас пробегом. Используется, к примеру, для пробросов портов. 
Политика ACCEPT означает, что всё открыто.

Для начала очистим список правил:

/sbin/iptables -F

И всё закроем, кроме наших исходящих:

/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP

Всё, машина полностью закрыта для любых сетевых контактов, даже не пропингуете. Теперь будем открывать только то, что нам нужно.

Добавим базовый набор правил, который можно смело добавлять на 99% машин. Открываем петлевой интерфейс (используется некоторыми приложениями):

/sbin/iptables -A INPUT -i lo -j ACCEPT

Открываем порты для приёма эхо-запросов. В общем, разрешаем пинг :)

/sbin/iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

А теперь разрешаем соедининия, которые установили мы сами:

/sbin/iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

В принципе - всё. Извне мы закрыты, сами же можем спокойно магспейситься ходить куда душе угодно:

Осталось добавить наш файл в автозапуск. Стартуем редактор:

mechmessiah@vbox-ubuntu:~$ sudo nano /etc/rc.local

И перед exit 0 добавляем строку запуска нашего скрипта:

/путь/до/нашего/файла/iptables.rules

Проверим после рестарта:

Есть контакт. Более сложные конструкции, а также вариант, когда наша машина является шлюзом рассмотрим позже.  

  • avatar
  • .
  • +65

52 комментария

avatar
Рано ты речь о фаере завел, для неофитов это еще ой как сложно. Тем более, что для iptables никакой внятной морды нет, все правила приходиться прописывать ручками. Да и всякими nano-vi пользоваться дюже неудобно. Самый оптимальный вариант — mc (Midnight Commander).

sudo apt-get install mc

Очень удобен, рекомендую для терминала.
avatar
Я его и использую ;) Но знать, как отредактировать файл без него тоже нужно. Та же Убунта по-умолчанию идёт без него, а чтобы его поставить — нужно настроить зеркало. А чтобы его настроить — нужно отредактировать файл sources.list :) Поэтому я и показываю, как юзать тот же Нано.

По поводу файера — может и рано, но тут настолько базовый набор правил, что песдец. Просто закрыться от всех и разрешить всё себе. Защита от дурака, скорее всего.

И вообще, мне Мате 13 понравился, да и базы от Убунту 12.04 подошли на него. Наверное на нём экспериментировать буду.
avatar
Та же Убунта по-умолчанию идёт без него, а чтобы его поставить — нужно настроить зеркало. А чтобы его настроить — нужно отредактировать файл sources.list :) Поэтому я и показываю, как юзать тот же Нано.
Паш, все практически легче. В Убунте есть графический редактор по-умолчанию — gedit, достаточно

sudo gedit

а затем уже открыть сорслист в нем, далее уже удобнее некуда.
avatar
Знаю :) А вот предположим ты завалился по ssh и нужно подправить файл? Я стараюсь всегда идти наиболее универсальным путём.
avatar
Э-э-э, вроде бы речь об настольном компьютере ведем для неофитов, в администрирование серверов может не надо углубляться? Иначе запутаем еще больше. По ssh я пользуюсь vi, если нет mc, но стараюсь сразу же при первом удобном случае ставить mc. Он на всех серверах предприятия установлен, где требуется стоит vnc.
avatar
Окей, принято :)
avatar
*текстовый редактор по умолчанию — gedit
fixed
avatar
Он имел ввиду GUI, в отличии от nano. Всё нормально :)
avatar
Аааа…
ну если в этом смысле, тогда извините… ^^'
avatar
Какой огромный мануал… =)
avatar
Он полностью соответствует названию поста ;)
avatar
Затея постов — агонь. Бесплатные уроки игры на бубнах свободного софта — несомненно хорошая затея, ведущая нас в светлое эротическое будущее. И это круто, и автору — респект. Однако, настройка iptables — это не «чучуть убунту», а объёмный процесс с кучей нюансов. Поэтому ньюфагам, да и многим более бородатым, можно юзать GUI(если есть, конечно) к iptables — он прекрасно выполняет свою работу. Тем более, что пост про home-porn, который подразумевает наличие гнома, кед и прочих удобств.
avatar
Ну какбэ да, всё верно, но с теми же GUI я сам-то и не работал толком :) Мне ту же сеть проще настроить через /etc/sysconfig/networking-scripts/, чем через NetworkManager.

Я просто рассказываю то, что делаю сам — чтобы потом не забыть, да и может кому пригодится.
avatar
Предлагайте темы, что ли. А то самому себе придумывать как-то не получается.
avatar
Например, серию постов про запуск распространённого софта из-под wine, про SAMBA чё-нть запили, потом ещё чё-нть мозг выдаст))
avatar
Пили все таки про настройку сети через NM, у кого-то айпишники по dhcp, а у кого и статичные.
avatar
Качнул вам в помощь пару видео на эту тему. :)

Скачать

avatar
Качнул вам в помощь пару видео на эту тему. :)

Скачать


Вот еще очень интересное водео на тему: Межсетевые экраны.

Скачать

avatar
:)
avatar
крутяк!
avatar
Лучше запилил бы пост про пробос портов с помощью с iptables, никак эту проблему не решил, изъездил гугл вдоль и поперек.
avatar
*проброс
avatar
/sbin/iptables -t nat -A PREROUTING -s откуда_ломимся -d наш_шлюз -p протокол --dport порт_на_шлюзе -j DNAT --to-destination внутренний_айпи:порт
avatar
Ну или конкретный пример давай, составим.
avatar
Пробовал так — не прокатывает.
avatar
Ещё должно это стоять:

/sbin/iptables -t nat -A POSTROUTING -s внутренняя_подсеть/маска -j MASQUERADE


А так же убедишь, что включен форвардинг:

cat /proc/sys/net/ipv4/ip_forward


Должна быть единица.
avatar
Знаю, стоит единица давно. Как шлюз серв работает без проблем.
avatar
Очень странно, потому что этих трёх пунктов мне достаточно, только что завалился на удалённую машину сквозь шлюзак. Чой-то где-то криво значит настроено.
avatar
Кстати, PREROUTING для чего?
avatar
Прерутинг используется при подмене внешних айпи на внутренние.

Пострутинг — при подмене внутренних айпи на внешние.

Только это… тот вариант с прерутингом прокатит, если цепочка FORWARD открыта (политика ACCEPT). Если же там политика по умолчанию DROP, то нужно после каждой строки проброса добавлять ещё такое:

/sbin/iptables -A FORWARD -s откуда_ломимся -d наш_шлюз -p tcp -j ACCEPT

Проверь цепочку:

iptables -L | grep FORWARD
avatar
Да я привык вручную файл iptables править, потом только service iptables restart делаю.
avatar
Ммм, к какой части моего коммента это относится?
avatar
Ты пишешь команды для вставки правил iptables, я непосредственно пишу цепочки в его конфигурационный файл. Вот и вся разница.
avatar
Это с такого файлика и скопиравано :) Дык чо, политика FORWARD какая стоит?
avatar
Не бреши))
/sbin/iptables -A FORWARD -s откуда_ломимся -d наш_шлюз -p tcp -j ACCEPT
FORWARD стоит в ACCEPT
avatar
Чой-то я потерял нить твоих мыслей, если честно. Давай сюда (или в личку) файл с привилами, будем разбираться. Интересно же :)
avatar
Давай на свежак.)) Начнем с маскардинга, все правила по нему удалил.
В sysctl.conf фовардинг в 1, то бишь работает.
В iptables FORWARD ACCEPT стоит для всех без исключений. Поехали.
avatar
Вот моя рабочая конфигурация (все IP поменяны):

# Очищаем всё к ебеням
/sbin/iptables -F
# Закрываем всё к ебеням, кроме FORWARD
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
# Маскарадим внутреннюю сеть
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
# Открываем loopback-интрефейс 
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
# Открываем пинг
/sbin/iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
# Разрешаем установленные нами соединения
/sbin/iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
# А вот и первый проброс - на вэбку
/sbin/iptables -t nat -A PREROUTING -d внешний_IP_шлюза -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
# Второй проброс - на другую машину с RDP
/sbin/iptables -t nat -A PREROUTING -s мой_IP -d внешний_IP_шлюза -p tcp --dport какой_нить_левый_порт -j DNAT --to-destination 192.168.1.20:3389


Можно для верности ребут сделать.

На поминаю, что порядок тоже важен, ибо действие ACCEPT является терминальным, то есть при первом совпадении пакет пропускается. Если пакет пропустится до того, как пройдут цепочку PREROUTING, то толку будет ноль.

Потом расскажешь, помогло, нет.
avatar
Сервак работающий, потому очищать старые правила к ебеням ни-ни, тем более ребутить. Пинг закрыт наглухо, половину правил можно отбросить. Ты снова написал командами, они не сохраняются в файле iptables, т.е. при любом ребуте в дальнейшем они сбросятся.
avatar
Да йопт, создаёшь скрипт и в rc его.

Сервак работающий, потому очищать старые правила к ебеням ни-ни...

Ну тогда бесполезно гадать, почему там что-то не так. Ещё раз повторю — от порядка правил много зависит. А я пока не телепат, к сожалению.
avatar
А нахрена в rc, когда все можно в правилах сохранить?
avatar
Не нравятся они мне :)
avatar

avatar
Поясню порядок:
Сначала обнуляем наши текущие правила
# iptables -F
# iptables -t nat -F

Установим политики по умолчанию для трафика, не соответсвующего ни одному из правил
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD DROP
# export LAN=eth0

Теперь закроем наши сервисы так, чтобы они могли работать только для LAN
# iptables -I INPUT 1 -i ${LAN} -j ACCEPT
# iptables -I INPUT 1 -i lo -j ACCEPT
# iptables -A INPUT -p UDP --dport bootps -i ${LAN} -j REJECT
# iptables -A INPUT -p UDP --dport domain -i ${LAN} -j REJECT
Отбросим все TCP/UDP-пакеты, обращающиеся к привилегированным портам
# iptables -A INPUT -p TCP -i ${LAN} -d 0/0 --dport 0:1023 -j DROP
# iptables -A INPUT -p UDP -i ${LAN} -d 0/0 --dport 0:1023 -j DROP
В конце добавляем правила для NAT
# iptables -I FORWARD -i ${LAN} -d 192.168.0.0/255.255.0.0 -j DROP
# iptables -A FORWARD -i ${LAN} -s 192.168.0.0/255.255.0.0 -j ACCEPT

Сообщаем ядру, что ip-форвардинг разрешен
# echo 1 > /proc/sys/net/ipv4/ip_forward
# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done

Сохраняем правила, чтобы потом не вводить всё вручную заново при перезагрузке
# /etc/init.d/iptables save
avatar
Это в генту?
avatar
Это, в принципе, в любых линухах.
avatar
Да ты че? ;)
avatar
Зуб даю :)
avatar
Народ возникла такая проблема, что после настройки этих правил, пропало vpn соединение с магланом. Как с этим бороться?
  • 1Rt
  • 0
avatar
Говорят, нужно открыть 47 порт и 1723.
avatar
Добавил в скрип такое правило /sbin/iptables -A INPUT -p tcp -m multiport --dports 47,1723 -j ACCEPT. Не помогло.
Заметил такую странность. После обнуления через терминал командой iptables -F. Впн все равно не запускается, помогает только удаление, исполняемого файла и перезагрузка. Также кода все правила прописываю через терминал, они работают и впн подключается.

Я начинаю грешить на маглан, что он отсылает свои автоматические настройки по одному из каналов которые блокируются правилами.
avatar
К сожалению, нет под рукой Маглана, не могу проверить. Попробуй позвонить одминам, они там шаристые.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.