OpenVPN между FreeBSD и Windows Для создания vpn между Windows и FreeBSD оптимальным решением является использование OpenVPN, по крайней мере в моём случае. У меня сервер на FreeBSD а клиенты будут на Windows-e. Так как клиенты будут подключатся к серверу "не известно откуда" (т.е. гостиницы, аэропорты) это значит, что постоянного IP адреса у них не будет, и возможно, провайдером будут блокированны некоторые порты. Поэтому решения с помощью IPSEC и прочих сладостей отпадают, поэтому и OpenVPN :) . Оффициальный Howto рекомендует использовать для конекта UDP порт с номером 1194. Но я поставил у себя TCP 443. Объясню почему, потому что на TCP вероятность установить соединение больше, (т.к. если кто-то будет блокировать UDP), а 443 порт всегда открыт, я еще не видел, чтобы его закрывали. Но если хочется иметь 100% гарантию удачного соединения, можно сервер повесить и на TCP 80-ый порт.Итак что нужно для того, чтобы все заработало? Я решил разбить задачи на несколько пунктов - так нагляднее:1. Установка OpenVPN из портов2. Генерация сертификатов для клиента и для сервера3. После сертификатов необходимо создать и откофигурировать конфигурационный файл OpenVPN server-a4. Далее запуск сервера и включение автозапуска при старте системы5. Настройка OpenVPN клиента под Windows6. Тестинг и проверинг7. Как оно работает Итак пункт 1-ый - Установка, тут все просто :) #make && make install && make clean Далее пункт 2-ой - Генерация ключей и сертификатов. Здесь тоже все просто, нужно перейти в каталог в котором расположенны скрипты для создания сертификатов. Нужно поочереди запустить каждый скрипт и отвечать на его вопросы. В общем создание сертификатов - дело интерактивное :) # cd /usr/local/share/doc/openvpn/easy-rsa/ #ls vars clean-all build-ca build-key-server build-key build-dh ta.keyНа самом деле там больше скриптов, но мне только эти нужны. Далее запускаем оболочку shell и очищаем старые сертификаты: # sh # . ./vars NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/local/share/doc /openvpn/easy-rsa/keys # ./clean-allТеперь создаем Certificate Authority для сервера # ./build-ca Generating a 1024 bit RSA private key .....................................++++++ ......++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]:MD State or Province Name (full name) [NA]:Chisinau Locality Name (eg, city) [BISHKEK]:Chisinau Organization Name (eg, company) [OpenVPN-TEST]:company Organizational Unit Name (eg, section) []:server Common Name (eg, your name or your server's hostname) []:server Email Address [me@myhost.mydomain]:administrator@company.md #Пояснения:то, что выделенно жирным - то я вводил своими руками, хочу обратить внимание, только на 2-е вещиCountry Name (2 letter code) [KG]:MD --> Здесь нужно написать только 2-е буквы.Common Name (eg, your name or your server's hostname) []:server а это идентификатор, где будет использоваться сертификат. Т.е. для сервера это будет server а для клиентов это будет client, client2,client3.Далее необходимо создать сертификат X.509 для сервера, тут почти то же самое, что и для первого (CA). # ./build-key-server server Generating a 1024 bit RSA private key .........................................++++++ ........................++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]:MD State or Province Name (full name) [NA]:Chisinau Locality Name (eg, city) [BISHKEK]:Chisinau Organization Name (eg, company) [OpenVPN-TEST]:company Organizational Unit Name (eg, section) []:company Common Name (eg, your name or your server's hostname) []:server Email Address [me@myhost.mydomain]:administrator@company.md Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:gfccdjhl An optional company name []:company Using configuration from /usr/local/share/doc/openvpn/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'MD' stateOrProvinceName :PRINTABLE:'Chisinau' localityName :PRINTABLE:'Chisinau' organizationName :PRINTABLE:'company' organizationalUnitName:PRINTABLE:'company' commonName :PRINTABLE:'server' emailAddress :IA5STRING:'administrator@company.md' Certificate is to be certified until Apr 1 20:31:10 2018 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated #Теперь ключ для клиента, все то же самое, нужно отвечать на простые вопросы :) # ./build-key client Generating a 1024 bit RSA private key ..........++++++....++++++ writing new private key to 'client.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]:MD State or Province Name (full name) [NA]:Chisinau Locality Name (eg, city) [BISHKEK]:Chisinau Organization Name (eg, company) [OpenVPN-TEST]:company Organizational Unit Name (eg, section) []:client Common Name (eg, your name or your server's hostname) []:client Email Address [me@myhost.mydomain]:director@company.md Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:gfccdjhl An optional company name []:company Using configuration from /usr/local/share/doc/openvpn/easy-rsa/openssl.cnf DEBUG[load_index]: unique_subject = "yes" Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'MD' stateOrProvinceName :PRINTABLE:'Chisinau' localityName :PRINTABLE:'Chisinau' organizationName :PRINTABLE:'company' organizationalUnitName:PRINTABLE:'client' commonName :PRINTABLE:'client' emailAddress :IA5STRING:'director@company.md' Certificate is to be certified until Apr 1 20:35:54 2018 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated #Далее нужно создать ключ Diffie Hellman Интерессный вывод получается ;) # ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time ................................................................................................................. +................................+............................................................................. ......................+......................................................................................... ...+................+....+....................+.....................................................+...... ...............................+................................................................................ ....+.........+.......................................+...................+.................................. ....+......................................................................................+.................... ........................................+........................+...+......................................... ..++*++*++* #И еще один ключ: # openvpn --genkey --secret ta.keyta.key будет находится здесь /usr/local/share/doc/openvpn/easy-rsa/А все остальные ключи, которые я до сих пор создавал будут здесь /usr/local/share/doc/openvpn/easy-rsa/keys.Что для чего можно увидеть в табличке:Filename Needed By Purpose Secret ca.crt server + all clients Root CA certificate NO ca.key key signing machine only Root CA key YES dh1024.pem server only Diffie Hellman parameters NO server.crt server only Server Certificate NO server.key server only Server Key YES client.crt client1 only Client1 Certificate NO client.key client1 only Client1 Key YESС ключами я закончил, перехожу к пункту 3. Пункт 3-и создание и кофигурирование файла настроек OpenVPN server-aДля начала необходимо создать директорию, в которой будет находится конфиг файл и сертификаты. Конфиг файл нужно создать вручную, а сертификаты и ключи, которые я создал нужно скопировать из директории keys. Еще нужно самому создать будущие лог файлы, после этого в конфиге нужно указать "что - где" находится. #mkdir /usr/openvpn (<- Здесь будет конфиг сервера) #mkdir /usr/openvpn/keys (<- Здесь будут ключи сервера) #mkdir /usr/openvpn/ccd (<- Здесь будут настройки клиента (мне это не понадобилось)) #mkdir /var/log/openvpn (<- Здесь будут логи) #touch /usr/openvpn/server.conf (<- Собственно сам конфиг сервера) #touch /var/log/openvpn/openvpn.log (<- Собственно лог) #touch /var/log/openvpn/openvpn-status.log (<- А здесь можно будет увидеть в каком состоянии сервер)Уже хочется начать править конфиг, но надо не забыть скопировать ключи в рабочую директорию. #cd /usr/local/share/doc/openvpn/easy-rsa/keys #cp ca.crt /etc/openvpn/keys #cp dh1024.pem /etc/openvpn/keys #cp server.crt /etc/openvpn/keys #cp server.key /etc/openvpn/keys #cd ../ cp ta.key /etc/openvpn/keysВот теперь самое вкуссное :) #ee /usr/openvpn/server.conf port 443 ;порт proto tcp ;протокол dev tun ;устройство (tun тунель) keepalive 20 240 ;ping каждые 20 сек, если после 240 сек ответа нет - значит связь потерянна server 10.20.30.0 255.255.255.0 ;указываю VPN подсеть (все VPN клиенты будут получать адреса из 10.20.30.0 подсети) ;далее я указываю пути к сертификатам ca /usr/openvpn/keys/ca.crt cert /usr/openvpn/keys/server.crt key /usr/openvpn/keys/server.key dh /usr/openvpn/keys/dh1024.pem tls-server ;включение дополнительной безопасности, ключ ta.key должен быть и на сервере и на клиенте. 2-ой параметр в конфигах должен быть "0" на сервере и "1" у клиента (см. ниже) tls-auth /usr/openvpn/keys/ta.key 0 ;путь к ключу tls-timeout 120 ;время до реконекта cipher BF-CBC ;шифрование Blowfish (можно поставить AES, DES - у меня стандартное) persist-key persist-tun user nobody ;запуск OVPN от виртуального пользователя group nobody ifconfig-pool-persist ipp.txt ;для того, чтобы клиенту всегда выдавался один и тот же ip (здесь хранится соотвествие клиент - виртуальный IP) push "route 10.0.0.0 255.255.255.0" ;так прописывается маршрут для клиента, чтобы он смог видеть подсеть за VPN сервером route 10.20.30.0 255.255.255.0 ;а это маршрут сервер-клиент comp-lzo ;включить сжатие max-clients 10 ;максимум 10 клиентов log /var/log/openvpn/openvpn.log ;лог файл (не забываем создавать лог файлы) status /var/log/openvpn/openvpn-status.log ;здесь можно будет посмотреть текущее состояние сервера verb 4 ;уровень логирования, от 0 до 9 (9-максимум логов) mute 10 ;Запрет на повтор сообщений в логах. Не более 10 идущих друг за другом сообщений одного типа будут направлены в лог.Это был конфигурационный файл OpenVPN сервера, у меня он находится здесь /usr/openvpn/server.confеще раз, только уже без комментариев: #NETWORK port 443 proto tcp dev tun keepalive 20 240 server 10.20.30.0 255.255.255.0 route 10.20.30.0 255.255.255.0 push "route 10.0.0.0 255.255.255.0" ifconfig-pool-persist ipp.txt #SECURITY ca /usr/openvpn/keys/ca.crt cert /usr/openvpn/keys/server.crt key /usr/openvpn/keys/server.key dh /usr/openvpn/keys/dh1024.pem tls-server tls-auth /usr/openvpn/keys/ta.key 0 tls-timeout 120 cipher BF-CBC persist-key persist-tun user nobody group nobody comp-lzo max-clients 10 log /var/log/openvpn/openvpn.log status /var/log/openvpn/openvpn-status.log verb 4 mute 10Пункт 4-ый запуск сервера и включение автозапускаЗапуск: #/usr/local/etc/rc.d/openvpn startили так (переходим в каталог openvpn и запускаем оттуда конфиг сервера) #cd /usr/openvpn/ #openvpn --config server.confЧтобы при старте системы запускался openvpn нужно добавить пару строк в /etc/rc.conf openvpn_enable="YES" openvpn_if="tun" openvpn_configfile="/usr/openvpn/server.conf" openvpn_dir="/usr/openvpn" Пункт 5-ый Настройка OpenVPN клиента под WindowsСкачать. Установить. Сюда C:Program FilesOpenVPNconfig скинуть с сервера ключи/сертификаты:-ca.crt-client.crt-client.key-ta.keyПодправить этот конфиг C:Program FilesOpenVPNconfigclient.ovpn - у меня он такой: dev tun proto tcp remote 211.211.211.21 ;это реальный IP сервера port 443 client resolv-retry infinite ca ca.crt cert client.crt key client.key tls-client tls-auth ta.key 1 cipher BF-CBC ns-cert-type server comp-lzo persist-key persist-tun verb 4Запуск клиента:Прав. кнопкой по конфиг файлу client.ovpn из открывшегося меню выбрать "Start openvpn on this config file" или через *.bat файл с таким содержанием: "C:Program FilesOpenVPNbinopenvpn.exe" "C:Program FilesOpenVPNconfigclient.ovpn"ВАЖНО:OPENVPN и WINDOWS VISTA не будут работать с конфигом кот. выше. Для того чтобы связать vpn клиента на vista нужно добавить в конфиг файл клиента пару строк: route-method exe route-delay 2И ОБЯЗАТЕЛЬНО запускать через *.bat файл. Содержимое как и выше, путь к программе и путь к конфигу: "C:Program FilesOpenVPNbinopenvpn.exe" "C:Program FilesOpenVPNconfigclient.ovpn"Для запуска, нажать правой кнопкой мыши на *.bat файл и выбрать “Запустить как администратор”. Дело в том, что при запуске, идет подключение к серверу и клиент пытается прописать маршруты в таблицу маршрутизации, а vista блокирует попытку и в логах можно увидеть такие строки: ROUTE: route addition failed using CreateIpForwardEntry: Пункт 6-ой ТестингПосле запуска сервера можно посмотреть запустился ли он: # top | grep openvpn 659 nobody 1 96 0 2984K 2444K select 0:01 0.00% openvpn # sockstat -4 | grep 443 nobody openvpn 659 5 tcp4 *:443 *:*Если нет смотрим логи. У меня лог файл здесь /var/log/openvpn/openvpn.log если запустился можно пинговать клиента его IP будет 10.20.30.6 (это IP адресс первого клиента)С клиента можно пинговать vpn сервер (10.20.30.1) пинговать компы за сервером (10.0.0.2, 10.0.0.10), подключать папки, заходить на терминал сервер (если есть). 7 Как оно работаетПочему такая странная адресация у первого клиента? Почему IP адресс 10.20.30.6 , а не к примеру 10.20.30.2 ?Для каждого подключения OpenVPN разделяет сеть 10.20.30.0 на подсети по 4-ре IP-адреса.Первому клиенту выделяется подсеть 10.20.30.4 с маской /30 (255.255.255.252)-10.20.30.4 это адрес самой сети-10.20.30.5 это виртуальный шлюз сервера (этот адрес не пингуется и используется только сервером)-10.20.30.6 это адрес клиента-10.20.30.7 это широковещательный адрес сети (subnet broadcast)Второму клиенту выделяется следующий блок из 4-х узлов (10.20.30.8/30)10.20.30.8 это адрес самой сети10.20.30.9 это виртуальный шлюз сервера10.20.30.10 это адрес клиента10.20.30.11 это широковещательный адрес сетиVPN server всегда ждет подключения по адресу 10.20.30.1, он и есть Основной шлюз для VPN клиента.Удачи в настройке