Настройка firewall в Ubuntu при помощи Webmin

Это руководство использует webmin как web интерфейс, чтобы настраивать необходимые правила iptables и серверы. Мне нравится использовать webmin вместо скриптов, потому что webmin более удоебан и более легкий для понимания чем скрипт с теми же самыми функциональными возможностями. Откройте терминал и запустите командамы ниже, чтобы установить все необходимое программное обеспечение:

sudo aptitude install bind9 dhcp3-server perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl

Вы можете найти последнюю версию webmin здесь как пакет для debian:

http://www.webmin.com/download.html

Последней версией во время написания этого руководства была версия 1.430, чтобы установить эту версию выполните следующую команду:

cd ~ && wget http://prdownloads.sourceforge.net/webadmin/webmin_1.430_all.deb && sudo dpkg -i webmin_1.430_all.deb

ПРИМЕЧАНИЕ: Это — ЧРЕЗВЫЧАЙНО плохая идея оставить webmin открытым для внешнего мира. Только Ваш пользовательский пароль стоит между удаленным хакером и полным контролем над Вашим pc. НЕ ДЕЛАЙТЕ ЭТОГО. Если Вы действительно нуждаетесь к доступу webmin удаленно, я предполагаю, что Вы знаете что Вы делаете, и знаете, как использоваться ssh tunnelling

Вы можете теперь получить доступ к webmin локально, следуя адресу https://localhost:10000. Если Вы будете использовать firefox, то Вы должны будете добавить исключение безопасности. Это сообщение возникает потому что используется само подписной сертификат. Как только Вы загрузились, Вы должны видеть следующий экран:

Все страницы конфигурации доступны через главное меню слева.

Из соображений безопасности первая вещь которую Вы должны сделать после того, как Вы загрузились со своим именем пользователя и паролем, заблокировть удаленный доступ к webmin. Щелкните «Webmin» в панели управления слева и пойдите в «Webmin Configuration». Теперь щелкните ip access control. Нажмите радио-кнопку которая говорит «Разрешено только от перечисленных адресов» и добавьте адресс «127.0.0.1» (без кавычек) в текстовое поле. Сохранить.

теперь Webmin готов к работе.

Настройка сетевых карт

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

ifconfig -a

Вы можете получить довольно много интерфейсов, в зависимости от Вашей системы, но единственные, которые Вас волнуют являются интерфейсами ethernet (те что назывются на подобии ethXX). Они будут обычно маркироваться eth0 и eth1, но могли бы быть любыми числами, таким образом я с этого времени назову их как eth_BAD и eth_SAFE. eth_BAD — интернет-адаптер, eth_SAFE — адаптер местной сети. Запишите какой интерфейс для чего, потому что Вы будете обращаться с ними часто.

Мы сначала настроим routing, используя для этого очень сильный и гибкий linux firewall, iptables.

Важно отметить, что, если бы Вы сделаете ошибку здесь, Вы можете полностью повредить всю организацию сети, которая наверняка отключит Ваш доступ к Интернету и также помешает Вам получить доступ к webmin, чтобы ликвидировать проблему. Если Вы столкнетесь с подобными трудностями, некоторые команды в конце этого руководства помогут ликвидировать проблему.

Теперь мы должны настроить перенаправление (forwarding) пакета, иначе NAT не будет работать. Вы можете сделать это, редактируя следующий файл:

sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak && sudo gedit /etc/sysctl.conf

Этот файл должен включать следующую строчку:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Для того чтобы включилось перенаправление пакетов перезагрузите систему.

На этот момент Ваш компьютер должен получить доступ в интернет через интерфейс eth_BAD, если интернет все еще не доступен — вернитесь к предыдущим шагам и сделайте так чтобы все заработало.

Теперь вернитесь в Webmin панель и выберете «Network Configuration», далее «Network Interfaces». Мы должны назначить статический IP адресс для локального сетевого интерфейса eth_SAFE.

В этом руководстве я буду использовать 192.168.0.0/24. Это стандартный диапазон адресов, который обычно используется в бытовых сетях. Перейдите в закладку «Interfaces Activated at the Boot Time», и кликните по eth_SAFE для настройки, если конечно этот интерфейс присутстсвует в списке. Если его нет, значит скорее всего он отключен и его нужно включить. Для проверки того что интерфейс включен наберите в комманднной строке комманду:

lshw -class network

Отключеный интерфейс помечен флажком DISABLED. Для включения интерфейса нажмите кнопку «Add a new interface», и введите следующую информацию:

«Name» — Введите имя интерфейса, вероятно eth0, eth1 или что то похожее.
«IP Address» — Убедись что «Static» radio кнопка нажата, и введи 192.168.0.1 в текстовое поле.
«Netmask» — Должно быть 255.255.255.0
«Broadcast» — 192.168.0.255
«Activate at boot?» — Выбирайте Yes

Затем нажмите «Create», нажмите радио кнопку следующую за созданым интерфейсом и нажмите «Apply» для активации этих настроек. Замечательно! Два сетевых интерфейса теперь настроены.

Настройка локальной сети

Назначение статического адреса для eth_SAFE это только часть того что нам нужно сделать для настройки локальной сети на этом интерфейсе. Мы так же должны предоставить кеширование DNS сервера и предоставить DHCP сервер для того чтобы передать клиентам необходимую информацию про локальную сеть и как разрешать (resolve) имена домейнов.

Конфигурирование DHCP

Мы сначала настроим DHCP. Откройте закладку «Servers» в панели webmin, и откройте DHCP Server. В разделе ПОДСЕТИ сверху, нажмите «Add new subnet». Введите следующие данные:

«Subnet description» — Имя подсети, Я использую «Local network on eth_SAFE»
«Network address» — 192.168.0.0
«Netmask» — 255.255.255.0
«Address ranges» — это может любой диапазон который ты захочешь, 192.168.0.100 — 192.168.200 должно быть достаточно.

Оставьте все другие настройки и нажмите «Create». Теперь должна появиться новая иконка с названием 192.168.0.0. Нажмите эту иконку, ты вернешься к экрану, похожему на предыдущий, исключая некоторые новые кнопки внизу. Нажми одну из них «Edit Client Options».

«Subnet mask» — 255.255.255.0
«Default routers» — 192.168.0.1
«Broadcast address» — 192.168.0.255
«DNS servers» — 192.168.0.1

Нажмите «Save» и еще раз «Save». И еще одна вещь, которуб нужно сделать на этой странице — скрол вниз и нажмите «Edit network interface». Выберете eth_SAFE в списке и нажмите «Save».

DHCP сервер теперь настроен. Нажмите «Start Server» кнопку внизу страницы, сервер должен запуститься без ошибок. Если ошибки все же есть — ты допустил где то ошибку.

Конфигурация firewall

Настройка ip masquerading (routing)

Теперь мы погрущимся в настройку iptables. Отныне вы можете полностью и испортить настройки своей сети если вы не осторожны, так что удостоверьтесь что вы знаете как исправить свои ошибки.

В панели webmin выберете «Linux Firewall». Выбрать радио кнопку «Do network address translation» и выбрать eth_BAD как интерфейс, на котором вы будете делать это. Выбрать чек бокс «Enable firewall at boot time» и нажмите «Setup Firewall». Нажмите «Apply Configuration».

Настройка firewall

На этом этапе твой сервер настроен как работающий router/dns/dhcp server, это должно работать в этой настройке для всего что тебе нужно, но это не безопасно. Мы должны определить несколько правил которые определяют кто может делать соединения с нашим сервером, мы просто не хотим чтобы кто нибудь из большого ужасного интернета ворвался в наш домашний файловый сервер, например. Мы сделаем это используя iptables фильтрацию.

Linux firewall работает с тремя IP таблицами: MANGLE, PREROUTING и FILTER. Собственно файрволинг осуществляется при помощи FILTER, таким образом в «Linux Firewall» секции webmin, измените IPTable выпадающий список на «Packet Filtering(filter)» IPTable.

Три «цепочки» перечислены там. Каждая цепочка определяет что делать с пакетом в зависимости от того куда он идет. Три цепочки INPUT, FORWARD & OUTPUT. Для каждой цепочки ты можешь добавлять правила (rules), которые говорят файрволу что сделать с пакетом, который соответствует определенным критериям. Ты вероятно захочешь внести в черный список (blacklist) все INPUT и FORWARD пакеты по умолчанию, и затем включать по одному в зависимости от потребностей. Изменить действие по умолчанию (default action) для INPUT & FORWARD на «DROP» (от переводчика: в случае ошибки вы можете отключить действие по умолчанию, смотрите дополнительные команды в конце статьи).

Для добавления правила просто кликните «Add Rule» кнопку и заполни критерии пакета и действие (action) для этого пакета.

Тут перечислен необходимый минимум правил которые тебе НУЖНЫ чтобы твоя сеть работала нормально:

INPUT

Accept if protocol is ICMP (note: This allows your server to respond to pings. It isn’t strictly necessary, but it doesn’t really pose a security risk and makes network troubleshooting a LOT easier. If you’re extremely paranoid, feel free not to bother with this option)
Accept if input interface is lo
Accept if input interface is eth_SAFE
Accept if input interface is eth_BAD and state of connection is ESTABLISHED,RELATED

FORWARD

Accept if input interface is eth_SAFE and output interface is eth_BAD
Accept if input interface is eth_BAD and output interface is eth_SAFE and state of connection is ESTABLISHED,RELATED

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

На этом месте ты фактически закончил настройку. Ты можешь оставить свой сервер как простой раутер без дополнительных правил на этом этапе. Это очень безопасно и будет работать хорошо для большинства целей. Если, все же, ты хочешь запустить публично доступный сервер, QOS фильтрацию или если внутреняя сеть не достаточно заслуживает доверия, ты должен добавить некоторые дополнительные правила. Читай дальше…

Кстати, мои INPUT и FORWARD таблицы выглядят как тут указано. Я добавил дополнительно правила чтобы позволить некоторым серверам быть доступнцми для наружной сети:

Более продвинутые задачи

Больше функций от IPTable

Если ты на самом деле хочешь использовать IPTables нормально, ты должен понять что это и как это работает, в какой очередности таблицы применяются. Я рекомендую почитать статьи в вики:

http://en.wikipedia.org/wiki/Iptables

Важно отметить на этом этапе, что IPTables будут применять твои правила для каждого пакета в очередности сверху донизу. Каждое правило сравнивается с пакетом. И как только как ACCEPT или DROP правило обнаружено которое соответствует типу пакета, это действие будет взято и исполнено. Если же пакет добрался до конца списка правил без соответствий, будет использовано действие по умолчанию (default action). Вот два примера:

Ruleset:
ACCEPT if input interface is eth1
DROP if port is 22

Any incoming packets on eth1 will be allowed through, EVEN IF the port is 22.

Ruleset:
DROP if port is 22
ACCEPT if input interface is eth1

Теперь каждый входящий пакет будет позволен для eth1 за исключением порта 22.

Сервера, бегущие на раутере.

Если ты хочешь запустить сервер на твоем раутере (веб сервер или SSH сервер), ты должен открыть эти порты для наружной сети. Это просто сделать при помощи добавления правила для INPUT фильтр явно разрешая входящее соединение. Просто нажми «Add Rule» и разреши пакеты определенного типа и порта, который необходим для сервера. SSH сервер мог бы бежать на порту 22 и принимать TCP пакеты, таким образом правило выглядело бы так:

Accept if protocol is TCP and destination port is 22.

Позволить статический IP в локальной сети

Иногда необходимо запустить сервер на PC в локальной сети и нужно произвести порт форвардинг (port forwarding), например web server или bittirrent client.

Это не намного сложнее чем для сервисов, бегущих на самом раутере, но все еще слишком проблематично. Сначала Вы должны настроить pc в локальной сети, который является сервером (отсюда упомянутый на как «хозяин») со статическим IP-адресом. Поскольку IP-адреса розданы с DHCP, хозяину можно было бы дать новый IP-адрес каждый раз, когда он соединяется с сетью. Вы можете легко дать этому статический IP-адрес, говоря серверу DHCP дать этому клиенту тот же самый IP-адрес каждый раз при подключении.

Откройте в webmin страничку «Servers», выберете DHCP server. В разделе hosts жмите «Add a new host». Заполните данные как указано ниже:


«Host description» — Что ты хочешь, это просто упоминание о хосте
«Host name» — Имя хоста. Исполните на хосте комманду hostname чтобы выяснить его имя.
«Hardware Address» — mac address хоста. Исполните на хосте комманду ifconfig (ipconfig для Windows) и смотрите этот мак адресс для соответствующей сетевой карты.
«Fixed IP address» — Статический адресс для этого хоста, то что тебе нужен. Этот IP-адрес должен быть в Вашем местном lan и не должен быть включен в группу IP-адресов, которые Вы уже сказали dhcp серверу раздавать динамически.Если Вы следовали за этим руководством, это должно быть 192.168.0. X, где X число от 2 до 99 включительно.
«Host assigned to» — Вы можете установить эту опцию в подсеть, чтобы использовать IP-адреса в пределах dhcp динамического выделения пула.

Жми «Save» когда ты закончил. Для применения всех настроек, тебе нужно удалить текущий DHCP lease, для этого нажми «List Active Leases» кнопку внизу и нажми текущий lease для необходимого хоста. Затем иди обратно в главную настройку dhcp server еще раз и нажми «Start Server» для применения всех настроек. В следующий раз когда хост соединится с сеткой он получит новый статический ip адрес.

Порт форвардинг

Теперь хост в локальной сети имеет постоянный статический адрес, раутер может послать пакет по этому адресу каждый раз, и пакте будет достигать правильного хоста.

Вы должны сделать две вещи. Сначала вы должны установить правило PREROUTING чтобы указать IPTables куда перенаправлять входящие пакеты, но так же ты должен явно позволить эти пакеты форвард (FORWARD) иначе ни будут заблокированы фильтром. Это замечтально и логично, но иногда может приводить к головоломкам, если ты забыл про один из шагов.

В Webmin жми «Networking» и затем «Linux Firewall». Измени IP Table в выпадающем списке на «Network address translation (nat)». В PREROUTING цепочке сверху, жми Add Rule. Заполни данные как указано ниже:

«Action to take» — Жми «Destination nat» radio button
«IPs and ports for DNAT» — Введи lan ip хоста и порт на который ты хочешь чтобы клиенты соединялись снаружи
«Network protocol» — Тебе нужно указать udp или tcp (если ты на самом деле хочешь использовать какой то другой протокол то это руководство не может тебе помочь)
«Destination TCP or UDP port» — Порт на котором сервер на самом деле слушает на этом хосте (примечание$: это не должен быть тот же самый порт, на который подсоединяются внешние клиенты)

Затем нажми «Save». Теперь измени IP Table в выпадающем списке на «Packet filtering (filter)». В FORWARD цепочке, добавь правило как это:

«Action to take» — Accept
«Network protocol» — set this to tcp or udp depending on what kind of service you are running. Some services (eg most bit torrent clients) need both tcp AND udp forwarded. In this case you may need to define two separate rules, one for tcp and one for udp.
«Destination TCP or UDP port» — set this to the incoming port used by the client when connecting from outside the lan.

Теперь ты можешь только «Apply configuration» и все.