В моем случае было необходимо соединить несколько удаленных филиалов со своими локальными сетями с центральным офисом, а также обеспечить работу некоторых сотрудников из дома.
При этом белый IP имеется только у центрального офиса. В качестве всех прокси-серверов используются компьютеры с ОС OpenSuSE Linux — из-за легкости настройки, все действия займут не более получаса (для серверов).
Для начала нужно установить пакеты OpenVPN на всех серверах, и на каждом клиенте, который напрямую будет соединятся с главным сервером.
zyper in openvpn
Для обеспечения безопасности авторизация будет производится не по имени/паролю, а на основе сертификатов с открытым ключом. Для облегчения работы с сертификатами вместе с OpenVPN поставляется набор скриптов easyrca (лежит в /usr/share/openvpn/easyrca). Также поставляется набор образцов конфигурационных файлов (лежит в /usr/share/doc/packages/openvpn).
Для начала подготовим сертификаты для клиентов и сервера:
скопируем скрипты easyrca в какой-нибудь из каталогов пользователя,
заполним данные в файле vars подходящими значениями (длинами ключей и сроком действия сертификатов, названием компании, местами и т.п.)
выполнить source ./vars для установки наших переменных,
затем очистим ключи, которые могут быть от предыдущих установок: ./clean-all
и сформируем корневой сертификат: ./build-ca
Теперь можно приступить к формированию ключей:
для сервера: ./build-key-server <имя сервера/сертификата>
для клиентов: ./build-key <имя клиента/сертификата>
в качестве имени сертификата сервера целесообразно указать «server», а для клиента — название подразделения, к которому будет относится сертификат (например client_msk_timirjazevskaya, client_msk_marjina_rosha, client_spb_gorkovskaya и т.д.)
Затем сформируем параметры шифрования протокола Диффи-Хельмана: ./build-dh
Теперь в папке keys лежат все необходимые файлы, которые необходимо положить в папку /etc/openvpn по серверу и клиентам следующим образом:
- ca.crt — корневой сертификат, на сервер и на каждого клиента
- ca.key — ключ для подписи сертификатов, оставьте в папке с ключами и никому не давайте :)
- dh1024.pem — параметры шифрования, на сервер
- server.crt — сертификат сервера, на сервер
- server.key — закрытый ключ сертификата сервера, на сервер, ключ является секретным
- client_*.crt — сертификаты клиентов, на соответствующие машины клиентов
- client_*.key — закрытый ключ сертификатов клиентов, на соответствующие машины клиентов, ключи являются секретными
теперь скопируем файл конфигурации сервера из папки с примерами в папку с настройками openvpn:
cp /usr/share/doc/packages/openvpn/sample-config-files/server.conf /etc/openvpn/
в этом файле нас не устраивают некоторые параметры:
dev tap0 # тип устройства не tun, а tap, определенный номер устройства
имена файлов с сертификатами: параметры ca, cert и key
;server 10.8.0.0 255.255.255.0 # параметр server нужно закомментировать, потому что он определяет не совсем нужный пул адресов для динамического присваивания клиентам (10.8.0.2-10.8.0.254)
# вместо этого - свои параметры
mode server # режим сервера
tls-server # аутентификация по сертификата
ifconfig 10.8.0.1 255.255.255.0 # адрес/маска сервера внутри VPN
ifconfig-pool 10.8.0.100 10.8.0.254 255.255.255.0 # пул динамических адресов
push "route-gateway 10.8.0.1" # определяем маршрут на клиентах — внутри VPN все через сервер
push "route 192.168.0.0 255.255.240.0" # маршрут во внутреннюю сеть для клиентов
client-config-dir ccd # папки с конфигурациями для клиентов (для назначения статических IP) (создать внутри /etc/openvpn)
client-to-client # маршрутизация между клиентами
up "service SuSEfirewall2_setup restart" # перезапуск файрволла при старте сервиса
down "service SuSEfirewall2_setup restart" # и при остановке... из-за того, что устройства,
# создаваемые openvpn виртуальные и существуют только пока он запущен
route 192.168.1.0 255.255.255.0 10.8.0.2 # маршрут в сеть филиала 1
route 192.168.2.0 255.255.255.0 10.8.0.3 # маршрут в сеть филиала 2 (см. Схему)
# и маршруты в сети остальных филиалов...
теперь нужно задать статические адреса для клиентов с внутренними адресами, для этого нужно в папке /etc/openvpn/ccd (см выше) создать файлы с именами сертификатов соответствующих клиентов, с примерно таким содержанием:
ifconfig-push 10.8.0.2 255.255.255.0 # конфигурация клиента
iroute 192.168.2.0 255.255.255.0 10.8.0.2 # маршрут для процесса openvpn и его встроенной маршрутизации
на клиентах же копируем файл client.conf из папки с образцами, заменяем tun на tap, задаем адрес сервера, меняем имена сертификатов на правильные и добавляем строки для перезапуска файрволла при старте/остановке openvpn
теперь нужно настроить файрволл на сервере и клиентах для того, чтобы он пропускал запросы из vpn во внутренние сети (на клиентах без внутренних сетей и не публикующих никаких ресурсов не обязательно) (также предполагается, что файрволл уже настроен как шлюз в интернет для внутренней сети):
yast2 sysconfig
далее все действия производятся в ветке /network/Firewall/SuSEfirewall2/
FW_DEV_INT добавить через пробел имя интерфейса openvpn (tap0) - добавляем его во внутреннюю зону
FW_ALLOW_CLASS_ROUTING int - разрешаем маршрутизацию между интерфейсами внутренней внутренней зоны
FW_REJECT_INT no - не отклонять пакеты из внутренней зоны - не обязательно
FW_FORWARD_ALLOW_BRIDGING yes - включить сетевые мосты, даже если нету ни одного интерфейся типа мост
все, теперь можно сохранять все настройки и запускать openvpn (на серверах и на клиентах):
service openvpn start
должно вернуть done, в списке сетевых устройств должно появится устройство tap0
ifconfig
tap0 Link encap:Ethernet HWaddr 00:FF:A0:B4:72:BF
inet addr:10.8.0.1 Bcast:10.8.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:611222 errors:0 dropped:0 overruns:0 frame:0
TX packets:539849 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:108883515 (103.8 Mb) TX bytes:141490615 (134.9 Mb)tap0 Link encap:Ethernet HWaddr 00:FF:A0:B4:72:BF
inet addr:10.8.0.1 Bcast:10.8.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:611222 errors:0 dropped:0 overruns:0 frame:0
TX packets:539849 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:108883515 (103.8 Mb) TX bytes:141490615 (134.9 Mb)
в маршрутах автоматически прописаться нужные:
ip route
192.168.2.0/24 via 10.8.0.3 dev tap0
192.168.1.0/24 via 10.8.0.2 dev tap0
10.8.0.0/24 dev tap0 proto kernel scope link src 10.8.0.1
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.100
Все, настройка закончена, теперь при первой же возможности клиенты будут подключатся к серверу и составлять виртуальную локальную сеть как на схеме в начале статьи, в которой можно безопасно публиковать серверы и ресурсы. Интернет при этом будет работать как и работал, такая схема работает поверх уже установленных VPN соединений, и т.д. Если на клиентах, которые непосредственно подключаются к серверу используется networkmanager — необходим пакет networkmanager-openvpn, для windows настройка примерно такая же.
В заключении можно сказать, что если в /etc/openvpn сформировать несколько файлов .conf то при старте сервиса запустится столько процессов openvpn, сколько этих файлов там лежит. таким образом можно разделять клиентов по группам доступа (используюя разные корневые сертификаты), организовывать публичный доступ без доступа во внутреннюю сеть, или к с доступом к определенным серверам, сделать топологию сети типа «звезда» или «кольцо» при наличии у всех филиалов внешнего адреса с помощью нескольких туннелей, в общем можно сделать практически все, что угодно...