Интернет-шлюз для двух подсетей на Ubuntu Server 18.04 LTS
09.03.2020
Теги: Linux • Ubuntu • Виртуализация • Конфигурация • ЛокальнаяСеть • Настройка • Сервер
Небольшой эксперимент создания интернет-шлюза для двух подсетей на базе на Ubuntu Server. У меня дома компьютер с установленной Windows 10 и VirtualBox. Давайте создадим семь виртуальных машин: router
, pc-1
, pc-2
, pc-3
, nfs-server
, ftp-server
, web-server
:
- Виртуальные машины
pc-1
,pc-2
,pc-3
объединены в сеть192.168.176.0/24
- Виртуальные машины
nfs-server
,ftp-server
,web-server
объединены в сеть192.168.30.0/24
Виртуальная машина router
будет обеспечивать выход в интернет для компьютеров подсетей 192.168.176.0/24
и 192.168.30.0/24
, у нее три сетевых интерфейса:
enp0s3
(сетевой мост) — смотрит в домашнюю сеть, получает ip-адрес192.168.110.8
от роутера Keenetic Airenp0s9
(внутреняя сеть) — смотрит в одну сеть с виртуальными машинамиpc-1
,pc-2
,pc-3
enp0s8
(внутреняя сеть) — смотрит в одну сеть с виртуальными машинамиnfs-server
,ftp-server
,web-server
Тут надо сказать несколько слов о настройке сети в VirtualBox. Существует несколько способов, рассмотрим два из них:
- Сетевой мост — при таком подключении виртуальная машина становится полноценным членом локальной сети, к которой подключена основная система. Виртуальная машина получает адрес у роутера и становится доступна для других устройств, как и основной компьютер, по своему ip-адресу.
- Внутренняя сеть — тип подключения симулирует закрытую сеть, доступную только для входящих в ее состав машин. Поскольку виртуальные машины не имеет прямого доступа к физическому сетевому адаптеру основной системы, то сеть получается полностью закрытой, снаружи и изнутри.
Настройка сети для router
Сначала нужно посмотреть, как называются сетевые интерфейсы в системе:
$ ls /sys/class/net enp0s3 enp0s8 enp0s9 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] enp0s9: dhcp4: no addresses: [192.168.176.1/24] nameservers: addresses: [8.8.8.8, 8.8.4.4]
Применяем настройки и смотрим сетевые интерфейсы:
$ sudo netplan apply # применить настройки из YAML-файла к работающей системе $ sudo netplan generate # сохранить текущие настройки в файл конфигурации networkd
$ 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: 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 21680sec preferred_lft 21680sec 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 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:df:e0:96 brd ff:ff:ff:ff:ff:ff inet 192.168.176.1/24 brd 192.168.176.255 scope global enp0s9 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fedf:e096/64 scope link valid_lft forever preferred_lft forever
Первый сетевой интерфейс enp0s3
получил ip-адрес 192.168.110.8
от роутера Keenetic Air, этот ip-адрес закреплен постоянно. Второму сетевому интерфейсу enp0s8
мы назначили ip-адрес 192.168.30.1
. Третьему сетевому интерфейсу enp0s8
мы назначили ip-адрес 192.168.176.1
.
Настройка сети для pc-1, pc-2 и pc-3
Сначала для виртуальной машины 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.176.2/24] gateway4: 192.168.176.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]
Применяем настройки и смотрим сетевые интерфейсы:
$ sudo netplan apply # применить настройки из YAML-файла к работающей системе $ sudo netplan generate # сохранить текущие настройки в файл конфигурации networkd
$ 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:e1:23:4b brd ff:ff:ff:ff:ff:ff inet 192.168.176.2/24 brd 192.168.176.255 scope global enp0s3 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fee1:234b/64 scope link valid_lft forever preferred_lft forever
Для виртуальных машин pc-2
и pc-3
все будет аналогично, назначаем им ip-адреса 192.168.176.3
и 192.168.176.4
.
Настройка сети для nfs-server, ftp-server, web-server
Сначала для виртуальной машины nfs-server
. Смотрим, как называются сетевые интерфейсы в системе:
$ 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 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: 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.2/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
Для виртуальных машин ftp-server
и web-server
все будет аналогично, назначаем им ip-адреса 192.168.30.3
и 192.168.30.4
.
Настройка интернет-шлюза
Виртуальная машина router
должна обеспечивать выход в интернет для компьютеров из двух подсетей 192.168.176.0/24
и 192.168.30.0/24
. По умолчанию транзитный трафик отключен, так что редактируем файл /etc/sysctl.conf
:
$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
И перезагружаем виртуальную машину router
. После этого настраиваем netfilter
с помощью утилиты iptables
:
$ sudo iptables -P FORWARD DROP # сначала все запрещаем, потом разрешаем все необходимое
$ sudo iptables -A FORWARD -i enp0s9 -o enp0s3 -s 192.168.176.0/24 -j ACCEPT $ sudo iptables -A FORWARD -i enp0s3 -o enp0s9 -d 192.168.176.0/24 -j ACCEPT
$ 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 416 packets, 293K 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 0 0 ACCEPT all -- enp0s9 enp0s3 192.168.176.0/24 anywhere 2 0 0 ACCEPT all -- enp0s3 enp0s9 anywhere 192.168.176.0/24 3 0 0 ACCEPT all -- enp0s8 enp0s3 192.168.30.0/24 anywhere 4 0 0 ACCEPT all -- enp0s3 enp0s8 anywhere 192.168.30.0/24 Chain OUTPUT (policy ACCEPT 163 packets, 12920 bytes) num pkts bytes target prot opt in out source destination
Теперь настроим SNAT (подмена адреса источника), что позволит всем компьютерам двух подсетей выходить в интернет, используя единственный ip-адрес 192.168.110.8
:
$ sudo iptables -t nat -A POSTROUTING -s 192.168.176.0/24 -o enp0s3 -j SNAT --to-source 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 191 packets, 24950 bytes) num pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 153 packets, 21714 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination 1 18 1290 SNAT all -- any enp0s3 192.168.176.0/24 anywhere to:192.168.110.8 2 18 1290 SNAT all -- any enp0s3 192.168.30.0/24 anywhere to:192.168.110.8
Доступ к NFS-серверу за NAT
Наш NFS-сервер расположен во внутренней сети 192.168.30.0/24
и имеет ip-адрес 192.168.30.2
. Чтобы обеспечить доступ к нему из подсети 192.168.110.0/24
, выполняем на виртуальной машине router
команды (подробнее можно прочитать здесь):
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 2049 -j DNAT --to-destination 192.168.30.2 $ sudo iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 2049 -j DNAT --to-destination 192.168.30.2 $ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 111 -j DNAT --to-destination 192.168.30.2 $ sudo iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 111 -j DNAT --to-destination 192.168.30.2
И смотрим, что получилось:
$ sudo iptables -t nat -L -v --line-numbers Chain PREROUTING (policy ACCEPT 191 packets, 24950 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:nfs to:192.168.30.2 2 0 0 DNAT udp -- enp0s3 any anywhere anywhere udp dpt:nfs to:192.168.30.2 3 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:sunrpc to:192.168.30.2 4 0 0 DNAT udp -- enp0s3 any anywhere anywhere udp dpt:sunrpc to:192.168.30.2 Chain INPUT (policy ACCEPT 153 packets, 21714 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination 1 18 1290 SNAT all -- any enp0s3 192.168.176.0/24 anywhere to:192.168.110.8 2 18 1290 SNAT all -- any enp0s3 192.168.30.0/24 anywhere to:192.168.110.8
Доступ к FTP-серверу за NAT
Наш FTP-сервер расположен во внутренней сети 192.168.30.0/24
и имеет ip-адрес 192.168.30.3
. Чтобы обеспечить доступ к нему из подсети 192.168.110.0/24
, выполняем на виртуальной машине router
команды (подробнее можно прочитать здесь):
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 21 -j DNAT --to-destination 192.168.30.3 $ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 60000:60100 -j DNAT --to-destination 192.168.30.3:60000-60100
И смотрим, что получилось:
$ sudo iptables -t nat -L -v --line-numbers Chain PREROUTING (policy ACCEPT 191 packets, 24950 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:nfs to:192.168.30.2 2 0 0 DNAT udp -- enp0s3 any anywhere anywhere udp dpt:nfs to:192.168.30.2 3 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:sunrpc to:192.168.30.2 4 0 0 DNAT udp -- enp0s3 any anywhere anywhere udp dpt:sunrpc to:192.168.30.2 5 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:ftp to:192.168.30.3 6 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpts:60000:60100 to:192.168.30.3:60000-60100 Chain INPUT (policy ACCEPT 153 packets, 21714 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination 1 18 1290 SNAT all -- any enp0s3 192.168.176.0/24 anywhere to:192.168.110.8 2 18 1290 SNAT all -- any enp0s3 192.168.30.0/24 anywhere to:192.168.110.8
Доступ к WEB-серверу за NAT
Наш WEB-сервер расположен во внутренней сети 192.168.30.0/24
и имеет ip-адрес 192.168.30.4
. Чтобы обеспечить доступ к нему из подсети 192.168.110.0/24
, выполняем на виртуальной машине router
команду:
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to-destination 192.168.30.4
И смотрим, что получилось:
$ sudo iptables -t nat -L -v --line-numbers Chain PREROUTING (policy ACCEPT 191 packets, 24950 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:nfs to:192.168.30.2 2 0 0 DNAT udp -- enp0s3 any anywhere anywhere udp dpt:nfs to:192.168.30.2 3 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:sunrpc to:192.168.30.2 4 0 0 DNAT udp -- enp0s3 any anywhere anywhere udp dpt:sunrpc to:192.168.30.2 5 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:ftp to:192.168.30.3 6 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpts:60000:60100 to:192.168.30.3:60000-60100 7 0 0 DNAT tcp -- enp0s3 any anywhere anywhere tcp dpt:http to:192.168.30.4 Chain INPUT (policy ACCEPT 153 packets, 21714 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 85 packets, 6938 bytes) num pkts bytes target prot opt in out source destination 1 18 1290 SNAT all -- any enp0s3 192.168.176.0/24 anywhere to:192.168.110.8 2 18 1290 SNAT all -- any enp0s3 192.168.30.0/24 anywhere to:192.168.110.8
Связь между подсетями
Чтобы обеспечить связь между подсетями 192.168.176.0/24
и 192.168.30.0/24
, добавим на маршрутизаторе еще два правила:
$ sudo iptables -A FORWARD -i enp0s9 -o enp0s8 -s 192.168.176.0/24 -d 192.168.30.0/24 -j ACCEPT $ sudo iptables -A FORWARD -i enp0s8 -o enp0s9 -s 192.168.30.0/24 -d 192.168.176.0/24 -j ACCEPT
Проверим, что с виртуальной машины pc-1
можно достучаться до nfs-server
:
$ ping -c 4 192.168.30.2 PING 192.168.30.2 (192.168.30.2) 56(84) bytes of data. 64 bytes from 192.168.30.2: icmp_seq=1 ttl=63 time=0.823 ms 64 bytes from 192.168.30.2: icmp_seq=2 ttl=63 time=0.829 ms 64 bytes from 192.168.30.2: icmp_seq=3 ttl=63 time=0.618 ms 64 bytes from 192.168.30.2: icmp_seq=4 ttl=63 time=0.368 ms --- 192.168.30.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3025ms rtt min/avg/max/mdev = 0.368/0.659/0.829/0.190 ms
И наоборот, что с виртуальной машины nfs-server
можно достучаться до pc-1
:
$ ping -c 4 192.168.176.2 PING 192.168.176.2 (192.168.176.2) 56(84) bytes of data. 64 bytes from 192.168.176.2: icmp_seq=1 ttl=63 time=0.786 ms 64 bytes from 192.168.176.2: icmp_seq=2 ttl=63 time=1.39 ms 64 bytes from 192.168.176.2: icmp_seq=3 ttl=63 time=2.60 ms 64 bytes from 192.168.176.2: icmp_seq=4 ttl=63 time=0.638 ms --- 192.168.176.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3007ms rtt min/avg/max/mdev = 0.638/1.354/2.604/0.775 ms
Доступ к серверам за NAT по SSH
Чтобы иметь возможность управлять серверами, на каждый из них установлен SSH-сервер. И нужно обеспечить доступ к ним из внешней подсети 192.168.110.0/24
. Для этого выполняем на маршрутизаторе три команды:
$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 2222 -j DNAT --to-destination 192.168.30.2:22 $ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 3333 -j DNAT --to-destination 192.168.30.3:22 $ sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 4444 -j DNAT --to-destination 192.168.30.4:22
Первая комнанда — мы отбираем tcp-пакеты, которые приходят на интерфейс enp0s3
на порт 2222
и отправляем эти пакеты виртуальной машине nfs-server
на порт 22
, заменяя в пакетах пункт назначения на 192.168.30.2
. Вторая и третья команды позволяют получить доступ к ftp-server
и web-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:bG9PEZ+cyIKrGwx2usq00Ahx7HGtnELNnYH4LLcPkAY. 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.4 LTS (GNU/Linux 4.15.0-88-generic x86_64)
Сохранение правил netfilter
Созданные с помощью утилиты iptables
правила пропадут при перезагрузке виртуальной машины router
. Так что их нужно сохранить и восстанавливать при перезагрузке. В этом нам поможет пакет 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 Wed 2020-03-11 09:19:52 MSK; 2h 50min ago Process: 452 ExecStart=/usr/sbin/netfilter-persistent start (code=exited, status=0/SUCCESS) Main PID: 452 (code=exited, status=0/SUCCESS) мар 11 09:19:52 router systemd[1]: Starting netfilter persistent configuration... мар 11 09:19:52 router systemd[1]: Started netfilter persistent configuration.
При добавлении новых правил, надо сохранить конфигурацию с помощью команды
$ sudo iptables-save > /etc/iptables/rules.v4
Восстановить ранее сохраненную конфигурацию можно с помощью команды
$ sudo iptables-restore < /etc/iptables/rules.v4
Дополнительно
- Установка DHCP-сервера на Ubuntu Server 18.04 LTS
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 9 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 8 из 12
Поиск: Linux • Ubuntu • Виртуальная машина • Конфигурация • Локальная сеть • Настройка • Сервер • Шлюз • Маршрутизатор • iptables