14.10.2008

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

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

Приведу небольшой пример, как объединить две сети, географически удалённые друг от друга. Используем 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
на обоих шлюзах.
Если всё получится успешно, то мы можем без проблем пользоваться ресурсами сети как единым целым, не боясь за безопасность, ведь трафик шифруется.

0 комментариев(ий):