Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12

14.08.2020

Теги: LinuxSSLUbuntuVPNКлиентКлючКонфигурацияЛокальнаяСетьМаршрутизацияНастройкаСерверУстановка

Допустим, что в силу каких-то причин мы не можем установить VPN-сервер на маршрутизатор gateway1, а VPN-клиентов — на маршрутизаторы gateway2 и gateway3. И вынуждены установить сервер и клиенты на три отдельных сервера внутри наших сетей. В этом случае нам нужны дополнительные маршруты, чтобы компьютеры трех сетей могли общаться между собой.

Настройка маршрутизатора gateway1

Остановим службу VPN-сервера и удалим из автозагрузки:

$ sudo systemctl stop openvpn-server@config.service
$ sudo systemctl disable openvpn-server@config.service

Удалим все правила из таблицы filter и вместо них добавим новые:

$ sudo iptables -t filter -F
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.150.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4
$ sudo iptables -L -v --line-numbers 
Chain INPUT (policy ACCEPT 0 packets, 0 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    --    enp0s8   enp0s3   192.168.150.0/24   anywhere
2        0     0   ACCEPT   all    --    enp0s3   enp0s8   anywhere           192.168.150.0/24

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes   target   prot   opt   in       out      source             destination

Правило SNAT для таблицы nat не трогаем, оно по-прежнему нужно:

$ sudo iptables -t nat -L -v --line-numbers 
..........
Chain POSTROUTING (policy ACCEPT 41 packets, 2926 bytes)
num   pkts   bytes   target       prot   opt   in    out      source     destination
1       94    6416   MASQUERADE   all    --    any   enp0s3   anywhere   anywhere

VPN-клиенты будут обращаться к VPN-серверу по ip-адресу 123.123.123.123. Но по этому ip-адресу VPN-сервера уже нет. Поэтому маршрутизатор gateway1 должен пробрасывать UDP-соединения от VPN-клиентов внутрь сети — к VPN-серверу:

$ sudo iptables -t nat -A PREROUTING -i enp0s3 -p udp --dport 1194 -j DNAT --to-destination 192.168.150.254

Настройка маршрутизатора gateway2

Остановим службу VPN-клиента и удалим из автозагрузки:

$ sudo systemctl stop openvpn-client@config.service
$ sudo systemctl disable openvpn-client@config.service

Удалим все правила из таблицы filter и вместо них добавим новые:

$ sudo iptables -t filter -F
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.250.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4
$ sudo iptables -L -v --line-numbers 
Chain INPUT (policy ACCEPT 0 packets, 0 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    --    enp0s8   enp0s3   192.168.250.0/24   anywhere
2        0       0   ACCEPT   all    --    enp0s3   enp0s8   anywhere           192.168.250.0/24

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts   bytes   target   prot   opt   in       out      source             destination

Правило SNAT для таблицы nat не трогаем, оно по-прежнему нужно:

$ sudo iptables -t nat -L -v --line-numbers 
..........
Chain POSTROUTING (policy ACCEPT 48 packets, 3316 bytes)
num   pkts   bytes   target       prot   opt   in    out      source     destination
1      101    6942   MASQUERADE   all    --    any   enp0s3   anywhere   anywhere

Настройка маршрутизатора gateway3

Остановим службу VPN-клиента и удалим из автозагрузки:

$ sudo systemctl stop openvpn-client@config.service
$ sudo systemctl disable openvpn-client@config.service

Удалим все правила из таблицы filter и вместо них добавим новые:

$ sudo iptables -t filter -F
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.50.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4
$ sudo iptables -L -v --line-numbers 
Chain INPUT (policy ACCEPT 0 packets, 0 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    --    enp0s8   enp0s3   192.168.50.0/24   anywhere
2        0       0   ACCEPT   all    --    enp0s3   enp0s8   anywhere          192.168.50.0/24

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts   bytes   target   prot   opt   in       out     source             destination

Правило SNAT для таблицы nat не трогаем, оно по-прежнему нужно:

$ sudo iptables -t nat -L -v --line-numbers 
..........
Chain POSTROUTING (policy ACCEPT 48 packets, 3406 bytes)
num   pkts   bytes   target       prot   opt   in    out      source     destination
1      104    7181   MASQUERADE   all    --    any   enp0s3   anywhere   anywhere

Настройка VPN-сервера openvpn1

После установки пакета openvpn копируем ключи и сертификаты из центра сертификации:

$ sudo mkdir /etc/openvpn/keys/ # создаем директорию для ключей и сертификатов
$ sudo scp evgeniy@192.168.150.1:/home/evgeniy/easy-rsa/pki/ca.crt /etc/openvpn/keys/
$ sudo scp evgeniy@192.168.150.1:/home/evgeniy/easy-rsa/pki/private/center-office-gw1.key /etc/openvpn/keys/openvpn1.key
$ sudo scp evgeniy@192.168.150.1:/home/evgeniy/easy-rsa/pki/issued/center-office-gw1.crt /etc/openvpn/keys/openvpn1.crt
$ sudo scp evgeniy@192.168.150.1:/home/evgeniy/easy-rsa/pki/dh.pem /etc/openvpn/keys/
$ sudo scp evgeniy@192.168.150.1:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

У меня файл закрытого ключа будет openvpn1.key, а файл открытого ключа — openvpn1.crt. Вообще, при изменении имени файла ключа или сертификата надо помнить, что CommonName останется прежним — таким, как было задано при создании. А CommonName используется в качестве имени файла конфигурации клиента на сервере, в директории client-config-dir. В нашем случае это неважно, потому что мы используем UserName — вспомните директиву username-as-common-name.

Если мы изменяем имена файлов закрытого и открытого ключа для клиента, и при этом используем аутентификацию по сертификатам, то в файле конфигурации клиента указываем новые имена файлов. А в качестве имени файла конфигурации клиента на сервере в директории client-config-dir — используем CommonName, которое не изменилось. Получается путаница, поэтому имена файлов лучше не менять. Здесь это правило нарушено — но не хотелось выпускать новый сертификат для сервера.

Создаем файл конфигурации сервера:

$ sudo nano /etc/openvpn/server/config.conf
# включить режим сервера с многими клиентами
mode server

# использовать топологию subnet, вместо дефолтной net30
topology subnet
# сообщить клиентам, что используется топология subnet
push "topology subnet"

# назначить серверу первый адрес виртуальной сети
ifconfig 10.8.0.1 255.255.255.0
# 100 ip-адресов виртуальной сети выделить клиентам
ifconfig-pool 10.8.0.11 10.8.0.110 255.255.255.0
# для клиентов шлюзом по умолчанию будет сервер
push "route-gateway 10.8.0.1"

# установить для сервера маршрут до сети за клиентом gateway2
route 192.168.250.0 255.255.255.0 10.8.0.2
# установить для сервера маршрут до сети за клиентом gateway3
route 192.168.50.0 255.255.255.0 10.8.0.3

# разрешить клиентам общаться между собой, а не только с сервером
client-to-client

# сообщить всем клиентам маршрут до сети за сервером gateway1
push "route 192.168.150.0 255.255.255.0 10.8.0.1"
# сообщить всем клиентам маршрут до сети за клиентом gateway2
push "route 192.168.250.0 255.255.255.0 10.8.0.1"
# сообщить всем клиентам маршрут до сети за клиентом gateway3
push "route 192.168.50.0 255.255.255.0 10.8.0.1"

# одновременно могут быть подключены 100 клиентов
max-clients 100
# файл для хранения ip-адресов клиентов
ifconfig-pool-persist /var/log/openvpn/ipp.txt

# ip-адрес, на котором нужно принимать соединения от клиентов
local 192.168.150.254
# порт, на котором работает сервер
port 1194
# работа по протоколу UDP (для TCP нужно указать tcp-server)
proto udp4
# сетевой интерфейс TUN (или TAP)
dev tun

# включить TLS и при handshake представляться как сервер;
# TLS используется только для шифрования канала управления
tls-server

# корневой сертификат
ca /etc/openvpn/keys/ca.crt
# сертификат сервера
cert /etc/openvpn/keys/openvpn1.crt
# приватный ключ сервера
key /etc/openvpn/keys/openvpn1.key

# добавляет дополнительную подпись HMAC ко всем пакетам handshake для
# проверки целостности; любой пакет, не имеющий правильной HMAC-подписи,
# будет отброшен без дальнейшей обработки; это для доп.безопасности
tls-auth /etc/openvpn/keys/ta.key
# направление ключа: для сервера — 0, для клиента — 1
key-direction 0

# ключ Диффи-Хеллмана
dh /etc/openvpn/keys/dh.pem

# использовать алгоритм AES-256-GCM шифрования пакетов канала данных;
# на данный момент это самый безопасный и быстрый алгоритм шифрования
cipher AES-256-GCM
# отключить согласование шифров между клиентом и сервером; так делать нельзя,
# если есть старые клиенты, которые не поддерживают AES-256-GCM; кроме того,
# если согласование разрешено, сервер и клиент версии 2.4 и выше могут
# автоматически обновить алгоритм шифрования до более нового и безопасного
#ncp-disable

# алгоритм хеширования — для проверки целостности передаваемых пакетов
# канала данных и (если включено tls-auth) пакетов канала управления
auth SHA256

# читать файлы конфигураций клиентов в этой директории
client-config-dir /etc/openvpn/ccd

# использовать новый алгоритм сжатия
compress lz4-v2
# и сообщить об этом всем клиентам
push "compress lz4-v2"

# пользователь и группа с минимальными правами — для большей безопасности
user nobody
group nogroup

# не перечитывать файлы ключей при восстановлении туннеля после разрыва
persist-key
# оставлять без изменения устройства tun или tap при перезапуске службы
persist-tun

# каждые 10 секунд отправлять ping-запрос на удаленный узел; если нет
# ответа 60*2=120 секунд — перезапускать туннель
keepalive 10 60

# файл статуса, содержит текущие соединения; перезаписывается каждую минуту
status /var/log/openvpn/openvpn-status.log

# предупреждать клиентов, что сервер перезапускается, чтобы клиенты могли
# автоматически переподключиться (только при работе по протоколу UDP)
explicit-exit-notify 1

# разрешить выполнение внешних скриптов (то есть verify.sh)
script-security 2
# путь к скрипту, который будет выполнять проверку логина-пароля
auth-user-pass-verify /etc/openvpn/auth/verify.sh via-file
# при проверке логина-пароля не запрашивать сертификат клиента
verify-client-cert none
# использовать UserName вместо CommonName сертификата клиента
username-as-common-name
# директория для временных файлов с логином и паролем клиента
tmp-dir /etc/openvpn/auth/tmp

Создаем два файла в директории client-config-dir:

$ sudo nano /etc/openvpn/ccd/openvpn2
# назначить клиенту openvpn2 второй ip-адрес виртуальной VPN-сети
ifconfig-push 10.8.0.2 255.255.255.0
# сообщить серверу, что за этим клиентом есть сеть 192.168.250.0/24
iroute 192.168.250.0 255.255.255.0
$ sudo nano /etc/openvpn/ccd/openvpn3
# назначить клиенту openvpn3 третий ip-адрес виртуальной VPN-сети
ifconfig-push 10.8.0.3 255.255.255.0
# сообщить серверу, что за этим клиентом есть сеть 192.168.50.0/24
iroute 192.168.50.0 255.255.255.0

Создаем скрипт проверки verify.sh и даем ему права на выполнение:

$ sudo mkdir -p /etc/openvpn/auth/tmp
$ sudo nano /etc/openvpn/auth/verify.sh
#!/bin/bash
username=`head -1 $1`
password=`tail -1 $1`
if [[ -z $username || -z $password ]]; then
    exit 1
fi
users=`cat /etc/openvpn/auth/users.pass`
for user in $users; do
    if [[ "$user" = "$username:$password" ]]; then
        exit 0
    fi
done
exit 1
$ sudo chmod a+x /etc/openvpn/auth/verify.sh

Предоставляем права на запись в директорию tmp-dir временного файла с логином и паролем — когда сервер уже будет работать от nobody и nogroup:

$ sudo chmod a+w /etc/openvpn/auth/tmp

И создаем файл users.pass для хранения логинов и паролей клиентов:

$ sudo nano /etc/openvpn/auth/users.pass
openvpn2:abcdef123456
openvpn3:fedcba654321
sergey-ivanov:uvwxyz456789
andrey-petrov:qwerty123456

Все готово, можно запускать VPN-сервер:

$ sudo systemctl start openvpn-server@config.service

Добавим запуск сервера в автозагрузку:

$ sudo systemctl enable openvpn-server@config.service

Теперь сервер openvpn3 будет маршртутизатором, поэтому разрешаем пересылку пакетов между интерфейсами:

$ sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Чтобы внесенные изменения вступили в силу:

$ sudo sysctl -p
net.ipv4.ip_forward = 1

Добавляем правила для netfilter с помощью утилиты iptables:

$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.150.0/24 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.150.0/24 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.150.0/24 -d 10.8.0.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 192.168.250.0/24 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 192.168.50.0/24 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 10.8.0.0/24 -d 192.168.150.0/24 -j ACCEPT

Правила нужно сохранить и восстанавливать при перезагрузке:

$ sudo apt install iptables-persistent

Настройка VPN-клиента openvpn2

Переходим на openvpn2 и после установки пакета openvpn копируем с gateway1 следующие файлы:

$ sudo mkdir /etc/openvpn/keys/ # создаем директорию для ключей и сертификатов
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/pki/ca.crt /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

Создаем файл конфигурации клиента:

$ sudo nano /etc/openvpn/client/config.conf
# работа по протоколу UDP (для TCP нужно указать tcp-client)
proto udp4
# сетевой интерфейс TUN (или TAP)
dev tun
# принимать от сервера команды push, например маршруты
pull

# ip-адрес и порт сервера
remote 123.123.123.123 1194

# если не удалось получить ip-адрес сервера от DNS, то через указанное
# количество секунд попытаться снова; infinite — повторять бесконечно
resolv-retry infinite

# использовать динамический порт для подключения к серверу (клиенту не
# требуется привязка к определенному порту)
nobind

# отбрасываем маршрут до сети, который не нужен клиенту openvpn2
pull-filter ignore "route 192.168.250.0 255.255.255.0 10.8.0.1"

# включить TLS и при handshake представляться как клиент;
# TLS используется только для шифрования канала управления
tls-client

# корневой сертификат
ca /etc/openvpn/keys/ca.crt

# обратите внимание, что мы не указываем директивы cert и key
#cert /etc/openvpn/keys/openvpn2.crt
#key /etc/openvpn/keys/openvpn2.key

# для защиты от атаки «человек посередине», когда авторизованный клиент
# пытается подключиться к другому клиенту, выдавая себя за сервер; при
# указании этой директивы проверяется, что сертификат именно серверный
remote-cert-tls server

# добавляет дополнительную подпись HMAC ко всем пакетам handshake для
# проверки целостности; любой пакет, не имеющий правильной HMAC-подписи,
# будет отброшен без дальнейшей обработки; это для доп.безопасности
tls-auth /etc/openvpn/keys/ta.key
# направление ключа: для клиента — 1, для сервера — 0
key-direction 1

# использовать алгоритм AES-256-GCM шифрования пакетов канала данных;
# на данный момент это самый безопасный и быстрый алгоритм шифрования
cipher AES-256-GCM

# алгоритм хеширования — для проверки целостности передаваемых пакетов
# канала данных и (если включено tls-auth) пакетов канала управления
auth SHA256

# пользователь и группа с минимальными правами — для большей безопасности
user nobody
group nogroup

# не перечитывать файлы ключей при восстановлении туннеля после разрыва
persist-key
# оставлять без изменения устройства tun или tap при перезапуске службы
persist-tun

# логин и пароль клиента размещаем в файле — чтобы отправить их серверу
auth-user-pass /etc/openvpn/auth/user.pass

И создаем файл с логином и паролем:

$ sudo nano /etc/openvpn/auth/user.pass
openvpn2
abcdef123456

Все готово, можно запускать VPN-клиент:

$ sudo systemctl start openvpn-client@config.service

Добавим запуск клиента в автозагрузку:

$ sudo systemctl enable openvpn-client@config.service

Теперь сервер openvpn2 будет маршртутизатором, поэтому разрешаем пересылку пакетов между интерфейсами:

$ sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Чтобы внесенные изменения вступили в силу:

$ sudo sysctl -p
net.ipv4.ip_forward = 1

Добавляем правила для netfilter с помощью утилиты iptables:

$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.250.0/24 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.250.0/24 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.250.0/24 -d 10.8.0.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 192.168.150.0/24 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 192.168.50.0/24 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 10.8.0.0/24 -d 192.168.250.0/24 -j ACCEPT

Правила нужно сохранить и восстанавливать при перезагрузке:

$ sudo apt install iptables-persistent

Настройка VPN-клиента openvpn3

Переходим на openvpn3 и после установки пакета openvpn копируем с gateway1 следующие файлы:

$ sudo mkdir /etc/openvpn/keys/ # создаем директорию для ключей и сертификатов
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/pki/ca.crt /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

Создаем файл конфигурации клиента:

$ sudo nano /etc/openvpn/client/config.conf
# работа по протоколу UDP (для TCP нужно указать tcp-client)
proto udp4
# сетевой интерфейс TUN (или TAP)
dev tun
# принимать от сервера команды push, например маршруты
pull

# ip-адрес и порт сервера
remote 123.123.123.123 1194

# если не удалось получить ip-адрес сервера от DNS, то через указанное
# количество секунд попытаться снова; infinite — повторять бесконечно
resolv-retry infinite

# использовать динамический порт для подключения к серверу (клиенту не
# требуется привязка к определенному порту)
nobind

# отбрасываем маршрут до сети, который не нужен клиенту openvpn3
pull-filter ignore "route 192.168.50.0 255.255.255.0 10.8.0.1"

# включить TLS и при handshake представляться как клиент;
# TLS используется только для шифрования канала управления
tls-client

# корневой сертификат
ca /etc/openvpn/keys/ca.crt

# обратите внимание, что мы не указываем директивы cert и key
#cert /etc/openvpn/keys/openvpn3.crt
#key /etc/openvpn/keys/openvpn3.key

# для защиты от атаки «человек посередине», когда авторизованный клиент
# пытается подключиться к другому клиенту, выдавая себя за сервер; при
# указании этой директивы проверяется, что сертификат именно серверный
remote-cert-tls server

# добавляет дополнительную подпись HMAC ко всем пакетам handshake для
# проверки целостности; любой пакет, не имеющий правильной HMAC-подписи,
# будет отброшен без дальнейшей обработки; это для доп.безопасности
tls-auth /etc/openvpn/keys/ta.key
# направление ключа: для клиента — 1, для сервера — 0
key-direction 1

# использовать алгоритм AES-256-GCM шифрования пакетов канала данных;
# на данный момент это самый безопасный и быстрый алгоритм шифрования
cipher AES-256-GCM

# алгоритм хеширования — для проверки целостности передаваемых пакетов
# канала данных и (если включено tls-auth) пакетов канала управления
auth SHA256

# пользователь и группа с минимальными правами — для большей безопасности
user nobody
group nogroup

# не перечитывать файлы ключей при восстановлении туннеля после разрыва
persist-key
# оставлять без изменения устройства tun или tap при перезапуске службы
persist-tun

# логин и пароль клиента размещаем в файле — чтобы отправить их серверу
auth-user-pass /etc/openvpn/auth/user.pass

И создаем файл с логином и паролем:

$ sudo nano /etc/openvpn/auth/user.pass
openvpn3
fedcba654321

Все готово, можно запускать VPN-клиент:

$ sudo systemctl start openvpn-client@config.service

Добавим запуск клиента в автозагрузку:

$ sudo systemctl enable openvpn-client@config.service

Теперь сервер openvpn3 будет маршртутизатором, поэтому разрешаем пересылку пакетов между интерфейсами:

$ sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Чтобы внесенные изменения вступили в силу:

$ sudo sysctl -p
net.ipv4.ip_forward = 1

Добавляем правила для netfilter с помощью утилиты iptables:

$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.50.0/24 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.50.0/24 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s3 -o tun0 -s 192.168.50.0/24 -d 10.8.0.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 192.168.150.0/24 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 192.168.250.0/24 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o enp0s3 -s 10.8.0.0/24 -d 192.168.50.0/24 -j ACCEPT

Правила нужно сохранить и восстанавливать при перезагрузке:

$ sudo apt install iptables-persistent

Добавление маршрутов

Если мы выполним команду ping 192.168.250.2 на компьютере pc1 — пакеты будут отправлены в шлюз 192.168.150.1 — потому что у pc1 нет маршрута до сети 192.168.250.0/24. Но маршрутизатор gateway1 тоже не знает, что делать с этими пакетами — у него нет маршрута до сети 192.168.250.0/24.

Мы можем добавить необходимые маршруты на компьютерах pc1 и pc2 — через сервер 192.168.150.254:

$ sudo ip route add 192.168.250.0/24 via 192.168.150.254 dev enp0s3
$ sudo ip route add 192.168.50.0/24 via 192.168.150.254 dev enp0s3
$ sudo ip route add 10.8.0.0/24 via 192.168.150.254 dev enp0s3

Удалить добавленные маршруты можно командами

$ sudo ip route del 192.168.250.0/24 via 192.168.150.254 dev enp0s3
$ sudo ip route del 192.168.50.0/24 via 192.168.150.254 dev enp0s3
$ sudo ip route del 10.8.0.0/24 via 192.168.150.254 dev enp0s3

Аналогично добавляем необходимые маршруты на компьютерах pc3 и pc4 — через сервер 192.168.250.254:

$ sudo ip route add 192.168.150.0/24 via 192.168.250.254 dev enp0s3
$ sudo ip route add 192.168.50.0/24 via 192.168.250.254 dev enp0s3
$ sudo ip route add 10.8.0.0/24 via 192.168.250.254 dev enp0s3

Удалить добавленные маршруты можно командами

$ sudo ip route del 192.168.150.0/24 via 192.168.250.254 dev enp0s3
$ sudo ip route del 192.168.50.0/24 via 192.168.250.254 dev enp0s3
$ sudo ip route del 10.8.0.0/24 via 192.168.250.254 dev enp0s3

Аналогично добавляем необходимые маршруты на компьютерах pc5 и pc6 — через сервер 192.168.50.254:

$ sudo ip route add 192.168.150.0/24 via 192.168.50.254 dev enp0s3
$ sudo ip route add 192.168.250.0/24 via 192.168.50.254 dev enp0s3
$ sudo ip route add 10.8.0.0/24 via 192.168.250.54 dev enp0s3

Удалить добавленные маршруты можно командами

$ sudo ip route del 192.168.150.0/24 via 192.168.50.254 dev enp0s3
$ sudo ip route del 192.168.250.0/24 via 192.168.50.254 dev enp0s3
$ sudo ip route del 10.8.0.0/24 via 192.168.250.54 dev enp0s3

Но это не очень удобно — лучше пусть все компьютеры отправляют пакеты в шлюз по умолчанию, а нужные маршруты мы добавим на gateway1, gateway2 и gateway3:

$ sudo ip route add 192.168.250.0/24 via 192.168.150.254 dev enp0s8 # на gateway1
$ sudo ip route add 192.168.50.0/24 via 192.168.150.254 dev enp0s8 # на gateway1
$ sudo ip route add 10.8.0.0/24 via 192.168.150.254 dev enp0s8 # на gateway1
$ sudo ip route add 192.168.150.0/24 via 192.168.250.254 dev enp0s8 # на gateway2
$ sudo ip route add 192.168.50.0/24 via 192.168.250.254 dev enp0s8 # на gateway2
$ sudo ip route add 10.8.0.0/24 via 192.168.250.254 dev enp0s8 # на gateway2
$ sudo ip route add 192.168.150.0/24 via 192.168.50.254 dev enp0s8 # на gateway3
$ sudo ip route add 192.168.250.0/24 via 192.168.50.254 dev enp0s8 # на gateway3
$ sudo ip route add 10.8.0.0/24 via 192.168.50.254 dev enp0s8 # на gateway3

Мы используем политику DROP для цепочки FORWARD таблицы filter. Для gateway1 это значит, что пакеты для сетей 192.168.250.0/24, 192.168.50.0/24 и 10.8.0.0/24, которые придут от pc1 или pc2 на интерфейс enp0s8 и должны уйти с интерфейса enp0s8 в направлении openvpn1, будут отброшены. Так что на маршрутизаторе gateway1 надо добавить правила для netfilter:

$ sudo iptables -I FORWARD 1 -i enp0s8 -o enp0s8 -s 192.168.150.0/24 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables -I FORWARD 2 -i enp0s8 -o enp0s8 -s 192.168.150.0/24 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables -I FORWARD 3 -i enp0s8 -o enp0s8 -s 192.168.150.0/24 -d 10.8.0.0/24 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4

Аналогично, надо добавить правила на маршрутизаторах gateway2 и gateway3:

$ sudo iptables -I FORWARD 1 -i enp0s8 -o enp0s8 -s 192.168.250.0/24 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables -I FORWARD 2 -i enp0s8 -o enp0s8 -s 192.168.250.0/24 -d 192.168.50.0/24 -j ACCEPT
$ sudo iptables -I FORWARD 3 -i enp0s8 -o enp0s8 -s 192.168.250.0/24 -d 10.8.0.0/24 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4
$ sudo iptables -I FORWARD 1 -i enp0s8 -o enp0s8 -s 192.168.50.0/24 -d 192.168.150.0/24 -j ACCEPT
$ sudo iptables -I FORWARD 2 -i enp0s8 -o enp0s8 -s 192.168.50.0/24 -d 192.168.250.0/24 -j ACCEPT
$ sudo iptables -I FORWARD 3 -i enp0s8 -o enp0s8 -s 192.168.50.0/24 -d 10.8.0.0/24 -j ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4

Файлы конфигурации сети

Сейчас все работает, но добавленные маршруты пропадут при перезагрузке маршрутизатора gateway1, gateway2 или gateway3. Так что нам нужно прописать эти маршруты в файле конфигурации сети каждого маршрутизатора.

Файл конфигурации сети gateway1:

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [123.123.123.123/24]
      gateway4: 123.123.123.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
    enp0s8:
      dhcp4: no
      addresses: [192.168.150.1/24]
      routes:
        # маршрут до сети 192.168.250.0/24
        - to: 192.168.250.0/24
          via: 192.168.150.254
        # маршрут до сети 192.168.50.0/24
        - to: 192.168.50.0/24
          via: 192.168.150.254
        # маршрут до сети 10.8.0.0/24
        - to: 10.8.0.0/24
          via: 192.168.150.254
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

Файл конфигурации сети gateway2:

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [111.111.111.111/24]
      gateway4: 111.111.111.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
    enp0s8:
      dhcp4: no
      addresses: [192.168.250.1/24]
      routes:
        # маршрут до сети 192.168.150.0/24
        - to: 192.168.150.0/24
          via: 192.168.250.254
        # маршрут до сети 192.168.50.0/24
        - to: 192.168.50.0/24
          via: 192.168.250.254
        # маршрут до сети 10.8.0.0/24
        - to: 10.8.0.0/24
          via: 192.168.250.254
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

Файл конфигурации сети gateway3:

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [222.222.222.222/24]
      gateway4: 222.222.222.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
    enp0s8:
      dhcp4: no
      addresses: [192.168.50.1/24]
      routes:
        # маршрут до сети 192.168.150.0/24
        - to: 192.168.150.0/24
          via: 192.168.50.254
        # маршрут до сети 192.168.250.0/24
        - to: 192.168.250.0/24
          via: 192.168.50.254
        # маршрут до сети 10.8.0.0/24
        - to: 10.8.0.0/24
          via: 192.168.50.254
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

Поиск: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Локальная сеть • Маршрутизация • Настройка • Сервер • Установка

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