От этой статьи много пользы не будет, так как таких миллион по Тырнету. Но я для себя свой вариант законспектирую. Все удобнее, чем у других по крупицам собирать.
Обзор сети
Например у нас есть подсеть 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:
Проверяем установлен ли у нас LZO:
Первое, что требует сделать - поставить пакеты. Пакет самого OpenVPN, пакет его модуля для авторизации в LDAP и пакет, конвертирующий регулярные выражения в C/C++ :
Подготовка к генерированию ключей
Создаем папку, где будем складывать сертификаты и копируем туда образцы из установленного пакета:
Поправим значения для сгенерированных сертификатов (в самом низу эти настройки):
Генерирование ключей для сервера
Перейдем в рабочую директиорию и подцепим переменные, объявленные в vars:
Сгенерируем параметры по алгоритму Диффи-Хельмана для серверной части SSL/TLS-соединения:
Инициализируем корневой центр сертификатов (root CA) и создадим ему корневые сертификаты:
Создадим сами сертификаты:
Создадим еще TLS-ключ. Он нужен и клиенту и серверу для пущей безопастности. Можно и без него, но он помогает блокировать DoS атаки и UDP флудинг на открытый порт сервера:
Собираем комплект подключения для клиента
Напишем конфиг для клиента (подходит под все системы, включая Windows):
Как видите, для Linux нужен полный путь к сертификатам, а для Windows сойдет и относительный. Поэтому впишем оба варианта, но для Linux закомментируем, чтобы программа не путалась, откуда брать эти два сертификата.
Сложим в архивчик ключи, которые следует отправить клиенту. А так же положим их себе в домашнюю директорию, чтобы потом не искать:
Кроме того вот клиентская программа для Windows.
Копируем пример конфига:
Конфигурируем аутентификационный модуль:
Сделаю лишь небольшую подсказку: Вам понадобятся три лога: LDAP-log (сделайте его лучше на уровне olcLogLevel:256) на LDAP-сервере (либо в slap.d либо в /etc/ldap/slapd.d/cn=config.ldif), лог openvpn (достаточно verb 6) на этом сервере и лог клиента лучше запускать из консоли, чтобы получить нормальный вывод клиентского лога в консоль.
Скопируем конфиг сервера в основную директорию OpenVPN:
Нужно находить соответствующие строки и менять их как ниже.
А кроме того снизу в этот же конфиг добавим плагин LDAP:
Далее создадим лог и дадим ему необходимые права:
Перезапускаем OpenVPN:
Настройка раутинга для обработки трафика между VPN-клиентом и внутренними узлами офисной сети.
Обзор сети
Например у нас есть подсеть 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-rsacp -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/Инициализируем директорию keys, в которой будем работать. Внимание: все, что в ней было до этого (если пока эта директория вообще существует у Вас, чего быть не должно), потрется!
source vars
./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 закомментируем, чтобы программа не путалась, откуда брать эти два сертификата.
Сложим в архивчик ключи, которые следует отправить клиенту. А так же положим их себе в домашнюю директорию, чтобы потом не искать:
Также возможно клиенту захочется сохранить логин и пароль, чтобы не вводить его каждый раз. Тогда ему нужно заменить строчку auth-user-pass на auth-user-pass password.txt и создать в той же папке файл password.txt где первая строчка будет логин, а вторая пароль.cd keystar cf certs.tar ca.crt ta.key nodesquad.ovpnmv certs.tar ~/.
Кроме того вот клиентская программа для Windows.
Настройка демона OpenVPN
Сначала будет настройка аутентификации клиентов через LDAPКопируем пример конфига:
mkdir /etc/openvpn/authcp /usr/share/doc/openvpn-auth-ldap/examples/auth-ldap.conf /etc/openvpn/auth
Конфигурируем аутентификационный модуль:
Редактировать его по мануалу невозможно. Нужно понимать, что делаешь. Поэтому, если Вы сами администрируете свой LDAP, то вопросов не возникнет, а если не сами, то лучше обратитесь к администратору LDAP.cd /etc/openvpn/auth
vim auth-ldap.conf
Сделаю лишь небольшую подсказку: Вам понадобятся три лога: 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 tcpproto udp;dev tapdev tunca ca.crtcert nodesquad.com.crtkey nodesquad.com.keyserver 10.0.2.0 255.255.255.0 (это подсеть для внешних клиентов)status /var/log/openvpn/openvpn-status.log;log /var/log/openvpn/openvpn.loguser nobody
log-append /var/log/openvpn/openvpn.log
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 ACCEPTiptables -A OUTPUT -p udp -m udp --sport 1194 -j ACCEPTiptables -A FORWARD -s 10.0.2.0/24 -d 10.0.1.0/24 -i tun+ -o eth0 -p icmp -j ACCEPTiptables -A FORWARD -s 10.0.1.0/24 -d 10.0.2.0/24 -i eth0 -o tun+ -p icmp -j ACCEPTiptables -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 ACCEPTiptables -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)
Комментариев нет:
Отправить комментарий