Создание скрипта настройки firewall/routing

Создаем собственно файл - назовем его например netfilter
Помещаем скрипт в /etc/init.d/
Делаем файл исполнимым: chmod +x /etc/init.d/netfilter
Прописываем в файл стандартный заголовок для shell-скриптов: #!/bin/bash
Добавляем скрипт в автозагрузку: update-rc.d netfilter defaults
TODO: описать процесс для более других дистрибутивов, в частности не использующих SYSV Init

Теперь у нас есть скрипт, который будет выполнятся каждый раз при перезагрузке системы. Надобно наполнить его содержимым. При настройке firewall следует пользоваться правилом "доброго админа" - запретить все и разрешать при наличии необходимости только тому кому действительно нужен доступ.

Ex.1

#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Вот собственно простейший firewall, который никого никуда не пускает. Если вы работает на удаленной машине по ssh - раскомментируйте строки 5 и 6 чтобы не потерять к ней доступ - пока что это правило без объяснений. Строки 2-3 - это очистка цепочек правил iptables. Строки 7-9 - установка для всех цепочек политики по умолчанию DROP (т.е запрет прохождения пакетов без уведомления отправителя). Подробнее о структуре и правилах iptables можно прочитать тут: http://gazette.lrn.ru/rus/articles/iptables-tutorial.html
Все пакеты обрабатываемы ядром проходят через несколько таблиц и цепочек. Определенные операции возможно и принято выполнять в определенных таблицах и цепочках. Подробнее о порядке прохождения пакетов см. тут: http://gazette.lrn.ru/rus/articles/iptables-tutorial.html#TRAVERSINGOFTABLES Нас интересует пока только одна таблица - filter Это - таблица по умолчанию, и по этому все правила для которых не указана таблица применяются именно к таблице filter. В этой таблице производится, как нетрудно догадаться, фильтрация трафика. Назначение цепочек:
INPUT - пакеты пришедшие из сети и предназначеные данному хосту.
OUTPUT - пакеты созданные на данном хосте и передаваемые другим хостам в сеть.
FORWARD - пакеты пришедшие из сети и предназначенные для передачи другим хостам в сети.

Ex.2

#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

Строки 9,10 - разрешаем входящие и исходящие ICMP-пакеты (в частности ping )
Строка 11 - разрешаем прохождение tcp-пакетов принадлежащих к уже установленым соединениям
Строка 12 - разрешаем прохождение пакетов принадлежащих к уже установленым tcp-соединениям, а так же пакетов создающих новые tcp-соедиения.
Строки 13,14 - аналогично для протокола UDP
В данном примере используеся отслеживание состояния соединения для принятия решения о прохождении пакета. Подробнее о механизме отслеживания состояний соединения см. тут: http://gazette.lrn.ru/rus/articles/iptables-tutorial.html#STATEMACHINE
В подсистеме фильтрации пакетов Linux существует 4 возможных состояния соденияния - взято из IPTables Tutorial 1.1.19

Разрешение входящих соединений

Для того, чтобы разрешить входящее TCP-соединение необходимо в скрипт добавить строчку: iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT В данном случае разрешается доступ к 80 порту (как правило там находится http-сервер)

Маршрутизация - основы

При настройке маршрутизации следует учесть следующие моменты (собрано по мотивам популярных заблуждений):

Маршрутизацию надо настраивать на: маршрутизаторе, хосте принимающем соединение, хосте иницирующем соединение - т.е. в трех местах.
Если нет возможности настроить маршрутизацию на хосте принимающем соедиение - следует использовать NAT
Маршрутизация осуществляется между подсетями ip. Любой ip-адрес стандарта IP версии 4 (IPv4) состоит 4-х байт и условно делится на номер сети и номер хоста. Маршрутизация возможна только между сетями с разными номерами.
Маска подсети (netmask) не передается в заголовке ip-пакета. Маска подсети имеет смысл только в пределах хоста.
Для вычисления разнообразных параметров удобно использовать ipcalc:
В данном случае хосты расположены в одной подсети 192.168.0.0 размером в 2049 хостов. "нормальная" маршрутизация между ними невозможна.

Возьмем для примера более привычне диапазоны адресов: 192.168.1.0/24 (255.255.255.0) и 192.168.2.0/24 (255.255.255.0) - по 254 узла в каждой.
Например в маршрутизаторе есть две сетевые карты - с адресами 192.168.1.1 или 192.168.2.1.
Для того, чтобы маршрутизация между подсетями работала, необходимо произвести настройки:

На хосте в сети 192.168.1.0/24 - прописать маршрут к сети 192.168.2.0/24 через 192.168.1.1 - например в linux : ip route add 192.168.2.0/24 via 192.168.1.1
На хосте в сети 192.168.2.0/24 - прописать маршрут к сети 192.168.1.0/24 через 192.168.2.1 - например в linux : ip route add 192.168.1.0/24 via 192.168.2.1
На маршрутизаторе разрешить маршрутизацию пакетов: echo 1 > /proc/sys/net/ipv4/ip_forward - строчку стоит добавить в скрипт 😉
На маршрутизаторе разрешить прохождение пакетов через firewall (см. цепочку FORWARD)

Пакеты проходящие через маршрутизатор попадают в цепочку FORWARD. Например, чтобы разрешить пользователям из сети 192.168.1.0/24 обращаться к веб-серверам в сети в сети 192.168.2.0/24:

Ex.3

#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.0/24 -p tcp --dport 80 -m state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.0/24 -d 192.168.1.0/24 -p tcp -m state ESTABLISHED -j ACCEPT

Строка 15 - разрешаем маршрутизацию.
Строка 16 - разрешаем прохождение пакетов открывающих новое соединение на порт 80 протокола tcp, либо принадлжащих к уже установленмову соединению на этот же порт от хостов в сети 192.168.1.0/24 к хостам в сети 192.168.2.0/24.
Строка 17 - разрешаем прохождение пакетов принадлежащих к уже установленым соединениям

В случае, если в одной из сетей настройка маршрутизаии невозможна, следует использовать NAT.
NAT - сокращение от Network address translation - т.е. преобразование адерсов в IP-пакетах. Подробнее о том что есть NAT и как его использовать - читайте в соответсвующем разделе IPtables tutorial.

Ex. 4

#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.0/24 -p tcp --dport 80 -m state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.0/24 -d 192.168.1.0/24 -p tcp -m state ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j MASQUERADE

Строка 18 - модифицирует адрес источника пакетов идущих из сети 192.168.1.0/24 в сеть 192.168.2.0/24. В денном конкретном случае в качестве адреса источника будет установлен 192.168.2.1 - т.е. адрес соответсвующего интерфейса маршрутизатора подключенного к сети назначения. Соответсвующее обратное преобразование производится прозрачно. Firewall и локальные приложения. Некоторые программы работая на локальном компюьтере тем не менее не используют unix-sockets, а обращаются к адресам 127.0.0.0/8 (точнее, 127.0.0.1) Для нормально работы рекомендуется использовать конструкцию вида:

  • iptables -A INPUT -i lo -j ACCEPT

 

  • iptables -A OUTPUT -o lo -j ACCEPT

В первой строчке все пакеты пришедшие ( -i ) с интерфейса lo aka loopback принимаются безоговорочно. Во второй - уходящие через интерфейс lo так же отправляются.

--------------------------------------------
RUSUA:Данная статья скопипизжена из http://www.linux.by/wiki/index.php/Debian_Firewall.
Спасибо автору,более понятного разьяснения команд iptables еще не встречал.Понятно даже школьнику.

6 комментариев

  1. avatar Вася:

    Сделал все по первому правилу. SSH все равно закрыт. Что делать?Посоветуйте!

    • Напишите что именно вы вводили из первого правила. И закрыт ССШ извне,внутри сети можно подключиться,если она есть? Демон ССШ точно установлен и работает?

      • avatar Вася:

        Прошу прощения. Моя ошибка. Демон SSH просто напросто не был запущен. Скажите пожалуйста, как открыть доступ для веб-серфинга но при этом разрешить только определенные сайты!

        • Подробнее пожалуйста) Открыть доступ что б этот ваш компьютер мог попадать на определенные сайты?или что б через него могли?или на нем хостятся сайты,и надо разрешить к ним доступ извне? и т.д.

  2. avatar Nurlan:

    помогите, хочу изменить дефолтный порт SSH с 22 на какой нибудь другой к примеру 4444, добавил в iptables правило

    iptables -A FORWARD -i $intif -o $extif -p tcp --dport 4444 -d $everywhere

    стучусь телнетом myserver.com 4444, но пишет connectiuon refused,
    у меня debian

    • На самом деле порт в SSH меняется не так.Для этого достаточно в файле конфигурации демона /etc/ssh/sshd_config найти строчку Port 22 и изменить цифру порта на любую какую хочешь(но лишь бы не занятую другим сервисом на вашем сервере) и перезапустить демон ССШ.

Добавить комментарий

%d такие блоггеры, как: