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

29.07.2020

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

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

Настройка gateway1

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

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

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

$ sudo iptables -t filter -F
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4

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

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

Настройка gateway2

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

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

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

$ sudo iptables -t filter -F
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables-save > /etc/iptables/rules.v4

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

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

Настройка vpn-center

После установки пакета openvpn копируем с vpn-server файлы:

$ 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/pki/private/vpn-client-center-office.key /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/pki/issued/vpn-client-center-office.crt /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

Теперь создаем файл конфигурации VPN-клиента:

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

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

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

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

# корневой сертификат
ca /etc/openvpn/keys/ca.crt
# сертификат клиента
cert /etc/openvpn/keys/vpn-client-center-office.crt
# приватный ключ клиента
key /etc/openvpn/keys/vpn-client-center-office.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

# по умолчанию логи идут в syslog; использование одной из директив ниже
# предписывает вести отдельный лог; первая — перезаписывать файл лога,
# вторая — дополнять файл лога; можно использовать только одну директиву
#log         /var/log/openvpn/openvpn.log
#log-append  /var/log/openvpn/openvpn.log

# уровень детализации лога от 0 до 11; если 0 — тогда только фатальные ошибки;
# при настройке установить значение 4-11, при эксплуатации — 0 или 1
verb 3

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

$ sudo systemctl start openvpn-client@config.service

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

$ sudo systemctl enable openvpn-client@config.service

Настройка vpn-branch

После установки пакета openvpn копируем с vpn-server файлы:

$ 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/pki/private/vpn-client-branch-office.key /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/pki/issued/vpn-client-branch-office.crt /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

Теперь создаем файл конфигурации VPN-клиента:

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

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

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

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

# корневой сертификат
ca /etc/openvpn/keys/ca.crt
# сертификат клиента
cert /etc/openvpn/keys/vpn-client-branch-office.crt
# приватный ключ клиента
key /etc/openvpn/keys/vpn-client-branch-office.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

# по умолчанию логи идут в syslog; использование одной из директив ниже
# предписывает вести отдельный лог; первая — перезаписывать файл лога,
# вторая — дополнять файл лога; можно использовать только одну директиву
#log         /var/log/openvpn/openvpn.log
#log-append  /var/log/openvpn/openvpn.log

# уровень детализации лога от 0 до 11; если 0 — тогда только фатальные ошибки;
# при настройке установить значение 3 или 4, при эксплуатации — 0 или 1
verb 3

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

$ sudo systemctl start openvpn-client@config.service

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

$ sudo systemctl enable openvpn-client@config.service

Форвардинг для vpn-center и vpn-branch

Пакеты, которые приходят на интерфейсы VPN-клиента vpn-center, и которые ему не предназначены, он должен отправлять дальше. Пакеты из туннеля — в сеть 192.168.150.0/24, пакеты из сети 192.168.150.0/24 — в туннель.

$ 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 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 10.8.0.0/24 -d 192.168.150.0/24 -j ACCEPT

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

$ sudo apt install iptables-persistent

Пакеты, которые приходят на интерфейсы VPN-клиента vpn-branch, и которые ему не предназначены, он должен отправлять дальше. Пакеты из туннеля — в сеть 192.168.250.0/24, пакеты из сети 192.168.250.0/24 — в туннель.

$ 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 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 10.8.0.0/24 -d 192.168.250.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.250.0/24 — через сервер vpn-center:

$ sudo ip route add 192.168.250.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

А на компьютерах pc3 и pc4 — добавить маршрут до 192.168.150.0/24 — через сервер vpn-branch:

$ sudo ip route add 192.168.150.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

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

$ sudo ip route add 192.168.250.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 10.8.0.0/24 via 192.168.250.254 dev enp0s8 # на gateway2

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

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

$ sudo nano /etc/netplan/01-netcfg.yaml
# файл конфигурации сети gateway1
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [192.168.100.2/24]
      gateway4: 192.168.100.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
        # маршрут до сети 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]
$ sudo nano /etc/netplan/01-netcfg.yaml
# файл конфигурации сети gateway2
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [192.168.200.2/24]
      gateway4: 192.168.200.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
        # маршрут до сети 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]

Еще один VPN-клиент pc5

И напоследок проверим, что там с VPN-клиентом pc5:

$ ping -c3 192.168.150.2
PING 192.168.150.2 (192.168.150.2) 56(84) bytes of data.
64 bytes from 192.168.150.2: icmp_seq=1 ttl=63 time=65.8 ms
64 bytes from 192.168.150.2: icmp_seq=2 ttl=63 time=26.8 ms
64 bytes from 192.168.150.2: icmp_seq=3 ttl=63 time=28.1 ms

--- 192.168.150.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 26.804/40.272/65.837/18.086 ms
$ ping -c3 192.168.250.2
PING 192.168.250.2 (192.168.250.2) 56(84) bytes of data.
64 bytes from 192.168.250.2: icmp_seq=1 ttl=63 time=30.3 ms
64 bytes from 192.168.250.2: icmp_seq=2 ttl=63 time=27.3 ms
64 bytes from 192.168.250.2: icmp_seq=3 ttl=63 time=27.4 ms

--- 192.168.250.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 27.366/28.404/30.374/1.400 ms

Поиск: 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.