ITСooky

IT-рецепты съедобные и не очень!

Удаленный доступ к домашнему серверу FreeBSD через OpenVPN!

дата 24.09.2015

Ставим OpenVPN для удаленного доступа в домашнею сеть через домашний сервер — это просто. А вот как находить дом если IP динамический это уже сложно(легко уже решено тут)!

itcooky_open_vpn_003

В OpenVPN, как выяснялось, самое сложное это настроить маршрутизацию — легко запутаться, и я запутался конечно! Есть варианты подключаться через интерфейсы tap и tun. С tap у меня не сложилось, да и не нужен он. tap это виртуальная сетевая карта которая прям вот помешает нас в нашу сеть как еще одного пользователя внутренней сети, а tun просто заруливает запросы на внутренние IP в VPN а интернет и прочии остаются согласно настройками местного подключения (и кстати tap на нерутованных andorid девайсах не работает).

Вот эта схемка должнапомочь, понять принцип и предназначение
itcooky_openvpn

Устанавливаем OpenVPN
cd /usr/ports/security/openvpn
тут главное чтобы без EASYRSA и DOC
make
make install

создаем папку
mkdir /usr/local/etc/openvpn
mkdir /usr/local/etc/openvpn/ccd
mkdir /var/log/openvpn
mkdir /usr/local/etc/openvpn/certs
mkdir /usr/local/etc/openvpn/crl
mkdir /usr/local/etc/openvpn/private
mkdir /usr/local/etc/openvpn/req
mkdir /usr/local/etc/openvpn/keys
touch /usr/local/etc/openvpn/index.txt
echo "01" > /usr/local/etc/openvpn/serial

добавляем
vi rc.conf
строки

openvpn_enable="YES"
openvpn_if="tun"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"
openvpn_dir="/usr/local/etc/openvpn"

Далее генерим по инструкции www.sergeysl.ru/freebsd-openvpn-x509

делаем файл
vi /usr/local/etc/openvpn/openssl.cnf
и вставляем

[ ca ]
default_ca               = CA_default
[ CA_default ]
dir                      = /usr/local/etc/openvpn
crl_dir                  = $dir/crl
database                 = $dir/index.txt
new_certs_dir            = $dir/certs
certificate              = $dir/CA_cert.pem
serial                   = $dir/serial
crl                      = $dir/crl/crl.pem
private_key              = $dir/private/CA_key.pem
RANDFILE                 = $dir/private/.rand
default_days             = 3650
default_crl_days         = 365
default_md               = md5
unique_subject           = yes
policy                   = policy_any
x509_extensions          = user_extensions
[ policy_any ]
organizationName         = match
organizationalUnitName   = optional
commonName               = supplied
[ req ]
default_bits             = 2048
default_keyfile          = privkey.pem
distinguished_name       = req_distinguished_name
x509_extensions          = CA_extensions
[ req_distinguished_name ]
organizationName         = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName   = Location Name
commonName               = Common User or Org Name
commonName_max           = 64
[ user_extensions ]
basicConstraints         = CA:FALSE
[ CA_extensions ]
basicConstraints         = CA:TRUE
default_days             = 3650
[ server ]
basicConstraints         = CA:FALSE
nsCertType               = server

Генерим дальше, пока не понимая чо к чему (сидя в папке /usr/local/etc/openvpn )
cd /usr/local/etc/openvpn

Тут на все можно отвечать энтер кроме вопрос
Common Name
пишим сюда свой вывод команты
hostname -f

поехали
openssl req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650
openssl req -new -nodes -keyout keys/server.pem -out req/server.pem
openssl ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem
openssl dhparam -out dh2048.pem 2048
openvpn --genkey --secret ta.key
chmod 600 /usr/local/etc/openvpn/keys/server.pem

Это было нужно для сервера

Для клиентов. Для каждого пользователя VPN выбираем имя в примере это Client01 на вопрос Common Name надо тоже отвечать Client01. Первые буквы ключей оставляем как есть K R C это нужно.

openssl req -new -nodes -keyout keys/KClient01.pem -out req/RClient01.pem
openssl ca -batch -config openssl.cnf -out certs/CClient01.pem -infiles req/RClient01.pem

Создаем список отзыва сертификатов — будет нужен для отзыва сертификатов

openssl ca -config openssl.cnf -gencrl -out crl/crl.pem

для просмотра отозванных сертивицатов надо
openssl crl -noout -text -in crl/crl.pem

чтобы отозвать сертификат пользователя Client01
openssl ca -config openssl.cnf -revoke certs/CClient01.pem

OepnVPN конечно странноватый, кофиг файл даже не кидает полсе установки.. читаем придумываем

vi /usr/local/etc/openvpn/openvpn.conf

Вставляем такой текст

mode server
dev               tun0
local             192.168.1.200
port              1194
proto             udp
topology subnet
ifconfig  192.168.3.1 255.255.255.0
ifconfig-pool 192.168.3.4 192.168.3.13
ifconfig-pool-persist ipp.txt
client-config-dir ccd
client-to-client
tls-server
dh                /usr/local/etc/openvpn/dh2048.pem
ca                /usr/local/etc/openvpn/CA_cert.pem
cert              /usr/local/etc/openvpn/certs/server.pem
key               /usr/local/etc/openvpn/keys/server.pem
crl-verify        /usr/local/etc/openvpn/crl/crl.pem
tls-auth          /usr/local/etc/openvpn/ta.key 0
comp-lzo
keepalive         10 120
tun-mtu           1500
mssfix            1450
persist-key
persist-tun
user             nobody
group            nobody
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb              3

local — внешний адрес домашнего сервера
ifconfig 192.168.3.1 255.255.255.0 — тут у нас и выбор подсети 192.168.3.0 и IP сервера-шлюза-openvpn для клиетов
ifconfig-pool 192.168.3.4 192.168.3.13 — клиенты должны получать айпи от сюда от 4 до 13

Чтобы не запутаться с маршрутизацией
Еще раз, у меня на сервере два интерфейса, две подсети
192.168.1.0
192.168.2.0
Клиенты OpenVPN живут в 192.168.3.0 им надо через файл /usr/local/etc/openvpn/ccd/ пропушит (кстати чисто формально) маршруты в первые две подсети, в третью они и так могут ходить.
Но пушать то мы пропушаем, но не берет маршруты Windows, поэтому мы в настройках клиента тоже прописываем маршрут, но уже конкретно со шлюзуем 192.168.3.1 и OpenVPN на винде должен запускать под администратором.
Появление третей подсети на домашнем сервере, тоже требует настройки на firewallе, надо учесть и разрешить еще и хождение подсети 192.168.3.0

Кстати у меня файрволл ipfw, и порты наружу закрыты так что мне нужно открыть порт 1194
vi /etc/rc.firewall
строчку чтобы давал нам

${FwCMD} add allow udp from any to any 1194 via ${lanout}

так же разрешил всему ходить по tun0

${FwCMD} add allow all from any to any via tun0

и надо открыть наружу кучу UDP портов (по Asteriskуже были открыты но тут надо прям по всему диапазону для TLS)

${FwCMD} add allow udp from any to any 1195-65000 via ${lanout}

и перезагрузить оный
/etc/rc.d/ipfw restart

проверяем запустился ли
service openvpn start

смотрим как запустился
sockstat -4 -l | grep openvpn

Все работает… у меня через пару недель, а у прочтенцов этой инструкции может и сразу заработать (хотя сразу не бывает такого)!

Теперь надо создать файл для каждого пользователя должен называться так же как переж этим Client01 и так далее
vi /usr/local/etc/openvpn/ccd/Client01
и вставляем

push "route 192.168.1.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0"

Кстати не кстати opnessl по умочанию не создают имена ключей сертификатов если такие уже были
чтобы разрешить их все таки делать надо в файле
vi /usr/local/etc/openvpn/index.txt.attr
изменить строку на

unique_subject = no

для настройки на клиенте нам нужны следующие файлы, их надо унести к клиенту
/usr/local/etc/openvpn/certs/CClient01.pem
/usr/local/etc/openvpn/CA_cert.pem
/usr/local/etc/openvpn/keys/KClient01.pem
/usr/local/etc/openvpn/ta.key

Делаем файл с именем клиента
vi Client01.ovpn
и вставляем туда текст

client
auth-nocache
dev tun
pull
topology subnet
proto udp
comp-lzo
resolv-retry infinite
persist-key
persist-tun
remote 83.237.0.217
route 192.168.2.0 255.255.255.0 192.168.3.1
route 192.168.1.0 255.255.255.0 192.168.3.1
ca CA_cert.pem
cert CClient01.pem
key KClient01.pem
tls-client
tls-auth ta.key 1
verb 3
float

Все это несем на Windows компутер. Качаем от сюда и ставим для 32 битной Windows openvpn-install-2.3.8-I601-i686.exe openvpn.net/index.php/open-source/downloads.html

И все взятое с сервера кладем в папку
C:\Program Files\OpenVPN\config\

Прежде чем попробовать!

1. На Windows программу OpenVPN надо запускать с права админстраторами (потому что она маршруты прописвает и видимо еще что-то)
Для этого на ярлыке программы ставим Выполнять эту программу от имени администратора
3

2. Нам нужно знать внешний IP нашего интернет роутера-модема и пр. Для этого по этой статье(например) делаем отсылку внешнего IP с сервера www.itcooky.com/?p=3802. IP вводим через меню OpenVPN там выбираем Редактировать конфигурацию
12

3. В домашней сети мы сидим за модемом-роутером, не смотрим в сеть с прямого айпи, не можем мы прямо ответить на запрос!
Поэтому на своем устройстве для интернета надо сделать проброс портов а именно пота 1194 на сервер на котором сидит и слушает OpenVPN!
У меня один из ADSL модемов Dlink, нужные настройки в нем прячутся(до сих пор не могу понять почему в этом месте) Межсетевой экран > Виртуальные серверы
Настраиваем как на картинке
DSL-2500U_-_2015-09-18_14.52.47

Пробуем!

Из смартфона на iOS или Android делаем Wi-Fi точку доступа, подключаем к ней ноутбук с OpenVPN, прописываем актуальный IP домашнего модем-роутра! И работает!!!
itcooky_open_vpn_003

UPD: Подключаемся к домашней сети с телефона на Android
Как выяснилось приложение от разработчиков OpenVPN тут вообще не поможет! Но на помощь приходит Арне Швабе, устанавливаем OpenVPN for Android play.google.com/store/apps/details?id=de.blinkt.openvpn

Подключаем телефофн у ПК и копируем на его память, все тоже что и сверху копировлаи для ПК клиента без измения в одну папку.

Запускаем на телефоне OpenVPN for Android
— жмем с права вверху плюс
Импорт
— находим нашу папку в ней нажимаем на имя конфига Client01.ovpnи жмем Выбрать
Screenshot_2015-09-26-11-03-33

В списке появляется наше соединение
Screenshot_2015-09-26-11-05-34

— жмем на него и всё
Screenshot_2015-09-26-11-06-09Screenshot_2015-09-26-11-06-38

Однако, если внешний IP домашнего модема уже сменился, его надо попроавить в настройках соединения во вкладке Server List
Screenshot_2015-09-26-11-15-25