Интернет-шлюз на базе Ubuntu Server 18.04 LTS
Небольшой эксперимент создания интернет-шлюза на 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
Сначала нужно посмотреть, как называются сетевые интерфейсы в системе:
$ ls /sys/class/net enp0s3 enp0s8 lo
Теперь редактируем файл /etc/netplan/01-netcfg.yaml
$ sudo nano /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: yes enp0s8: dhcp4: no addresses: [192.168.30.1/24] nameservers: addresses: [8.8.8.8, 8.8.4.4]
Применяем настройки и смотрим сетевые интерфейсы:
$ sudo netplan apply # применить настройки из YAML-файла к работающей системе $ sudo netplan generate # сохранить текущие настройки в файл конфигурации networkd
$ ip addr 1: lo: 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: enp0s3: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:10:c6:da brd ff:ff:ff:ff:ff:ff inet 192.168.110.8/24 brd 192.168.110.255 scope global dynamic enp0s3 valid_lft 18333sec preferred_lft 18333sec inet6 fe80::a00:27ff:fe10:c6da/64 scope link valid_lft forever preferred_lft forever 3: enp0s8: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:4e:0e:a0 brd ff:ff:ff:ff:ff:ff inet 192.168.30.1/24 brd 192.168.30.255 scope global enp0s8 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe4e:ea0/64 scope link valid_lft forever preferred_lft forever
Первый сетевой интерфейс 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 :
$ sudo nano /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: no addresses: [192.168.30.2/24] gateway4: 192.168.30.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]
Применяем настройки и смотрим сетевые интерфейсы:
$ sudo netplan apply # применить настройки из YAML-файла к работающей системе $ sudo netplan generate # сохранить текущие настройки в файл конфигурации networkd
$ ip addr 1: lo: 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: enp0s3: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:28:be:b7 brd ff:ff:ff:ff:ff:ff inet 192.168.30.2/24 brd 192.168.30.255 scope global enp0s3 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe28:beb7/64 scope link valid_lft forever preferred_lft forever
Для виртуальных машин pc-2 и server все будет аналогично, так что не буду описывать подробно. Для примера — виртуальной машине pc-2 мы назначили ip-адрес 192.168.30.3/24 :
$ ip addr 1: lo: 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: enp0s3: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:28:b0:4b brd ff:ff:ff:ff:ff:ff inet 192.168.30.3/24 brd 192.168.30.255 scope global enp0s3 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe28:b04b/64 scope link valid_lft forever preferred_lft forever
Настройка интернет-шлюза
Виртуальная машина router должна обеспечивать выход в интернет для всех компьютеров из локальной сети 192.168.30.0/24 . По умолчанию транзитный трафик отключен, так что редактируем файл /etc/sysctl.conf :
Чтобы внесенные изменения вступили в силу:
$ sudo sysctl -p /etc/sysctl.conf net.ipv4.ip_forward = 1
После этого настраиваем netfilter с помощью утилиты iptables :
$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.30.0/24 -j ACCEPT $ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 192.168.30.0/24 -j ACCEPT
$ sudo iptables -L -v --line-numbers Chain INPUT (policy ACCEPT 781 packets, 4517K bytes) num pkts bytes target prot opt in out source destination Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 57 4213 ACCEPT all -- enp0s8 enp0s3 192.168.30.0/24 anywhere 2 52 87384 ACCEPT all -- enp0s3 enp0s8 anywhere 192.168.30.0/24 Chain OUTPUT (policy ACCEPT 639 packets, 49312 bytes) num pkts bytes target prot opt in out source destination
Мы разрешили ходить транзитным пакетам для нашего диапазона ip-адресов, а всё остальное запретили. Теперь настроим SNAT (подмена адреса источника), что позволит всем компьютерам сети выходить в интернет, используя единственный ip-адрес 192.168.110.8 .
$ sudo iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o enp0s3 -j SNAT --to-source 192.168.110.8
$ sudo iptables -t nat -L -v --line-numbers Chain PREROUTING (policy ACCEPT 27 packets, 3020 bytes) num pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 11 packets, 1416 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 71 packets, 5632 bytes) num pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 71 packets, 5632 bytes) num pkts bytes target prot opt in out source destination 1 4 240 SNAT all -- any enp0s3 192.168.30.0/24 anywhere to:192.168.110.8
Теперь проверяем наличие интернета на виртуальных машинах pc-1 , pc-2 и server :
$ host ya.ru ya.ru has address 87.250.250.242 ya.ru has IPv6 address 2a02:6b8::2:242 ya.ru mail is handled by 10 mx.yandex.ru.
Доступ внутрь сети
Давайте теперь посмотрим, как получить доступ извне к компьютеру внутри сети 192.168.30.0/24 . Установим на виртуальную машину server SSH-сервер:
$ sudo apt install openssh-server
А на виртуальной машине router будем отбирать tcp-пакеты, которые приходят на интерфейс enp0s3 на порт 2222 и отправлять эти пакеты виртуальной машине server на порт 22, заменяя в пакетах пункт назначения на 192.168.30.254 :
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 2222 -j DNAT --to-destination 192.168.30.254:22
$ sudo iptables -t nat -L -v --line-numbers Chain PREROUTING (policy ACCEPT 27 packets, 3020 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:2222 to:192.168.30.254:22 Chain INPUT (policy ACCEPT 11 packets, 1416 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 71 packets, 5632 bytes) num pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 71 packets, 5632 bytes) num pkts bytes target prot opt in out source destination 1 4 240 SNAT all -- any enp0s3 192.168.30.0/24 anywhere to:192.168.110.8
Теперь попробуем с физического компьютера установить ssh-соединение с виртуальной машиной server . Открываем PowerShell и выполняем команду:
> ssh -p 2222 evgeniy@192.168.110.8 The authenticity of host '[192.168.110.8]:2222 ([192.168.110.8]:2222)' can't be established. ECDSA key fingerprint is SHA256:c3C3sagcS9j1ObcH6NI+6zFkyV6yyGTc64ASKRLhB0g. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.110.8]:2222' (ECDSA) to the list of known hosts. evgeniy@192.168.110.8's password: пароль Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)
Мы в команде указываем порт 2222 и ip-адрес виртуальной машины router — 192.168.110.8 , которая находится в одной сети 192.168.110.0/24 с физическим компьютером. А виртуальная машина router пробрасывает это соединение с интерфейса enp0s3 на интерфейс enp0s8 и дальше — виртуальной машине server , но уже на порт 22.
Сохранение правил netfilter
Созданные с помощью утилиты iptables правила пропадут при перезагрузке. Так что их нужно сохранить и восстанавливать при перезагрузке. В этом нам поможет пакет iptables-persistent :
$ sudo apt install iptables-persistent
При установке пакета будет предложено сохранить текущие правила iptables :
- в файл /etc/iptables/rules.v4 для протокола IPv4
- в файл /etc/iptables/rules.v6 для протокола IPv6
После установки пакета будет добавлена новая служба netfilter-persistent.service , которая при загрузке системы будет восстанавливать созданные нами правила:
$ systemctl status netfilter-persistent.service ● netfilter-persistent.service - netfilter persistent configuration Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled) Active: active (exited) since Sat 2020-02-22 11:20:44 MSK; 2h 32min ago Process: 446 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=0/SUCCESS) Main PID: 446 (code=exited, status=0/SUCCESS) фев 22 11:20:43 router systemd[1]: Starting netfilter persistent configuration. фев 22 11:20:44 router systemd[1]: Started netfilter persistent configuration.
При добавлении новых правил, надо сохранить конфигурацию с помощью команды
$ sudo iptables-save > /etc/iptables/rules.v4
Восстановить ранее сохраненную конфигурацию можно с помощью команды
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (146)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (68)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (62)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (140)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (105)
- Установка (66)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)