300-тысячная статейка про интернет шлюз

Вводная

Я понимаю, что таких (подобных) инструкций в интернете — целое море. Но вот пришел мой черед искать информацию по данному вопросу — и все-равно немало времени убил на поиски. В принципе, в этой заметке я постараюсь не сильно дублировать информацию, но по максимуму выложу ссылки, которые помогли мне…

Началась моя эпопея со звонка одного знакомого: «А вот можно проверять на вирусы интернет-трафик всего офиса?» Причем, вопрошавший хотел, чтобы эта функция была возложена на какой-нибудь «трехкопеечный» SOHO-роутер, которому родную прошивку заменили на какую-нибудь альтернативную. Пришлось его разочаровать, т.к. те «коробочки» на использование которых собственно и рассчитывал мой знакомый, с такой задачей вряд-ли смогли бы справиться ввиду своей «хилости». Из недорогих (по меркам цен для подобного оборудования) решений были найдены шлюзы серии NetDefend фирмы D-Link. Цена эта, правда, оказалась сопоставима с ценой недорогого нового офисного компьютера (самого системного блока без монитора и манипуляторов). В итоге знакомый сказал «дорого» (и в последствии пропал с горизонта и вовсе), а я решил поискать информацию о том, как сделать это с помощью обычного компьютера, использующего Linux в качестве ОС, и open-source ПО для выполнения поставленных задач.  По мере чтения всего того, что предлагал Google, вырисовывались даже гораздо более интересные перспективы, чем изначальная задача. В итоге и родился этот «сборник цитат», который Вы сейчас и читаете.

Процесс выполнения данной задачи можно разделить на несколько этапов.  Заканчиваю рассусоливать и перехожу к первому:

1. Просто шлюз

«Просто шлюз» нам нужен, чтобы все пользователи офиса (или, допустим, «другие домашние компьютеры») могли легко подключаться к нему и получить доступ в интернет. Кстати, эта первая часть заметки будет очень полезна тем, кто ищет ответ на вопросы типа «Как расшарить интернет под Linux-ом?» и тому подобные.

Итак, у меня был компьютер, работающий под управлением Linux (дистрибутив Ubuntu 9.04). Компьютер был как раз класса того самого «недорогого офисного». Причем справится с задачей может даже б/у компьютер, объявлений о продаже которых предостаточно в любой местной газете. Главное отличие — в нем было установлено две сетевые платы. Первая сетевая плата называлась eth0, и через нее компьютер был подключен в интернет. Вопрос подключения к интернету тут мы рассматривать не будем. Единственное, что примем к сведению, так это адрес платы eth0 — 192.168.1.2 и адрес шлюза, к которому она подключена — 192.168.1.1. Ко второй сетевой плате — она называлась eth1 — я планировал подключать пользователей офиса. Причем, сделать это подключение для пользователей максимально простым. С этой целью на интерфейсе я поднял DHCP-сервер.

Сначала я выставил сетевой плате eth1 фиксированный адрес. Причем, выбрать его нужно таким, чтобы он не попадал в диапазон адресов подсети, к которой относится сетевая плата eth0 (а там, как мы помним, у меня 192.168.1.ххх). В итоге я решил, что пускай у моей платы eth1 адрес будет 192.168.100.1. Чтобы назначить ей такой адрес, я отредактировал файл /etc/network/interfaces, для чего ввел команду:

sudo nano /etc/network/interfaces

В файле этом я дописал следующие строки:

auto eth1
iface eth1 inet static
        address 192.168.100.1
        netmask 255.255.255.0

После чего вышел из редактора, нажав «Ctrl + X». На вопрос о сохранении изменений ответил «Да» (кнопка «Y»). И подтвердил имя файла, не меняя его (кнопка «Enter»). Введенные строки определяют следующее:

  • Интерфейс eth1 автоматически стартует при загрузке (строка «auto eth1«);
  • У интерфейса eth1 будет статический (т.е. фиксированный) адрес (слово «static«)
  • У интерфейса eth1 будет адрес 192.168.100.1
  • Маска подсети на интерфейсе eth1 будет 255.255.255.0

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

sudo /etc/init.d/networking restart

Теперь пришло время установить DHCP-сервер и запустить его на интерфейсе eth1. Для этого вводим команду:

sudo apt-get install dnsmasq

(Подразумевается, что через интерфейс eth0 наш компьютер уже подключен к интернету, и репозитории настроены). По этой команде программа dnsmasq (а это и есть тот самый DHCP-сервер) была загружена и установлена на мой компьютер. Мне оставалось лишь подстроить ее параметры под мои нужды. Для этого я слегка подредактировал файл настроек указанной программы (/etc/dnsmasq.conf), введя команду:

sudo nano /etc/dnsmasq.conf

Файл сам по себе достаточно большой, и настроить в нем можно «ну очень много всего». Для моего простейшего случая оказалось достаточным указать всего два параметра. Первый делом я указал тот интерфейс, на котором сервер собственно и будет работать (слушать DHCP и DNS запросы). Параметр указывается одной простой и доходчивой строкой:

interface=eth1

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

dhcp-range=192.168.100.50,192.168.100.250,12h

Опять же, выходим из редактора и сохраняем изменения.

Эти два указанных мной параметра определили следующее: клиентам, подключающимся к сетевой плате eth1, автоматически будут присваиваться адреса в диапазоне от 192.168.100.50 до 168.100.250, и «срок аренды» составит 12 часов. Обратите внимание, что диапазон выдаваемых адресов, должен принадлежать той подсети, которую мы указали для сетевой платы eth1.

Два слова про «срок аренды». Параметр этот опциональный и указывает — в течении какого времени сервер помнит, что «такой-то» адрес, который был автоматически присвоен «такому-то» клиенту (компьютеру), все еще «принадлежит» ему. Таким образом сохраняется возможность, что один и тот же компьютер будет по возможности получать один и тот же адрес. (Если вдруг это кому-то важно 🙂 )…

Все остальные настройки в файле закомментированы (т.е. либо не используются, либо, там где это необходимо, используются «умолчательные» значения). Они позволяют более тонко настроить сервер под собственные нужды. В том числе например, ЖЕСТКО указать присвоение одному и тому же клиенту всегда одного и того же адреса, а также многое другое. С другой стороны, все перечисленные в файле параметры хорошо прокомментированы (на английском, естественно), на тот случай, если Вы решите настроить сервер именно «более тонко»…

Но вернемся к нашему серверу. После того, как настройка его завершена, перезапускаем сам сервер:

sudo /etc/init.d/dnsmasq restart

С этого момента можно подключать клиентов (компьютеры пользователей) к сетевой плате eth1. Одного (например, второй компьютер в доме) можно подключить и напрямую, а если нескольких, то тогда уже через обычный hub или switch с требуемым числом портов. На компьютерах клиентов, работающих в ОС Windows, в свойствах сетевой платы для протокола TCP/IP нужно указать «Получить IP-адрес автоматически» и «Получить адрес DNS-сервера автоматически». В таком случае компьютер пользователя при подключению к нашему шлюзу будет автоматом настраиваться на то, что основным шлюзом у него будет 192.168.100.1, маска подсети — 255.255.255.0, и адрес ему будет присваиваться один из того диапазона, который мы указали при настройке dnsmasq (то есть, от 192.168.100.50 и до 168.100.250). Для компьютеров клиентов, работающих под управлением ОС Linux, скорее всего вообще не нужно будет ничего настраивать — в большинстве дистрибутивов после установки DHCP-клиент стартует автоматом…

Итак, наши пользователи на автомате успешно подключаются к шлюзу и получают адреса. Все хорошо?! На первый взгляд — да. Первые пару минут… Но потом оказывается, что до полного счастья им не хватает …доступа в интернет! А мы то ведь шлюз делали…

На самом деле, для того, чтобы выпустить наших пользователей в интернет, осталось всего лишь включить функцию NAT (преобразования сетевых адресов). Для этого создадим новый файл настроек файервола, в котором на данном этапе будет всего одна единственная — включить NAT. Чтобы создать новый файл правил (я назвал его fw.rules и разместил в папке /etc/network, а Вы можете придумать и другое имя), введем следующую команду:

sudo touch /etc/network/fw.rules

Теперь откроем новый файл в редакторе:

sudo nano /etc/network/fw.rules

И впишем в него следующее:

        #!/bin/sh
        INET="eth1"
        INETIP="192.168.1.1"

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

        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT

        iptables -t nat -A POSTROUTING -o $INET -j SNAT --to-source $INETIP
        echo "1" > /proc/sys/net/ipv4/ip_forward

Сохраняем изменения, выходим из редактора. Из того, на что стоит обратить внимание:

  • Строка INET=»eth1″ указывает на сетевой интерфейс (плату) к которой подключены пользователи, которым мы будем предоставлять доступ в интернет.
  • Строка INETIP=»192.168.1.1″ указывает на шлюз, где у нас этот самый интернет и живет (помните, в самом начале я упоминал о том, что «…мой компьютер к интернету подключен сетевой платой eth0 через шлюз 192.168.1.1». Так вот это он и есть….

ПРИМЕЧАНИЕ: Данный файл должен выглядеть несколько иначе, если ваш «шлюз» использует не статический IP-адрес, а получает его динамически по DHCP. В этом случае вам нужно вместо функции SNAT использовать MASQUERADE. В итоге строка

        iptables -t nat -A POSTROUTING -o $INET -j SNAT --to-source $INETIP

должна быть заменена на такую

        iptables -t nat -A POSTROUTING -o $INET -j MASQUERADE

а строку

        INETIP="192.168.1.1"

из скрипта можно удалить вовсе.

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

sudo chmod +x /etc/network/fw.rules

…и запускаем его:

sudo /etc/network/fw.rules

Все! Вот теперь наши пользователи наконец-то получили то, чего так желали — доступ в интернет. Осталось лишь сделать так, чтобы наши «правила файервола» запускались автоматически каждый раз при загрузке компьютера. Для этого еще раз отредактируем файл /etc/network/interfaces:

sudo nano /etc/network/interfaces

И впишем в него еще одну строку. В приведенном ниже примере она выделена красным:

auto eth1
iface eth1 inet static
pre-up /etc/network/fw.rules
        address 192.168.100.1
        netmask 255.255.255.0

Сохраняем изменения и выходим из редактора.

В итоге мы получили самый простой шлюз, который при подключении к нему пользователей автоматом присваивает им IP-адреса и «выпускает» их в интернет. Таким образом, первая часть «глобального плана» выполнена. Ах да, я же не сказал — что выполнено и зачем? Помните еще — в самом начале знакомый мой хотел, чтоб шлюз проверял трафик на вирусы? Так вот сам шлюз мы уже сделали. Пользователи из локальной сети к нему подключаются, получают автоматом (по DHCP) все настройки и затем — доступ в интернет. Что нам это дало? Весь трафик нашей локальной сети теперь идет через шлюз, и проверять на вирусы достаточно только трафик самого шлюза, а не каждого клиентского компьютера в отдельности. О самой «борьбе с вирусами» — будет далее, а пока что еще немного ссылок про шлюзы:

И еще. Как я уже прозрачно намекал ранее, написанные нами правила не стоит громко называть файерволом в том смысле, что в них «все разрешено», и они ни от чего не защищают. Их единственной задачей было включить раздачу интернета для компьютеров локальной сети («расшарить его»). По этому, вот еще одна ссылка, подробно описывающая работу с iptables, которая позволит Вам настроить правила посерьезнее:

…Ну а к вирусам мы еще вернемся.

И следующим шагом на этом пути будет установка и запуск прокси-сервера.

300-тысячная статейка про интернет шлюз: 4 комментария

  1. Здравствуйте!
    Спасибо за статью. Правда уменя возникла проблема: при запуске fw.rules вылезает сообщение :

    -bash: /etc/network/fw.rules: /bin/sh^M: bad interpreter: No such file or directory

    Причём, sh cуществует и при запуске исправно выдаёт заголовок: sh-4.2#

    Внимание — вопрос: Что делать?

  2. открыть для редактирования скрипт в ЛИНУКСОВОМ редакторе и поудалять в нем в конце каждой строки
    ^M
    которые туда вставил ваш виндосовский блокнот (или иной редактор)…

  3. Доброго времени суток, dmitry!
    Нету там такого! После копирования всё было подчищено при помощи Vi. И только потом происходил запуск. Кстати, на виртуальной машине этого не было и сам скрипт вручную запустился сразу и без проблем, но при попытке вставить его в /etc/network/interfaces падают оба сетевых интерфейса. Если убираю — оба работают. Система Ubuntu-Server 11.04 «Natty Narwhal»-Release i386.

    И снова тот же вопрос: Что делать?

  4. спасибо за подробный рассказ, вы нас очень выручили

Обсуждение закрыто.