Вводная
Я понимаю, что таких (подобных) инструкций в интернете — целое море. Но вот пришел мой черед искать информацию по данному вопросу — и все-равно немало времени убил на поиски. В принципе, в этой заметке я постараюсь не сильно дублировать информацию, но по максимуму выложу ссылки, которые помогли мне…
Началась моя эпопея со звонка одного знакомого: «А вот можно проверять на вирусы интернет-трафик всего офиса?» Причем, вопрошавший хотел, чтобы эта функция была возложена на какой-нибудь «трехкопеечный» 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) все настройки и затем — доступ в интернет. Что нам это дало? Весь трафик нашей локальной сети теперь идет через шлюз, и проверять на вирусы достаточно только трафик самого шлюза, а не каждого клиентского компьютера в отдельности. О самой «борьбе с вирусами» — будет далее, а пока что еще немного ссылок про шлюзы:
- http://www.opennet.ru/base/net/debian_router.txt.html
- http://www.openkazan.info/node/3456
- http://silverghost.org.ua/2009/08/31/domashnij-shlyuz-na-ubuntu/
И еще. Как я уже прозрачно намекал ранее, написанные нами правила не стоит громко называть файерволом в том смысле, что в них «все разрешено», и они ни от чего не защищают. Их единственной задачей было включить раздачу интернета для компьютеров локальной сети («расшарить его»). По этому, вот еще одна ссылка, подробно описывающая работу с iptables, которая позволит Вам настроить правила посерьезнее:
…Ну а к вирусам мы еще вернемся.
И следующим шагом на этом пути будет установка и запуск прокси-сервера.
Здравствуйте!
Спасибо за статью. Правда уменя возникла проблема: при запуске fw.rules вылезает сообщение :
-bash: /etc/network/fw.rules: /bin/sh^M: bad interpreter: No such file or directory
Причём, sh cуществует и при запуске исправно выдаёт заголовок: sh-4.2#
Внимание — вопрос: Что делать?
открыть для редактирования скрипт в ЛИНУКСОВОМ редакторе и поудалять в нем в конце каждой строки
^M
которые туда вставил ваш виндосовский блокнот (или иной редактор)…
Доброго времени суток, dmitry!
Нету там такого! После копирования всё было подчищено при помощи Vi. И только потом происходил запуск. Кстати, на виртуальной машине этого не было и сам скрипт вручную запустился сразу и без проблем, но при попытке вставить его в /etc/network/interfaces падают оба сетевых интерфейса. Если убираю — оба работают. Система Ubuntu-Server 11.04 «Natty Narwhal»-Release i386.
И снова тот же вопрос: Что делать?
спасибо за подробный рассказ, вы нас очень выручили