В предыдущей заметке мы настроили сетевые интерфейсы на компьютере шлюзе. Сегодня сделаем возможным прохождение пакетов через шлюз к клиенту. Делается это с помощью встроенного в ядро Linux файервола iptables.
Умолчальные настройки нас не устраивают. На мой взгляд лучшее решение - собрать все настройки iptables в одном файле. И перво наперво этот файл нужно создать. Все дальнейшие действия выполняются под личиной Суперпользователя.
Создаем файл /etc/init.d/rc.firewall:
Наш файл является сценарием оболочки, поэтому делаем его исполняемым следующей командой:
Чтобы все работало после перезагрузки, помещаем наш скрипт автозагрузку при помощи команды:
Вместо непонятных буковок "start 40 S . stop 89 0 6 ." можно написать default, но так больше контроля.
Если в дальнейшем нам понадобится удалить скрипт из автозагрузки пишем следующее:
Теперь можно приступить к написанию самого скрипта:
Для начала сообщим ядру, что оно имеет дело со сценарием. Делается это добавлением в начало файла строки
Для начала зададим несколько переменных, исключительно для удобства редактирования и просмотра:
IPT="/sbin/iptables" # переменная, задающая путь к файлу запуска iptables
INET_IFACE="eth0" # ваш внешний сетевой интерфейс
Мы делаем крутую программу, поэтому реализуем возможность задавать параметры. Запихнем правила для iptables в функцию start_fw():
Первым делом включим перенаправление пакетов через ядро:
Сбросим правила и удалим цепочки:
Зададим политики по умолчанию:
Разрешить все движения пакетов не самое удачное решение, но поскольку мой компьютер является как шлюзом так и рабочей машиной, то пускай будет так. Настройку защиты от всякого рода опасностей себя любимого мы пока не рассматриваем. Для нас важно разрешающее правило для проходящих пакетов(FORWARD), хотя и это можно настроить. Но для простейшего случая сойдет.
Ну и наконец самое главное правило:
Здесь создается новое правило постмаршрутизации таблицы NAT со всей локальной сети черев внешний интерфейс. Все компьютеры локальной сети теперь имеют доступ в интернет без ограничений. Хотя имеет смысл заметить, что DC клиенты, допустим, могут соединятся только в пассивном режиме. Для работы в активном режиме необходимо настроить прозрачный NAT. Но тема пребует более глубокого осмысления.
MASQUERADE позволяет корректно работать с динамическим внешним ip адресом.
Переходим к реализации параметров. Прийдется немного попрограммировать. Пишем:
Для того, чтобы наш файервол можно было запустить командой /etc/init.d/rc.firewall start пишем следующую ветвь условия case:
Чтобы можно было остановить файервол(когда возникнет такое желание) командой /etc/init.d/rc.firewall stop пишем:
Ну и, на всякий случай, защита от неправильных параметров:
exit 0 # успешное завершение
Вот и все. Простейший шлюз настроен. Полностью файл /etc/init.d/rc.firewall будет выглядеть так:
IPT="/sbin/iptables" # переменная, задающая путь к файлу запуска iptables
INET_IFACE="eth0" # ваш внешний сетевой интерфейс
echo 1 > /proc/sys/net/ipv4/ip_forward
esac # закрываем условный оператор
exit 0 # успешное завершение
Следует также заметить, что если у вас в локальной сети не реализован DNS сервер, то в настройках клиента нужно указать DNS сервера провайдера, или, например, DNS сервер Google(8.8.8.8)
Умолчальные настройки нас не устраивают. На мой взгляд лучшее решение - собрать все настройки 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
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
;;
exit 0 # успешное завершение
Следует также заметить, что если у вас в локальной сети не реализован DNS сервер, то в настройках клиента нужно указать DNS сервера провайдера, или, например, DNS сервер Google(8.8.8.8)
Комментариев нет:
Отправить комментарий