Интернет шлюз на Linux Debian/Ubuntu

среда, 16 апреля 2014 г.

Задача:
1. Разрешить пользователям локальной сети выходить в интернет с помощью шлюза на Linux Debian/Ubuntu без особых ограничений.

Интернет шлюз на Linux Debian/Ubuntu


Дано: 1. Компьютер с двумя сетевыми картами. 2. Дистрибутив Debian или Ubuntu Linux. (я бы всё-таки советовал для сервера Debian) 3. Прямые руки и свежая голова.



Итак, приступаем!
Для начала перво-наперво установим Linux на компьютер, указав при этом все настройки сети. Я рекомендую устанавливать Debian, и в момент запроса у нас выбора необходимых пакетов, установим только основные компоненты системы и openssh-server. Всё, больше для работы шлюза на linux нам ничего не надо. Никаких графических оболочек. Устанавливать будем напрямую, а подключаться потом можно по ssh для управления удалённым сервером, или если не подключены клавиатура, мышь и монитор. Установка Debian на компьютер немногим отличается от установки Ubuntu.

Установив Linux на компьютер мы должны сделать его шлюзом. Для это он должен кое-что уметь.
1. Пропускать сетевые пакеты через себя. (FORWARD)
2. Транслировать сетевые адреса (преобразовать адреса локальной сети в 1 внешний адрес, под которым пользователь будет выходит в сеть). Иными словами шлюз (gateway) пускает через себя пользователей локальной сети под своим адресом. Можете назвать это программным роутером или как вам будет угодно. Служба эта называется NAT (Network Address Translation).

Но обо всём по порядку. Для начала настроим сетевые интерфейсы. Настройки локальной сети берёте у себя, настройки интернет - у провайдера. Если выход в интернет не по ip-авторизации, а через xDSL соединение, то используйте утилиту pppoeconf.

Представим, что у нас есть 2 настроенных сетевых интерфейса. Это локальный (eth0) и внешний (eth1). Интернет на шлюзе есть, яндекс пингуется, гугл туда же. Практически последняя задача - заставить наш шлюз на Linux пускать всех в инет через себя. Вот здесь хочу отметить, что на linux есть свой файрволл, и называется он iptables. По умолчанию iptables работает таким образом - "К себе никого  не пущу, кроме как по тем соединениям, что были инициированы мной!" Но так не пойдёт ) Поэтому настраиваем iptables:

Я рекомендую иметь все настройки iptables в отдельном файле, который при необходимости можно будет отредактировать. Собственно файлик этот и будет рулить.

Поехали:
1. Создаем файл с именем firewall.sh в папке /etc/init.d/

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

2. Даём права на запуск

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

3. Добавляем наш скрипт в автозагрузку. На всякий случай :)

# update-rc.d firewall.sh defaults

4. Ну и, собственно, редактируем наш скрипт.

nano /etc/init.d/firewall.sh

Дадим ядру понять, что это реально .sh скрипт

# !/bin/sh (вот здесь прямо так вместе с символом # и пишем внутри! Это тот тип комментария, который нужен ядру)

Включим форвардинг в линукс.

echo 1 > /proc/sys/net/ipv4/ip_forward (1 - вкл, 0- выкл :))

Сбросим все настройки входящих, исходящих и форварда. Это поможет нам избавится от "неправильных" правил iptables, набранных в консоли. Просто запустим скрипт, и правила обновятся:

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

Политика по умолчанию - форвард разрешён:

iptables -P FORWARD ACCEPT

Добавим новое правило постмаршрутизации в сетевую таблицу "nat". Логика правила такая: С источника "локальная сеть"  исходящие пакеты через внешний интерфейс должны "натиться" (передваться как один внешний), но мы будем маскарадить. Маскарад (MASQURADE)  даёт возможность корректной работы с динамическим внешним ip адресом. iptables -A (новое правило) POSTROUTING (постмаршрутизации) -t (таблицы...) nat (...NAT) -s (source - с источника) 192.168.1.0/24 (всей локальной сети) -o (output - через исходящий...) eth1 (...интерфейс eth1) -j (job -работа (что делать?)) MASQUERADE (маскарадить). Т.е. получается такое правило iptables:

iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth1 -j MASQUERADE

Собственно всё. Можно ещё добавить в конец скрипта что-то вроде оповещения, которое будет говорить о том, что скрипт сработал:

echo firewall rules accepted
Сохраняем и закрываем. (Если редактировали через nano, как в этой статье, то жмём ctrl+o (сохранить) ctrl+x (закрыть)).
Теперь запустим наш скрипт

/etc/init.d/firewall.sh

Увидели сообщение "firewall rules accepted"? Никаких ошибок не было? Поздравляю! Шлюз на linux готов! Теперь все компьютеры из вашей локальной сети смогут ходить в интернет, правда совсем без каких либо ограничений. И да, если в вашей сети нет DNS сервера, то в настройках клиента нужно указать DNS сервера провайдера или например, DNS сервер Google ;) (адрес легко запомнить - 8.8.8.8)

Ну и, как всегда, я надеюсь, что данная статья помогла вам настроить шлюз на linux debian/ubuntu. Удачи вам в ваших начинаниях!

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