Files
openvpn_infrastructure/README.md

135 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

вступление...
В ИНСТРУКЦИИ ПРЕПОЛАГАЕТСЯ, ЧТО ВЫ РАБОТАЕТЕ ОТ РУТА.
## Подготовка
ОБНОВИТЬ СИСТЕМУ (отдельный гайд)
Поскольку многм линуксовые утилиты привычнее, установим знакомый редактор
```
pkg install nano
```
Установим OpenVPN и easy-rsa:
```
pkg install openvpn easy-rsa
```
Загрузим модуль ядра для поддержки DCO:
```
kldload if_ovpn
```
Чтобы модуль ядра подгружался автоматически, выполним:
```
echo 'if_ovpn_load="YES"' >> /boot/loader.conf
```
Разрешим маршрутизацию трафика:
```
sysctl net.inet.ip.forwarding=1
```
Чтобы это делалось автоматически при загрузке, выполним:
```
echo 'gateway_enable="YES"' >> /etc/rc.conf
```
## Ключи и сертификаты
Создадим структуру:
```
mkdir /root/openvpn-ca && cd /root/openvpn-ca && easyrsa init-pki
```
По-умолчанию сроки действия сертификатов невелики, создадим файл с переменными:
```
cat << 'EOF' > vars
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_CA_EXPIRE 7300
EOF
Далее создадим CA:
```
easyrsa build-ca
```
```
И теперь создадим сертификаты сервера и шлюза:
```
easyrsa build-server-full server nopass
```
```
easyrsa build-client-full gateway-client nopass
```
Скопируем сертификаты в рабочую папку OpenVPN:
```
cp pki/ca.crt pki/issued/server.crt pki/private/server.key /usr/local/etc/openvpn/
```
## Настройка сервера
Создаём конфиг сервера:
```
cat << 'EOF' > /usr/local/etc/openvpn/openvpn.conf
dev ovpn0
dev-type tun
proto udp
port 443
topology subnet
server 10.210.0.0 255.255.255.0
client-config-dir /usr/local/etc/openvpn/ccd
route 0.0.0.0 0.0.0.0
push "redirect-gateway def1 bypass-dhcp"
client-to-client
cipher AES-128-GCM
data-ciphers AES-128-GCM
ca /usr/local/etc/openvpn/ca.crt
cert /usr/local/etc/openvpn/server.crt
key /usr/local/etc/openvpn/server.key
dh none
keepalive 10 120
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
EOF
```
Также ссоздадим директоррию для индивидуальных настроек клиентов (client specific overrides):
```
mkdir -p /usr/local/etc/openvpn/ccd
```
ВАЖНОЕ ЗАМЕЧАНИЕ.
Обратите внимание на строку `route 0.0.0.0 0.0.0.0` в конфиге. Это значит, весь трафик будет перенаправлен в интерфейс ovpn0. Поэтому далее будет применена магия FreeBSD - FIBs (таблицы маршрутизации) и PF (фильтрация пакетов), с помощью которых легко и элегантно можно применить policy-based routing.
#### Шаг 1. Настройка ядра FreeBSD на работу с двумя таблицами (FIB)
По умолчанию во FreeBSD одна таблица маршрутизации. Добавим вторую:
```
echo 'net.fibs="2"' >> /boot/loader.conf
```
*Чтобы применить это без перезагрузки всего сервера, выполните команду в консоли:*
```
sysctl net.fibs=2
```
#### Шаг 2. Включаем Packet Filtering:
```
nano /etc/pf.conf
```
Если создался новый файл - это нормально. Значит pf на данной системе ещё не применялся. Добавим в файл следующее:
```
# Разрешаем весь трафик на vpn-интерфейсе и принудительно переключаем его на rtable 1 (FIB 1)
match in on ovpn0 rtable 1
# Пропускаем трафик (базовое правило, если у вас нет других ограничений)
pass all
```
Включаем PF в автозагрузку и запускаем его:
```
sysrc pf_enable="YES"
```
```
service pf start
```
#### Шаг 3. Включаем OpenVPN.
```
service openvpn restart
```
SSH-сессия должна остаться активной, так как дефолтная таблица маршрутизации (FIB 0) сервера не изменилась. Проверить, что интерфейс поднялся, можно стандартно: `ifconfig ovpn0`
Проверить, как выглядят маршруты внутри изолированной таблицы, можно командой:
```
netstat -rn -F 1
```
Осталось добавить директивы для нашего клиента-шлюза:
```
cat << 'EOF' > /usr/local/etc/openvpn/ccd/gateway-client
ifconfig-push 10.210.0.254 255.255.255.0
iroute 0.0.0.0 0.0.0.0
push-remove "redirect-gateway def1 bypass-dhcp"
EOF
```
На этом настройку сервера можно считать завершённой.