26.06.2011

Установка OpenVPN (client-to-site) с авторизацией внешних клиентов по LDAP (Debian)

От этой статьи много пользы не будет, так как таких миллион по Тырнету. Но я для себя свой вариант законспектирую. Все удобнее, чем у других по крупицам собирать.

Обзор сети
Например у нас есть подсеть 10.0.1.0/24, в которой находятся серверы внутри офиса компании.
Есть сервер gate.nodesquad.com со следующими адресами:
eth0 10.0.1.1 - этим интерфейсом он соединен с офисной подсетью.
eth1 123.45.67.89 - этим интерфейсом он соединен с Интернетом.
tun0 10.0.2.1 - этого интерфейса пока нет. Но он будет смотреть в сторону VPN-клиентов.

И есть клиенты извне, которые будут подцепляться через Интернет к адресу 123.45.67.89 и получать адрес из новой подсети 10.0.2.1/24. Их трафик внутрь сети будет идти таким образом:
Пакет выходит с их внутрннего интерфейса (например 10.0.2.123), идти на VPN-сервер 10.0.2.1, затем раутиться на 10.0.1.1 и уже дальше доходить до любого узла внутри офисной сети.

Тут нужно знать разницу между TUN и TAP. TUN используется для раутинга (а мы как раз планируем раутинг сделать соответственно схеме в предыдущем абзаце), а TAP нам не понадобится, потому что он для вариантов с бриджами.

Предварительная подготовка
Для начала проверим, установлены ли у нас виртуальные драйверы TUN/TAP:
modprobe tun; lsmod | grep tun

Проверяем установлен ли у нас LZO:
dpkg -l | grep lzo

Первое, что требует сделать - поставить пакеты. Пакет самого OpenVPN, пакет его модуля для авторизации в LDAP и пакет, конвертирующий регулярные выражения в C/C++ :
aptitude install openvpn openvpn-auth-ldap re2c



Подготовка к генерированию ключей
Создаем папку, где будем складывать сертификаты и копируем туда образцы из установленного пакета:
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

Поправим значения для сгенерированных сертификатов (в самом низу эти настройки):
vi /etc/openvpn/easy-rsa/vars


export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Default City"
export KEY_ORG="My Company Name"
export KEY_EMAIL="name@mycompany.com"

Генерирование ключей для сервера
Перейдем в рабочую директиорию и подцепим переменные, объявленные в vars:
cd /etc/openvpn/easy-rsa/
source vars
Инициализируем директорию keys, в которой будем работать. Внимание: все, что в ней было до этого (если пока эта директория вообще существует у Вас, чего быть не должно), потрется!
./clean-all

Сгенерируем параметры по алгоритму Диффи-Хельмана для серверной части SSL/TLS-соединения:
./build-dh

Инициализируем корневой центр сертификатов (root CA) и создадим ему корневые сертификаты:
./pkitool --initca

Создадим сами сертификаты:
./pkitool --server nodesquad.com

Создадим еще TLS-ключ. Он нужен и клиенту и серверу для пущей безопастности. Можно и без него, но он помогает блокировать DoS атаки и UDP флудинг на открытый порт сервера:
openvpn --genkey --secret keys/ta.key

Собираем комплект подключения для клиента

Напишем конфиг для клиента (подходит под все системы, включая Windows):
tee > keys/nodesquad.ovpn


dev tun
ns-cert-type server
remote vpn.nodesquad.com 1194
pull
script-security 2
tls-client
auth-user-pass
resolv-retry infinite
auth-nocache
comp-lzo

## certificates for Windows clients
ca ca.crt
tls-auth ta.key 1
## certificates for Linux clients
#ca /etc/openvpn/config/ca.crt
#tls-auth /etc/openvpn/config/ta.key 1

Как видите, для Linux нужен полный путь к сертификатам, а для Windows сойдет и относительный. Поэтому впишем оба варианта, но для Linux закомментируем, чтобы программа не путалась, откуда брать эти два сертификата.

Сложим в архивчик ключи, которые следует отправить клиенту. А так же положим их себе в домашнюю директорию, чтобы потом не искать:
cd keys
tar cf certs.tar ca.crt ta.key nodesquad.ovpn
mv certs.tar ~/.
Также возможно клиенту захочется сохранить логин и пароль, чтобы не вводить его каждый раз. Тогда ему нужно заменить строчку auth-user-pass на auth-user-pass password.txt и создать в той же папке файл password.txt где первая строчка будет логин, а вторая пароль.


Кроме того вот клиентская программа для Windows.


Настройка демона OpenVPN
Сначала будет настройка аутентификации клиентов через LDAP
Копируем пример конфига:
mkdir /etc/openvpn/auth
cp /usr/share/doc/openvpn-auth-ldap/examples/auth-ldap.conf /etc/openvpn/auth

Конфигурируем аутентификационный модуль:
cd /etc/openvpn/auth
vim auth-ldap.conf
Редактировать его по мануалу невозможно. Нужно понимать, что делаешь. Поэтому, если Вы сами администрируете свой LDAP, то вопросов не возникнет, а если не сами, то лучше обратитесь к администратору LDAP.
Сделаю лишь небольшую подсказку: Вам понадобятся три лога: LDAP-log (сделайте его лучше на уровне olcLogLevel:256) на LDAP-сервере (либо в slap.d либо в /etc/ldap/slapd.d/cn=config.ldif), лог openvpn (достаточно verb 6) на этом сервере и лог клиента лучше запускать из консоли, чтобы получить нормальный вывод клиентского лога в консоль.


Скопируем конфиг сервера в основную директорию OpenVPN:
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz

Отредактируем его:
vim /etc/openvpn/server.conf

Нужно находить соответствующие строки и менять их как ниже.
;proto tcp
proto udp
;dev tap
dev tun
ca ca.crt
cert nodesquad.com.crt
key nodesquad.com.key
server 10.0.2.0 255.255.255.0 (это подсеть для внешних клиентов)
status /var/log/openvpn/openvpn-status.log
;log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
user nobody
group nogroup

А кроме того снизу в этот же конфиг добавим плагин LDAP:

# LDAP authentication plugin
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/auth-ldap.conf
client-cert-not-required

Далее создадим лог и дадим ему необходимые права:
mkdir /var/log/openvpn
touch /var/log/openvpn/openvpn.log
touch /var/log/openvpn/openvpn-status.log
chown nobody.nogroup /var/log/openvpn/*

Перезапускаем OpenVPN:
invoke-rc.d openvpn restart


Настройка раутинга для обработки трафика между VPN-клиентом и внутренними узлами офисной сети.
Настройка форвардинга пакетов в ядре:
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
и применяем настройки:
sysctl -p

Теперь сам раутинг и файерволл:
iptables -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j SNAT --to-source 10.0.1.1
iptables -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --sport 1194 -j ACCEPT
iptables -A FORWARD -s 10.0.2.0/24 -d 10.0.1.0/24 -i tun+ -o eth0 -p icmp  -j ACCEPT
iptables -A FORWARD -s 10.0.1.0/24 -d 10.0.2.0/24 -i eth0 -o tun+ -p icmp  -j ACCEPT
iptables -A FORWARD -s 10.0.2.0/24 -d 10.0.1.0/24 -i tun+ -o eth0 -p tcp -m tcp -m multiport --dports 22,3389  -j ACCEPT
iptables -A FORWARD -s 10.0.1.0/24 -d 10.0.2.0/24 -i eth0 -o tun+ -p tcp -m tcp -m multiport --sports 22,3389  -j ACCEPT

Если на машине не был настроена загрузка фаервола при старте, то сделаем сами.
Сохраняем конфиг в файл, чтобы не потерять при следующей перезагрузке:
iptables-save > /etc/network/firewall.conf
Добавляем его загрузку в автозапуск:
vim /etc/rc.local
iptables-restore < /etc/network/firewall.conf
(естественно до команды exit 0)

Комментариев нет:

Отправить комментарий