На днях появилась задача объединить 3 офиса через интернет по средствам OpenVPN в одну сеть. Что бы люди могли ходить по сети друг к другу, так же была одна база 1С для всех пользователей, подключаться через подключение к удаленному рабочему столу к удаленным компам филиалов. В общем много чего можно из этого выжать. Да и естественно должно быть шифрование и сжатие трафика стандартными средствами OpenVPN.
#. ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on
/usr/local/share/doc/openvpn/easy-rsa/keys/server
#./clean-all
Создаем ключи для нашего сервера OpenVPN
В моем случае создаем 2 ключа и 1 сертификат для самого сервера OpenVPN, (создаем их один раз и навсегда)
1.Создаем 1-ый ключ 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]:RU
State or Province Name (full name) [NA]:Rostov-on-Don
Locality Name (eg, city) [BISHKEK]:Zernograd
Organization Name (eg, company) [OpenVPN-TEST]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) []:server
Email Address [me@myhost.mydomain]:root@localhost
2.Создаем сертификат X.509
# ./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]:RU
State or Province Name (full name) [NA]:Rostov-on-Don
Locality Name (eg, city) [BISHKEK]:Zernograd
Organization Name (eg, company) [OpenVPN-TEST]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) []:server
Email Address [me@myhost.mydomain]:root@localhost
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:Password
An optional company name []:server
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:'RU'
stateOrProvinceName :PRINTABLE:'Rostov-on-Don'
localityName :PRINTABLE:'Zernograd'
organizationName :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'root@localhost'
Certificate is to be certified until Jan 1718:06:102019 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
3.Генерируем 1024 битный ключ Диффи Хельмана
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.............................+.+.................+.........................
.......+...................................................................
..+.......+...................................+............................
................................................+.....+....................
............+..........+...................................................
...........................................................................
.......................+...........+........+.....................++*++*++*
Выходим из shell
# exit
Создаем ключ для tls-аутентификации (который нужен как и серверу, так и клиенту)
Создаем конфиг нашего OpenVPN сервера с таким примерно содержанием
//> ee /usr/local/etc/openvpn/server.conf
# порт на котором работает сервер
port 2000
# протокол - советую udp
proto udp
# используемый тип устройства и номер
dev tun0
# указываем файл CA
ca /usr/local/etc/openvpn/keys/ca.crt
# указываем файл с сертификатом сервера
cert /usr/local/etc/openvpn/keys/server.crt
# указываем файл с ключем сервера
key /usr/local/etc/openvpn/keys/server.key
# указываем файл Диффи Хельман
dh /usr/local/etc/openvpn/keys/dh1024.pem
# задаем IP-адрес сервера и маску подсети (виртуальной сети)
server 10.10.100.0255.255.255.0
# задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он "видел"
# сеть за OpenVPN сервером (сеть 192.168.55.0/24)
push "route 192.168.0.0255.255.255.0"
# Указываем ваш внутренний DNS и WINS сервер
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option WINS 192.168.0.1"
# Делает сервер основным шлюзом
#push "redirect-gateway def1"
# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd
# добавляем маршрут сервер-клиент
route 10.10.100.0255.255.255.252
route 192.168.1.0255.255.255.0
# включаем TLS аутификацию
tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0
# таймаут до реконекта
tls-timeout 120
auth MD5
# включаем шифрацию пакетов
cipher BF-CBC
keepalive 10120
# сжатие трафика
comp-lzo
# максимальное кол-во клиентов
max-clients 100
user nobody
group nobody
# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun
# логирование
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
# Уровень информации для отладки
verb 3
Создаем директорию /var/log/openvpn/ и 2 файла где будут храниться логи
Переходим в директорию и создаем файл для 1 пользователя filial.p12 pkcs12 имя файла в формате PKCS #12, содержащего сертификат CA, ключ и сертификат клиента. Такой файл и команда заменяют сразу 3 соответствующих файла и команды - .ca,.cert,.key
//> cd /usr/local/share/doc/openvpn/easy-rsa/
/usr/local/share/doc/openvpn/easy-rsa/> sh
#. ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on
/usr/local/share/doc/openvpn/easy-rsa/keys/server
#
# ./build-key-pkcs12 filial
Generating a 1024 bit RSA private key
..................................++++++
.....++++++
writing new private key to 'filial.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]:RU
State or Province Name (full name) [NA]:Rostov-on-Don
Locality Name (eg, city) [BISHKEK]:Zernograd
Organization Name (eg, company) [OpenVPN-TEST]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) []:filial
Email Address [me@myhost.mydomain]:filial@localhost
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:filial
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:'RU'
stateOrProvinceName :PRINTABLE:'Rostov-on-Don'
localityName :PRINTABLE:'Zernograd'
organizationName :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName :PRINTABLE:'filial'
emailAddress :IA5STRING:'filial@localhost'
Certificate is to be certified until Jan 1719:46:382019 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
Enter Export Password:
Verifying - Enter Export Password:
# exit
Вот мы и создали 3 в 1-ом =) /usr/local/share/doc/openvpn/easy-rsa/keys/server/filial.p12
В директории /usr/local/etc/openvpn/ccd создаем файла с настройками для filial
# используемый тип устройстойства
dev tun
# Протокол
proto udp
# Удаленный IP адрес сервера OpenVPN
remote 86.ххx.ххx.xхх
# порт сервера, к которому мы будет подключаться
port 2000
# IP адрес прокси сервера и порт
#http-proxy 77.хх.хх.хх 3128
# Повтор подключение при обрыве связи
#http-proxy-retry
client
resolv-retry infinite
# Указываем путь у файлу PKCS12
pkcs12 keys/filial.p12
tls-client
# Указываем путь tls-ключу
tls-auth keys/ta.key 1
auth MD5
# включаем шифрацию пакетов
cipher BF-CBC
ns-cert-type server
# Сжатие трафика
comp-lzo
# Не перечитывать ключи после получения
persist-key
# Не закрывать и переоткрывать TUN\TAP устройства
persist-tun
# Указываем путь к логам OpenVPN
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
# Уровень информации для отладки
verb 3
Создаем директорию /var/log/openvpn/ и 2 файла где будут храниться логи
То же самое делаем для третей нашей сетки, только filial меняем на filial2. Обратите внимание, что все соединение будут идти через один интерфейс tun0 на сервере.