OpenVPN
Имеем центральный офис и три филиала. Все используют разных интернет-провайдеров, и разные технологии.
Локальные сети:
Центральный офис: 10.10.10.0 255.255.255.0
Филиал под условным названием npn: 192.168.0.0 255.255.255.0
Филиал под условным названием mg: 192.168.10.0 255.255.255.0
Филиал под условным названием westfood: 192.168.2.0 255.255.255.0
Необходимо связать эти сети, для обмена данными 1С между филиалами и центральным офисом, ну и для удобства администрирования. Для этих целей будем использовать кросс-платформенную программу OpenVPN. С помощью нее создадим защищенную виртуальную частную сеть, обьединяющую локальные сети предприятия. Выглядеть это будет так: из любой локальной сети, например с сети westfood (192.168.2.0 255.255.255.0) можно будет попасть на компьютер в любой другой сети, например npn(192.168.0.0 255.255.255.0), введя локальный ip-адрес, например 192.168.0.10 . Причем не важно что у них разные провайдеры. Программа использует только один порт, и не помеха если клиенты за NATом.
Ставим (и на сервере и на клиентах):
sudo suapt-get install openvpn Создание ключей (производится только на сервере. затем необходимые ключи копируются с сервера на клиенты).
Переходим в каталог со скриптами создания ключей шифрования:
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 Открываем файл, содержащий переменные для скриптов:
nano vars изменяем следующие параметры под свою организацию:
export KEY_COUNTRY="RU"export KEY_PROVINCE="PS"export KEY_CITY="Pskov"export KEY_ORG="MegaHolod"export KEY_EMAIL=" 123@yandex.ru"export KEY_DIR="/etc/openvpn/keys" Последний - директория, куда будут сохраняться созданные ключи.
Заносим переменные из только что отредактированного файла в память
source ./vars Перед созданием ключей запускаем скрипт:
./clean-all Далее переходим непосредственно к генерированию ключей путем запуска соответствующих скриптов. Так как в файл с переменными мы уже занесли нужные значения, жмем просто Enter в ответ на вопросы скриптов, за исключением:
Sign the certificate? [y/n]:
y 1 out of 1 certificate requests certified, commit? [y/n]
y Итак создаем CA ключ:
./build-caСоздаем DH ключ (нужен только серверу):
./build-dhСоздаем private key для сервера (gate - имя сервера):
./build-key-server gateСоздаем ключи в PKCS #12 формате для машин-клиентов;
./build-key-pkcs12 mg./build-key-pkcs12 npn./build-key-pkcs12 westfoodСоздаем TLS-ключ (Общий для сервера и клиента):
openvpn --genkey --secret /etc/openvpn/keys/ta.keyИз папки "/etc/openvpn/keys" нужно скопировать ta.key и *.p12 соответствующий клиенту на машины-клиенты.
Настраиваем сервер (создаем файл-конфиг и заполняем его):
touch /etc/openvpn/server.confnano /etc/openvpn/server.conf p
ort 17993 # порт, на котором будет слушать серверproto tcp # протокол (по умолчанию udp)dev tun # тип устройства (tun или tap)############################ KEYS #######################################tls-server # явно указывает, что данный хост является tls-servertls-auth keys/ta.key 0 # 0-сервер , 1- для конфига клиентаca /etc/openvpn/keys/ca.crt # файл сертификата для CAcert /etc/openvpn/keys/gate.crt # сертификат сервераkey /etc/openvpn/keys/gate.key # ключ сервераdh /etc/openvpn/keys/dh1024.pem # файл с ключем Диффи-Хелмана########################## END KEYS ###################################### автоматически присваивает адреса всем клиентам (DHCP) в указанном# диапазоне с маской сети. Данная опция заменяет ifconfig и может# работаеть только с TLS-клиентами в режиме TUN, соответственно# использование сертификатов обязательно.server 10.8.0.0 255.255.255.0ifconfig-pool-persist ipp.txt # Тут будут храниться ip адреса клиентовpush "route 10.10.10.0 255.255.255.0" # передача клиенту маршрута к сетке,# в которой сервер.# каждые 10 секунд посылать ping на удаленный хост, и, если за 60 секунд# не было получено ни одного пакета - то перезапускать туннель.keepalive 10 60# параметр сжатия трафика, идущего через виртуальный туннель.# Может принимать значения yes, no, adaptive.# Последнее используется по умолчанию.comp-lzo# Для улучшения безопасности рекомендовано запускать# все сервисы с минимальными правами. Openvpn будет работать от имени nobody.user nobodygroup nogrouppersist-key # указывает не перечитавать файлы ключей при перезапуске туннеляpersist-tun # данная опция оставляет без изменения устройства tun/tap#при перезапуске OpenVPN.# сервер работает в режиме демонаdaemon############################ LOGS #######################################status openvpn-status.log # указывает путь к статус-файлу,# в котором содержится информация о текущих соединениях и# информация о интерфейсах TUN/TAPlog-append openvpn.log # дописывать сообщения в лог-файл, а не перезаписывать.verb 4 # уровень логированияmute 20 # в лог будет записываться только по 20 сообщений из одной категории########################### END LOGS ####################################client-to-client # позволяет клиентам видеть друг друга (сети)client-config-dir /etc/openvpn/ccd # папка содержащая маршруты к сетям# клиентов и посылаемые клиентам ip адреса клиента и сервераccd-exclusive # каждому клиенту свои настройкиmanagement localhost 7505tun-mtu 1500 # устанавливает максимальный размер MTUtun-mtu-extra 32mssfix 1450# маршруты к сетям клиентовroute 192.168.10.0 255.255.255.0 10.8.0.2route 192.168.0.0 255.255.255.0 10.8.0.2route 192.168.2.0 255.255.255.0 10.8.0.2 Настройки маршрутизации к клиентским сетям и выдача им ip.
Выбранные пары IP-адресов, во-первых, должны быть уникальными, во-вторых, должны входить в состав последовательных подсетей, ограниченных маской /30 (255.255.255.252), и, в-третьих, должны находиться в пределах пула IP-адресов, выделенного для виртуальной частной сети (определяется параметром server файла конфигурации сервера OpenVPN). С учетом перечисленных условий для клиентов и сервера подойдут пары IP-адресов со следующими парами последних октетов:
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18] [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38][ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58] [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78][ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98] [101,102] [105,106] [109,110] [113,114] [117,118][121,122] [125,126] [129,130] [133,134] [137,138] [141,142] [145,146] [149,150] [153,154] [157,158][161,162] [165,166] [169,170] [173,174] [177,178] [181,182] [185,186] [189,190] [193,194] [197,198][201,202] [205,206] [209,210] [213,214] [217,218] [221,222] [225,226] [229,230] [233,234] [237,238][241,242] [245,246] [249,250] [253,254] Создаем на сервере файлы для каждого клиента:
touch /etc/openvpn/ccd/npnnano /etc/openvpn/ccd/npn iroute 192.168.0.0 255.255.255.0ifconfig-push 10.8.0.5 10.8.0.6 255.255.255.252 # iroute - маршрут к сети клиента под названием npn
# ifconfig-push <ip клиента> <ip сервера> <маска /30>
# посылает клиенту ай-пи адрес клиента и сервера
для других сетей аналогично:
touch /etc/openvpn/ccd/mgnano /etc/openvpn/ccd/mg iroute 192.168.10.0 255.255.255.0ifconfig-push 10.8.0.9 10.8.0.10 255.255.255.252 touch /etc/openvpn/ccd/westfoodnano /etc/openvpn/ccd/westfood iroute 192.168.2.0 255.255.255.0ifconfig-push 10.8.0.13 10.8.0.14 255.255.255.252 Правила для IPTABLES.
Для того что-бы это все работало, в фаерволе (iptables), если он используется, нужно разрешить трафик. Пример куска моего скрипта настройки, касающегося openvpn:
#!/bin/bash#################################################### Переменные###################################################
#указываем внешний ip сервера и внешн. сетевой интерфейсINET_IP1=195.239.136.хххINET_IFACE1=eth2
# указываем внутренний ip сервера и внутр. сетевой интерфейсLAN_IP=10.10.10.4LAN_IFACE=eth0
# указываем сетевой интерфейс VPN, и сеть, ему принадлежащуюVPN_IFACE=tun0VPN_RANGE=10.8.0.0/24
# внутренняя сетьLAN_RANGE=10.10.10.0/24
# сетевой интерфейс петли и ipLO_IFACE=loLO_IP=127.0.0.1 ####################################################OpenVPN###################################################
# разрешаем трафик между локальной сетью и VPN# (необходимо для возможности доступа к серверу по внутреннему ip. c клиента)$ip -A FORWARD -p all -i $LAN_IFACE -o $VPN_IFACE -j ACCEPT$ip -A FORWARD -p all -o $LAN_IFACE -i $VPN_IFACE -j ACCEPT
# разрешаем входящий и исходящий трафик для vpn-интерфейса# (необходимо для возможности установки vpn соединения)$ip -A INPUT -p all -i $VPN_IFACE -j ACCEPT$ip -A OUTPUT -p all -o $VPN_IFACE -j ACCEPT # разрешаем icmp пакеты через vpn# (необходимо для пинга)$ip -A INPUT -p icmp -m icmp -i $VPN_IFACE --icmp-type echo-request -j ACCEPT$ip -A OUTPUT -p icmp -m icmp -o $VPN_IFACE --icmp-type echo-request -j ACCEPT
$ip -A FORWARD -p icmp -m icmp -i $VPN_IFACE -o $LAN_IFACE --icmp-type echo-request -j ACCEPT$ip -A FORWARD -p icmp -m icmp -o $VPN_IFACE -i $LAN_IFACE --icmp-type echo-request -j ACCEPT
$ip -A INPUT -p icmp -m icmp -i $VPN_IFACE --icmp-type echo-reply -j ACCEPT$ip -A OUTPUT -p icmp -m icmp -o $VPN_IFACE --icmp-type echo-reply -j ACCEPT
$ip -A FORWARD -p icmp -m icmp -i $VPN_IFACE -o $LAN_IFACE --icmp-type echo-reply -j ACCEPT$ip -A FORWARD -p icmp -m icmp -o $VPN_IFACE -i $LAN_IFACE --icmp-type echo-reply -j ACCEPT Теперь на машинах-клиентах создаем конфиг:
touch /etc/openvpn/client.confnano /etc/openvpn/client.conf clientdev tun # тип устройства tun или tap#dev-node OpenVPN # раскоментировать если клиент под виндовс# для виндовс нужно указать название# создаваемого сетевого адаптераproto tcp # протокол. по умолчанию udpremote 195.239.136.ххх 17993 # ip и порт сервераremote 93.153.252.ххх 17993resolv-retry infinite # для dyndnspersist-key # указывает не перечитавать файлы ключей при перезапуске туннеляpersist-tun # данная опция оставляет без изменения устройства tun/tap###############KEY######################tls-client# пути к файлам ключей, которые мы скопировали с сервераpkcs12 /etc/openvpn/keys/westfood.p12tls-auth /etc/openvpn/keys/ta.key 1#############END_KEY##################### параметр сжатия трафика, идущего через виртуальный туннель.# Может принимать значения yes, no, adaptive.# Последнее используется по умолчанию.comp-lzoverb 4 # уровень логированияtun-mtu 1500 # устанавливает максимальный размер MTUtun-mtu-extra 32mssfix 1450route-delay 5 # посылать маршруты через 5 сек. после установки vpn-каналаmanagement localhost 7505# show-net-up # раскоментировать, если клиент под виндовс# если в конфиг OpenVPN вставить show-net-up, то OpenVPN запросит# windows через API всю таблицу маршрутизации и выведет её в лог#ip-win32 manual # раскоментировать, если клиент под виндовс Запускаем на сервере, а затем и на клиентах демон openvpn:
/etc/init.d/openvpn start Выходим из под рута:
exit
Oct. 23, 2010