Найти в Дзене
Linux | Network | DevOps

Домашний интернет-шлюз на Ubuntu Server 20.04 LTS

На просторах интернета присутствует бесчисленное количество информации
касательно настройки сервера на Ubuntu, но на каждом шагу можно
встретить не очевидные для новичка моменты. В статье будет рассказано,
как настроить многопортовый сервер (6 портов): Netplan, DHCP-сервер,
UFW(Uncomplicated Firewall). А теперь обо всем по порядку. Установку ОС расписывать не буду («ОК — Далее — Далее»), отмечу только,
что при установке требуется сконфигурировать хотя бы один сетевой
интерфейс для доступа в интернет. Для удобства я использую Midnight Commander и его текстовый редактор. Работать будем от root-пользователя: sudo su Установим MC: apt-get install mc Итак, у нас есть установленная Ubuntu Server, начнем с конфигурации остальных сетевых интерфейсов. В последних версиях Ubuntu появилась утилита Netplan, позволяющая
настроить сеть в унифицированном формате и выбирать сетевой менеджер для работы. По умолчанию используется Systemd-networkd, я же выбрал
NetworkManager, так как установил W
Оглавление

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

Введение

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

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

sudo su

Установим MC:

apt-get install mc

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

Netplan

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

Синтаксис конфигурации Netplan очень строгий и лишний пробел или табуляция может вызвать ошибку.

Подробнее о функционале уже расписывали
habr.com/ru/post/448400, так же различные примеры есть на сайте netplan.io/examples.

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

ip a

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

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

bridges:
lan-br:
dhcp4: false
addresses: [ 192.168.13.1/24 ]
nameservers:
addresses: [ 192.168.13.1 ]
interfaces: [ enp1s0, enp2s0, enp3s0, enp4s0, enp5s0 ]

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

network:
ethernets:
enp1s0:
dhcp4: false
optional: true
enp2s0:
dhcp4: false
optional: true
enp3s0:
dhcp4: false
optional: true
enp4s0:
dhcp4: false
optional: true
enp5s0:
dhcp4: false
optional: true
enp6s0:
dhcp4: true
nameservers:
addresses:
- 127.0.0.1
- 192.168.13.1
bridges:
lan-br:
dhcp4: false
addresses: [ 192.168.13.1/24 ]
nameservers:
addresses: [ 192.168.13.1 ]
interfaces: [ enp1s0, enp2s0, enp3s0, enp4s0, enp5s0 ]
version: 2
renderer: NetworkManager

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

netplan try

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

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master lan-br state UP group default qlen 1000
link/ether 0c:e8:2c:68:5b:57 brd ff:ff:ff:ff:ff:ff
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master lan-br state UP group default qlen 1000
link/ether 0c:e8:2c:68:5b:58 brd ff:ff:ff:ff:ff:ff
4: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master lan-br state UP group default qlen 1000
link/ether 0c:e8:2c:68:5b:59 brd ff:ff:ff:ff:ff:ff
5: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 0c:e8:2c:68:5b:5a brd ff:ff:ff:ff:ff:ff
6: enp5s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 0c:e8:2c:68:5b:5b brd ff:ff:ff:ff:ff:ff
7: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 0c:e8:2c:68:5b:5c brd ff:ff:ff:ff:ff:ff
inet 188.32.236.197/19 brd 188.32.255.255 scope global dynamic noprefixroute enp6s0
valid_lft 2898sec preferred_lft 2898sec
inet6 fe80::ee8:2cff:fe68:5b5c/64 scope link
valid_lft forever preferred_lft forever
8: lan-br: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 0c:e8:2c:68:5b:57 brd ff:ff:ff:ff:ff:ff
inet 192.168.13.1/24 brd 192.168.13.255 scope global noprefixroute lan-br
valid_lft forever preferred_lft forever
inet6 fe80::ee8:2cff:fe68:5b58/64 scope link
valid_lft forever preferred_lft forever

DHCP-сервер

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

apt-get install isc-dhcp-server

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

INTERFACESv4="lan-br"

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

option domain-name "your-domain-name";
option domain-name-servers 192.168.13.1;

subnet 192.168.13.0 netmask 255.255.255.0 {
range 192.168.13.100 192.168.13.250;
option subnet-mask 255.255.255.0;
option routers 192.168.13.1;
option broadcast-address 192.168.13.255;
}

Перезапустим DHCP-сервер:

service isc-dhcp-server restart

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

UFW

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

net/ipv4/ip_forward=1

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

ufw allow ssh

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

ufw enable
ufw status verbose

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

ufw default deny incoming
ufw default allow outgoing
ufw default allow routed

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

ufw allow in on lan-br to any

Настроим NAT. Откроем файл before.rules и пишем следующее перед блоком *filter:

*nat
:POSTROUTING ACCEPT [0:0]
#local
-A POSTROUTING -s 192.168.13.0/24 -o enp6s0 -j MASQUERADE
COMMIT

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

ufw disable
ufw enable

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

iptables -t nat -L -v

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

Заключение

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

Более подробная информация:

Обсудить эту статью можно в Телеграм канале: https://t.me/linautonet