Ubuntu интернет шлюз настройка

Обновлено: 04.07.2024

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

В этой статье, я расскажу как настроить шлюз для локальной сети на Ubuntu, схема его работы очень простая, но и защиты он не обеспечивает. Существует распространенное заблуждение что NAT ( Network Address Translation -транслятор сетевых адресов) обеспечивает защиту от внешних угроз, но это далеко не так, у него совершенно другое назначение, фактически это дверь, которая открывается в обе стороны, со всеми вытекающими последствиями…
Если есть необходимость в повышении уровня безопасности, а такая необходимость есть всегда, то тут нужно настраивать «фаерволл», я намеренно не привожу никаких правил на этот случай, т.к. они настраиваются исходя из конкретных задач.
В целом, данная статья планировалась как база, для статей на ближайшие пару лет, на ее основе можно развернуть целую кучу серверов, фактический, данный сервер может обрастать функционалом, исходя из ваших задач и потребностей.

Для работы нам понадобится
1) Система с двумя сетевыми картами-которая будет выполнять функцию шлюза.
2) Клиентский ПК, с которого мы будем тестировать работу шлюза.


Схема работы:

Предполагается, что операционная система у вас установлена, на сервере который имеет 2 сетевых интерфейса.
eth0 — подключение к интернет. (может получать IP адрес динамически, может иметь статический, я опишу оба варианта)
eth1 — подключение к локальной сети, будет иметь статический IP 192.168.10.1 и маску 255.255.255.0
Также, для тестирования нам понадобится клиентская машина, которая будет находиться в локальной сети (операционная система значения не имеет).

Первым делом, настраиваем сетевые интерфейсы сервера:
Поднимаем права до root

Вводим пароль.
Редактируем настройки сетевых интерфейсов:


Навастриваем eth0 (по которому осуществляется подключение к интернет)
Вариант №1- Получение IP по DHCP от провайдера:


Вариант №2-Статический IP


Где:
Вместо XXX.XXX.XXX.XXX вписываем IP адрес, который мы получили от провайдера
Вместо 255.YYY.YYY.YYY -выписываем маску подсети.
Ну и вместо ZZZ.ZZZ.ZZZ.ZZZ вписываем IP адрес DNS сервера.
Настраиваем eth1 (по которому подключается локальная сеть)


В результате действий у на должен получиться файл interfaces, примерно, следующего содержания:


Сохраняем изменения, выходим.
Перезапустим сеть:


Из написанного, думаю понятно, что в локальной сети адрес шлюза и dns сервера, будет 192.168.10.1.

Переходим на к нашему тестовому клиенту, т.к. у нас в сети нет DHCP сервера, то IP адрес мы будем назначать в ручную.
Присваиваем клиенту:
IP 192.168.10.2
маску подсети 255.255.255.0
шлюз 192.168.10.1
DNS 192.168.10.1

пробуем с клиента принговать 192.168.10.1 — запросы должны бегать нормально.

Переходим на наш шлюз.
Установим пакет dnsmasq, он необходим для перенаправления DNS запросов, вышестоящим серверам.


Возвращаемся к клиенту, выполняем на нем

В ответ подучаем:

необходимо найти строку и снять с нее комментарий:

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

Теперь, нам необходимо добавить правила для маршрутизации пакетов:

Добавим перед строкой exit 0


Значение можно разобрать самостоятельно (будет в качестве домашнего задания), на форуме ubuntu был отличный FAQ по настройке iptables.
Сохраняем изменения, и перезагружаем сервер

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

Небольшой эксперимент создания интернет-шлюза на Ubuntu Server. У меня дома компьютер с установленной Windows 10 и VirtualBox. Давайте создадим четыре виртуальные машины router , pc-1 , pc-2 и server . Все виртуальные машины находятся в одной сети 192.168.30.0/24 . При этом у виртуальной машины router два сетевых интерфейса:

  • enp0s3 (сетевой мост) — смотрит в домашнюю сеть, получает ip-адрес 192.168.110.8 от роутера
  • enp0s8 (внутренняя сеть) — смотрит в одну сеть с виртуальными машинами pc-1 , pc-2 и server


Тут надо сказать несколько слов о настройке сети в VirtualBox. Существует несколько способов, рассмотрим два из них:

  • Сетевой мост — при таком подключении виртуальная машина становится полноценным членом локальной сети, к которой подключена основная система. Виртуальная машина получает адрес у роутера и становится доступна для других устройств, как и основной компьютер, по своему ip-адресу.
  • Внутренняя сеть — тип подключения симулирует закрытую сеть, доступную только для входящих в ее состав машин. Поскольку виртуальные машины не имеет прямого доступа к физическому сетевому адаптеру основной системы, то сеть получается полностью закрытой, снаружи и изнутри.

Как нетрудно догадаться, у виртуальных машин pc-1 , pc-2 и server будет по одному интерфейсу (внутренняя сеть). У виртуальной машины router два интерфейса и она будет обеспечивать выход в интернет для pc-1 , pc-2 и server .

Настройка сети для router

Сначала нужно посмотреть, как называются сетевые интерфейсы в системе:

Теперь редактируем файл /etc/netplan/01-netcfg.yaml

Применяем настройки и смотрим сетевые интерфейсы:

Первый сетевой интерфейс enp0s3 получил ip-адрес 192.168.110.8 от домашнего роутера (этот адрес закреплен постоянно для router ). Второму сетевому интерфейсу enp0s8 мы назначили ip-адрес 192.168.30.1 .

Настройка сети для pc-1, pc-2 и server

Сначала для виртуальной машины pc-1 . Смотрим, как называются сетевые интерфейсы в системе:

Открываем на редактирование файл /etc/netplan/01-netcfg.yaml :

Применяем настройки и смотрим сетевые интерфейсы:

Для виртуальных машин pc-2 и server все будет аналогично, так что не буду описывать подробно. Для примера — виртуальной машине pc-2 мы назначили ip-адрес 192.168.30.3/24 :

Настройка интернет-шлюза

Виртуальная машина router должна обеспечивать выход в интернет для всех компьютеров из локальной сети 192.168.30.0/24 . По умолчанию транзитный трафик отключен, так что редактируем файл /etc/sysctl.conf :


Чтобы внесенные изменения вступили в силу:

После этого настраиваем netfilter с помощью утилиты iptables :

И смотрим, что получилось:

Мы разрешили ходить транзитным пакетам для нашего диапазона ip-адресов, а всё остальное запретили. Теперь настроим SNAT (подмена адреса источника), что позволит всем компьютерам сети выходить в интернет, используя единственный ip-адрес 192.168.110.8 .

И смотрим, что получилось:

Теперь проверяем наличие интернета на виртуальных машинах pc-1 , pc-2 и server :

Доступ внутрь сети

Давайте теперь посмотрим, как получить доступ извне к компьютеру внутри сети 192.168.30.0/24 . Установим на виртуальную машину server SSH-сервер:

А на виртуальной машине router будем отбирать tcp-пакеты, которые приходят на интерфейс enp0s3 на порт 2222 и отправлять эти пакеты виртуальной машине server на порт 22, заменяя в пакетах пункт назначения на 192.168.30.254 :

Смотрим, что получилось:

Теперь попробуем с физического компьютера установить ssh-соединение с виртуальной машиной server . Открываем PowerShell и выполняем команду:

Мы в команде указываем порт 2222 и ip-адрес виртуальной машины router — 192.168.110.8 , которая находится в одной сети 192.168.110.0/24 с физическим компьютером. А виртуальная машина router пробрасывает это соединение с интерфейса enp0s3 на интерфейс enp0s8 и дальше — виртуальной машине server , но уже на порт 22.


Сохранение правил netfilter

Созданные с помощью утилиты iptables правила пропадут при перезагрузке. Так что их нужно сохранить и восстанавливать при перезагрузке. В этом нам поможет пакет iptables-persistent :

При установке пакета будет предложено сохранить текущие правила iptables :

  • в файл /etc/iptables/rules.v4 для протокола IPv4
  • в файл /etc/iptables/rules.v6 для протокола IPv6


После установки пакета будет добавлена новая служба netfilter-persistent.service , которая при загрузке системы будет восстанавливать созданные нами правила:

При добавлении новых правил, надо сохранить конфигурацию с помощью команды



На просторах интернета присутствует бесчисленное количество информации касательно настройки сервера на Ubuntu, но на каждом шагу можно встретить неочевидные для новичка моменты. Я хочу поделиться своим опытом и, возможно, решить чью-то проблему. В статье будет рассказано, как настроить многопортовый сервер (6 портов): Netplan, DHCP-сервер, UFW(Uncomplicated Firewall). А теперь обо всем по порядку.

Введение

Обновил я интернет до 500 Мбит/с, и пришло время заняться 100 Мбитным сервером, который работал на Pentium 3 и был уже на грани. Выбор пал на китайского зверя. Все, что нужно — имеется, потребление в обычном режиме не превышает 15W, запас производительности для дополнительных задач есть.

Установку ОС расписывать не буду («ОК — Далее — Далее»), отмечу только, что при установке требуется сконфигурировать хотя бы один сетевой интерфейс для доступа в интернет.

Для удобства я использую Midnight Commander и его текстовый редактор. Работать будем от root-пользователя:


Итак, у нас есть установленная Ubuntu Server, начнем с конфигурации остальных сетевых интерфейсов.

Netplan

В последних версиях Ubuntu появилась утилита Netplan, позволяющая настроить сеть в унифицированном формате и выбирать сетевой менеджер для работы. По умолчанию используется Systemd-networkd, я же выбрал NetworkManager, так как установил Web-интерфейс Cockpit, который использует именно NM для отображения части информации.
Синтаксис конфигурации Netplan очень строгий и лишний пробел или табуляция может вызвать ошибку.

Посмотрим названия интерфейсов:


Перейдем в директорию /etc/netplan и откроем (F4 для МС) файл 50-cloud-init.yaml. Для сетевого интерфейса, который будет использоваться для подключения к интернету, определим получение настроек по dhcp (dhcp4: true). В моем случае это enp6s0. Для остальных укажем false и добавим параметр optional: true, т.к. интерфейс может быть ни к чему не подключен.

Для объединения интерфейсов в локальную сеть я использовал bridge, но, возможно, правильнее было бы использовать vlan. Создадим мост lan-br, зададим общий IP-адрес, DNS-сервер и пропишем объединяемые интерфейсы:


У меня будет собственный DNS-сервер, поэтому указываю адрес своего сервера в поле nameservers, можно указать например 8.8.8.8 (Google). Указываем версию и менеджер. В итоге должно получиться примерно так:


Сохраняем файл и проверяем/применяем конфигурацию:

Если все сделано правильно, то 'ip a' покажет примерно такую картину:

DHCP-сервер

Настроим DHCP-сервер для того, чтобы клиенты могли получать IP-адреса автоматически.


В файле /etc/default/isc-dhcp-server правим строчку:


Переходим в /etc/dhcp, открываем dhcpd.conf и прописываем настройки:


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

UFW (Uncomplicated Firewall) — инструмент для более легкой настройки iptables. Настроим фаервол и пересылку пакетов между интерфейсами. Переходим в/etc/ufw и в файле sysctl.conf раскомментируем строку:


Если Вы подключены через ssh перед началом откройте 22 порт:


Включим UFW, проверим состояние:


Зададим политики по умолчанию:


Разрешим доступ из локальной сети:


Сохраняемся и перезапускаем ufw:


Проверим iptables, должна появиться наша строчка:


На этом базовую настройку сервера можно считать законченной.

Заключение

Я не поднимал вопрос настройки DNS-сервера, так как планирую выпустить вторую часть, где будет изложена настройка Dnscrypt-proxy в роли DNS-сервера для локальной сети.

Процесс настройки шлюза включает выполнение нескольких шагов:

  1. Включение redirect на уровне ядра.
  2. Настройкой брандмауэра.
  3. Опционально, настройка проброса портов.

Настройка ядра системы

Открываем следующий файл:

Добавляем в него строку:

sysctl -p /etc/sysctl.d/gateway.conf

В случае с единственным сетевым адаптером больше ничего делать не потребуется — Ubuntu начнет работать как Интернет-шлюз.

В случае с несколькими сетевыми адаптерами, настраиваем сетевой экран.

Настройка брандмауэра

Как правило, управление брандмауэром netfilter в Linux на базе Debian выполняется с помощью утилиты iptables.

Iptables

Настройка выполняется из расчета, что сеть Интернет настроена через интерфейс ens160:

iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE

Если на сервере для доступа в локальную и глобальную сети используются разные сетевые интерфейсы, нам может понадобиться создать еще два правила:

iptables -A FORWARD -i ens32 -o ens160 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i ens32 -o ens160 -j ACCEPT

* предполагается, что ens32 используется для внутренней сети, а ens160 — внешней.

Сохраняем настройки iptables:

apt-get install iptables-persistent

Проброс портов (Port Forwarding)

Необходим для перенаправление сетевых запросов на сервер, стоящий за NAT и не имеющий прямого выхода во внешнюю сеть.

Iptables

Настройка выполняется двумя командами:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 10.8.232.111 --dport 25 -j DNAT --to-destination 192.168.0.15:8025

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.0.15 --sport 8025 -j SNAT --to-source 10.8.232.111:25

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 25 -j DNAT --to-destination 192.168.0.15:8025

iptables -A FORWARD -p tcp -d 192.168.0.15 --dport 8025 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth0 — внешний сетевой интерфейс.

iptables -I INPUT 1 -p tcp --dport 8025 -j ACCEPT

* обратите внимание, что мы разрешаем порт, на который переводим запрос, так как цепочки POSTROUTING и PREROUTING работают до цепочки FILTER, а потому открывать нужно не входящий порт (25), а тот, на который назначается пакет (8025).

Читайте также: