Вход для пользователей

OpenVPN, пример использования

Изображение пользователя Grifon.

Приведу небольшой пример, как объединить две сети, географически удалённые друг от друга. Используем Linux, OpenVPN. Расположение и структура файлов от fedora core.
Итак, что мы имеем. А имеем мы два офиса, назовём их o1 и o2. В каждом протянута локальная сеть. В каждом есть свой интернет-провайдер и интернет-шлюз на базе Linux (fw1 и fw2 соответственно). Что мы хотим: чтобы у нас было одно адресное пространство 192.168.0.0/24 и прозрачная работа сети.

Пусть у шлюзов будут адреса 192.168.0.1 для fw1 и 192.168.0.2 для fw2.
Для успешного функционирования при проблемах с Интернетом и минимизации трафика на каждом шлюзе будет стоять сервер dhcp. Этим, естественно будет заниматься демон dhcpd. Настройки его таковы (/etc/dhcpd.conf):
для fw1

ddns-update-style none;
ignore client-updates;
subnet 192.168.0.0 netmask 255.255.255.0 {
        option routers                  192.168.0.1;
        option subnet-mask              255.255.255.0;
        option domain-name              "mynetwork";
        option domain-name-servers      192.168.0.1;
        range 192.168.0.10 192.168.0.200;
}

для fw2
ddns-update-style none;
ignore client-updates;
subnet 192.168.0.0 netmask 255.255.255.0 {
        option routers                  192.168.0.2;
        option subnet-mask              255.255.255.0;
        option domain-name              "mynetwork";
        option domain-name-servers      192.168.0.2;
        range                           192.168.0.201 192.168.0.254;
}

Как видно, диапазоны ip не пересекаются.
Кроме того, на каждом шлюзе установим bind для кэширования dns-запросов и поддержания локальной dns.
Не буду приводить полный файл конфигурации, желающие найдут нужную информацию. Предположим, что это /etc/named.conf.
fw1:
options {
  directory "/var/named";
  forwarders {
    /* тут ip сервера dns для первого провайдера */
  };
  allow-transfer  { 192.168.0.2; };
  allow-query { 192.168.0.0/24; };
};

/* локальный домен  mynetwork. Описание зоны в файле  /var/named/mynetwork */
zone "mynetwork" {
                type master;
                file "mynetwork";
        };

fw2:
options {
  directory "/var/named";
  forwarders {
    /* тут ip сервера dns для второго провайдера */
  };
  allow-transfer  { none; };
  allow-query { 192.168.0.0/24; };
};

/* локальный домен  mynetwork. Дамп зоны в файле  /var/named/mynetwork */
zone "mynetwork" {
        type slave;
        masters { 192.168.0.1; };
        file "mynetwork.dump";
};

Таким образом, мы минимализируем запросы к локальной dns между сетями, что сэкономит трафик и уменьшит нагрузку на сеть, а так же обеспечит некоторую отказоустойчивость.
Приступим к конфигурации openvpn.
Советы по начальной установке и подробную инструкцию тоже пропущу. Кому надо - найдут. Шаги такие:
  1. установим OpenVPN на оба шлюза
  2. создадим серверный ключ на fw1
  3. создадим клиентский ключ для fw2 на fw1
  4. перенесём клиентский ключ и сертификат ca.crt с fw1 на fw2

Примемся за конфиг fw1 (тоже приведён не весь) /etc/openvpn/server.conf
port 1194
;протокол udp выбран из-за меньшей нагрузки на сеть в сравнении с tcp
proto udp
dev tap
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key  # This file should be kept secret
server-bridge 192.168.0.1 255.255.255.0 192.168.0.3 192.168.0.9
; обеспечим сжатие
comp-lzo

В данном случае мы указываем, что openvpn запускается в качестве сервера с адресом 192.168.0.1, маской /24 и выдаёт адреса от .3 до .9 , слушает порт 1194 (стандартный), использует устройство tap (об этом чуть позже).
fw2: /etc/openvpn/client.conf
client
dev tap
proto udp
remote ip_of_fw1 1194
resolv-retry infinite
nobind
ca keys/ca.crt
cert keys/clnt.crt
key keys/clnt.key
comp-lzo
up /etc/openvpn/addiftobr

Здесь мы указываем, чтобы клиент (client) соединялся с fw1 по внешнему адресу последнего и после этого запускал скрипт /etc/openvpn/addiftobr
Сам скрипт не сложен:
#!/bin/sh

/usr/sbin/brctl addif br0 tap0
/sbin/ifconfig tap0 0.0.0.0 promisc up

Смысл такой. На fw1 подымается мост (bridge) br0:
/etc/sysconfig/network-scripts/ifcfg-br0:
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
DELAY=0

в него складывается интерфейс внутренней сети (предположим, eth0):
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
BRIDGE=br0

После запуска openvpn в качестве сервера, автоматически создаётся устройство tap0, через которое демон гоняет свой трафик. А tap0 тоже складывается в br0.
На fw2 почти так же. Создаётся мост, куда помещается внутренний интерфейс. ip у моста статический 192.168.0.2. Подробнее о мостах ищите в документации. После запуска openvpn в качестве клиента создастся устройство tap0 и выполнится скрипт помещения его в мост.
И не забываем перекрыть пакеты dhcp через Интернет:
iptables -A FORWARD -p udp -m udp --dport 67 -j DROP
на обоих шлюзах.
Если всё получится успешно, то мы можем без проблем пользоваться ресурсами сети как единым целым, не боясь за безопасность, ведь трафик шифруется.