Files
openvpn_infrastructure/README.md

160 lines
6.9 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
```
Разрешим использование OpenVPN в системе:
```
echo 'openvpn_enable="YES"' >> /etc/rc.conf
```
Разрешим маршрутизацию трафика:
```
sysctl net.inet.ip.forwarding=1
```
Чтобы это делалось автоматически при загрузке, выполним:
```
echo 'gateway_enable="YES"' >> /etc/rc.conf
```
И создадим структуру папок OpenVPN:
```
mkdir -p /usr/local/etc/openvpn/ccd
```
## Ключи и сертификаты
Создадим структуру:
```
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
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
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
explicit-exit-notify 1
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
EOF
```
ВАЖНОЕ ЗАМЕЧАНИЕ.
Далее мы сталкиваемся с дилеммой. OpenVPN в режиме DCO не имеет встроенной маршрутизации, а смотрит только системную таблицу маршрутизации (в линуксе - вообще только таблицу main). Значит мы должны направить default gateway в сторону клиента-шлюза. Но тогда сервер перестанет отвечать на запросы с основного (физического) интерфейса. Точнее, отвечать будет, но в интерфейс OpenVPN. Значит для трафика, входящего с физического интерфейса, default gateway должен быть направлен в сторону шлюза провайдера. Поэтому далее будет применена магия 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. PostUP-скрипт для добваления маршрутов
Поскольку сам процесс OpenVPN ничего не знает об альтернативной таблице маршрутизации, он будет пытаться добавлять маршруты в основную (FIB 0). Значит будем добавлять маршруты скриптом, запускающимсся вместе с туннелем.
```
echo 'script-security 2' >> /usr/local/etc/openvpn/openvpn.conf
echo 'up "/usr/local/etc/openvpn/up.sh"' >> /usr/local/etc/openvpn/openvpn.conf
```
```
cat << 'EOF' > /usr/local/etc/openvpn/up.sh
#!/bin/sh
# Добавляем локальный маршрут подсети в FIB 1, чтобы ядро понимало интерфейс
setfib 1 route add 10.210.0.0/24 -iface ovpn0
# Добавляем две половины интернета в FIB 1
setfib 1 route add 0.0.0.0/1 -iface ovpn0
setfib 1 route add 128.0.0.0/1 -iface ovpn0
EOF
```
```
chmod +x /usr/local/etc/openvpn/up.sh
```
#### Шаг 4. Включаем OpenVPN.
```
service openvpn start
```
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
```
На этом настройку сервера можно считать завершённой.