Интернет-шлюз на базе Ubuntu Server 18.04 LTS

21.02.2020

Теги: LinuxSSHUbuntuВиртуализацияКонфигурацияНастройкаСервер

Небольшой эксперимент создания интернет-шлюза на 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-адрес виртуальной машины router192.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 • Шлюз

Каталог оборудования
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.