Интернет-шлюз на базе Ubuntu Server 18.04 LTS
21.02.2020
Теги: Linux • SSH • Ubuntu • Виртуализация • Конфигурация • Настройка • Сервер
Небольшой эксперимент создания интернет-шлюза на 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: <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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
. Смотрим, как называются сетевые интерфейсы в системе:
$ ls /sys/class/net enp0s3 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: 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: <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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 nano /etc/sysctl.conf
net.ipv4.ip_forward=1
Чтобы внесенные изменения вступили в силу:
$ 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
Восстановить ранее сохраненную конфигурацию можно с помощью команды
$ sudo iptables-restore < /etc/iptables/rules.v4
Поиск: Linux • SSH • Ubuntu • Конфигурация • Настройка • Сервер • VirtualBox • Виртуальная машина • Маршрутизатор • iptables • NAT • Шлюз