пятница, 14 сентября 2012 г.

Настройка iptables для шлюза

В предыдущей заметке мы настроили сетевые интерфейсы на компьютере шлюзе. Сегодня сделаем возможным прохождение пакетов через шлюз к клиенту. Делается это с помощью встроенного в ядро Linux файервола iptables.

Умолчальные настройки нас не устраивают. На мой взгляд лучшее решение - собрать все настройки iptables в одном файле. И перво наперво этот файл нужно создать. Все дальнейшие действия выполняются под личиной Суперпользователя.

Создаем файл /etc/init.d/rc.firewall:

# touch /etc/init.d/rc.firewall

Наш файл является сценарием оболочки, поэтому делаем его исполняемым следующей командой:

# chmod 755 /etc/init.d/rc.firewall

Чтобы все работало после перезагрузки, помещаем наш скрипт автозагрузку при помощи команды:

# update-rc.d rc.firewall start 40 S . stop 89 0 6 .

Вместо непонятных буковок "start 40 S . stop 89 0 6 ." можно написать default, но так больше контроля.

Если в дальнейшем нам понадобится удалить скрипт из автозагрузки пишем следующее:


# update-rc.d -f rc.firewall remove

Теперь можно приступить к написанию самого скрипта:

# nano /etc/init.d/rc.firewall

Для начала сообщим ядру, что оно имеет дело со сценарием. Делается это добавлением в начало файла строки

#!/bin/sh

Для начала зададим несколько переменных, исключительно для удобства редактирования и просмотра:

IPT="/sbin/iptables"    # переменная, задающая путь к файлу запуска iptables

INET_IFACE="eth0"    # ваш внешний сетевой интерфейс

Мы делаем крутую программу, поэтому реализуем возможность задавать параметры. Запихнем правила для iptables в функцию start_fw():


start_fw()
{             # начало функции

Первым делом включим перенаправление пакетов через ядро:

echo 1 > /proc/sys/net/ipv4/ip_forward

Сбросим правила и удалим цепочки:

$IPT -F
$IPT -X

Зададим политики по умолчанию:

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

Разрешить все движения пакетов не самое удачное решение, но поскольку мой компьютер является как шлюзом так и рабочей машиной, то пускай будет так. Настройку защиты от всякого рода опасностей себя любимого мы пока не рассматриваем. Для нас важно разрешающее правило для проходящих пакетов(FORWARD), хотя и это можно настроить. Но для простейшего случая сойдет.

Ну и наконец самое главное правило:

$IPT -A POSTROUTING -t nat -s 192.168.1.0/24 -o $INET_IFACE -j MASQUERADE
}         # конец функции start_fw()

Здесь создается новое правило постмаршрутизации таблицы NAT со всей локальной сети черев внешний интерфейс. Все компьютеры локальной сети теперь имеют доступ в интернет без ограничений. Хотя имеет смысл заметить, что DC клиенты, допустим, могут соединятся только в пассивном режиме. Для работы в активном режиме необходимо настроить прозрачный NAT. Но тема пребует более глубокого осмысления.
MASQUERADE позволяет корректно работать с динамическим внешним ip адресом.

Переходим к реализации параметров. Прийдется немного попрограммировать. Пишем:


case "$1" in

Для того, чтобы наш файервол можно было запустить командой /etc/init.d/rc.firewall start пишем следующую ветвь условия case:


start)   echo -n "Starting firewall"
            start_fw
            echo "."
            ;;

Чтобы можно было остановить файервол(когда возникнет такое желание) командой /etc/init.d/rc.firewall stop пишем:


stop)    echo -n "Stopping firewall"
            iptables -F
            iptables -X
            echo "."
            ;;

Ну и, на всякий случай, защита от неправильных параметров:


*)         echo "Usage: /etc/init.d/rc.firewall start | stop"
            exit 1
            ;;
esac    # закрываем условный оператор
exit 0   # успешное завершение

Вот и все. Простейший шлюз настроен. Полностью файл /etc/init.d/rc.firewall будет выглядеть так:


#!/bin/sh

IPT="/sbin/iptables"    # переменная, задающая путь к файлу запуска iptables
INET_IFACE="eth0"    # ваш внешний сетевой интерфейс

start_fw()
{             # начало функции

echo 1 > /proc/sys/net/ipv4/ip_forward

$IPT -F
$IPT -X

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

$IPT -A POSTROUTING -t nat -s 192.168.1.0/24 -o $INET_IFACE -j MASQUERADE
}         # конец функции start_fw()
  
case "$1" in

stop)    echo -n "Stopping firewall"
            iptables -F
            iptables -X
            echo "."
            ;;

stop)    echo -n "Stopping firewall"
            iptables -F
            iptables -X
            echo "."
            ;;

*)         echo "Usage: /etc/init.d/rc.firewall start | stop"
            exit 1
            ;;

esac    # закрываем условный оператор
exit 0   # успешное завершение

Следует также заметить, что если у вас в локальной сети не реализован DNS сервер, то в настройках клиента нужно указать DNS сервера провайдера, или, например, DNS сервер Google(8.8.8.8)

Комментариев нет:

Отправить комментарий