Openvpn сервер в gentoo

Опубликовано NowhereMan - пт, 01/08/2016 - 16:45

Потребовалось однажды настроить VPN на сервере, дабы просто и без лишних сложностей с пробросом портов через ssh и выпячиванием в интернет разных ненужных там сервисов вроде SQL, иметь доступ ко всем его ресурсам. Самым известным и популярным решением для этого является openvpn, его-то я и решился завести. На сервере (а там gentoo, да) будет запущен, соответственно, сервер, авторизующий клиентов по ключам и пускающий их во внутреннюю маршрутизируемую подсеть класса C (да, 192.168.100.0/24 нам вполне будет достаточно и притаскивать 10.0.0.0/8 для сеточки на полтора клиента мы не станем).

Для начала проверяем use-флаги и собираем openvpn. Из флагов нам понадобятся lzo для поддержки компрессии трафика этим методом, ssl для шифрования и examples для установки дополнительных примеров конфигурации и документации. plugins и pam, который он тянет за собой, я отключил за ненадобностью в данном конкретном случае. Накрутив флаги, собираем:

emerge -av openvpn

Если все прошло как надо - приступаем к настройке.

Первое, что нам понадобится - создать инфраструктуру ключей (PKI) для сервера. В статье все достаточно подробно и пошагово расписано, но для тех, кому лень читать заграничный текст, я перевел ее тут, так что делаем как сказано. На выходе мы получаем необходимый набор ключей для сервера и клиентов. Каталог, в котором мы плодили ключи, оставляем себе на будущее - вдруг еще одному клиенту надо будет дать ключ, или обновить ключи после старения... Весь полученный набор копируем серверу в /etc/openvpn/keys.

Теперь серверу надо сделать конфиг. Никакого примера в поставке не идет, но я не забыл включить флаг examples и в /usr/share/doc/openvpn-2.3.8/ у меня есть каталог examples с примерами конфигов и прочего на все случаи жизни. Оттуда мы берем  server.conf.bz2:

bzcat /usr/share/doc/openvpn-2.3.8/examples/sample/sample-config-files/server.conf.bz2 > /etc/openvpn/openvpn.conf

и начинаем править его для собственных нужд.

#################################################
# Sample OpenVPN 2.0 config file for            #
# multi-client server.                          #
#                                               #
# This file is for the server side              #
# of a many-clients <-> one-server              #
# OpenVPN configuration.                        #
#                                               #
# OpenVPN also supports                         #
# single-machine <-> single-machine             #
# configurations (See the Examples page         #
# on the web site for more info).               #
#                                               #
# This config should work on Windows            #
# or Linux/BSD systems.  Remember on            #
# Windows to quote pathnames and use            #
# double backslashes, e.g.:                     #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
#                                               #
# Comments are preceded with '#' or ';'         #
#################################################

# Which local IP address should OpenVPN
# listen on? (optional)
;local a.b.c.d

# Which TCP/UDP port should OpenVPN listen on?
# If you want to run multiple OpenVPN instances
# on the same machine, use a different port
# number for each one.  You will need to
# open up this port on your firewall.
port 1294

; выберем нестандартный порт, чтобы китайцам
; было сложнее

# TCP or UDP server?
;proto tcp
proto udp

; современные каналы связи не так плохи,
; можно использовать и udp, будет чуть быстрее

# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
# Use "dev tap0" if you are ethernet bridging
# and have precreated a tap0 virtual interface
# and bridged it with your ethernet interface.
# If you want to control access policies
# over the VPN, you must create firewall
# rules for the the TUN/TAP interface.
# On non-Windows systems, you can give
# an explicit unit number, such as tun0.
# On Windows, use "dev-node" for this.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun

# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key).  Each client
# and the server must have their own cert and
# key file.  The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys.  Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca keys/ca.crt
cert keys/example.crt
key keys/example.key  # This file should be kept secret

; тут пишем созданные нами только что ключи и сертификаты,
; не забыв про каталог keys в котором они лежат.

# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh2048.pem 2048
dh keys/dh2048.pem

; тут тоже надо поправить каталог.

# Network topology
# Should be subnet (addressing via IP)
# unless Windows clients v2.0.9 and lower have to
# be supported (then net30, i.e. a /30 per client)
# Defaults to net30 (not recommended)
topology subnet

# Configure server mode and supply a VPN subnet
# for OpenVPN to draw client addresses from.
# The server will take 10.8.0.1 for itself,
# the rest will be made available to clients.
# Each client will be able to reach the server
# on 10.8.0.1. Comment this line out if you are
# ethernet bridging. See the man page for more info.
server 192.168.100.0 255.255.255.240

; Тут указывается подсеть, сервер автоматически возьмет себе первый адрес.

# Maintain a record of client <-> virtual IP address
# associations in this file.  If OpenVPN goes down or
# is restarted, reconnecting clients can be assigned
# the same virtual IP address from the pool that was
# previously assigned.
ifconfig-pool-persist ipp.txt

# Uncomment this directive to allow different
# clients to be able to "see" each other.
# By default, clients will only see the server.
# To force clients to only see the server, you
# will also need to appropriately firewall the
# server's TUN/TAP interface.
client-to-client

; Здесь раскомментируем, если нужна связь клиент-клиент,
; в противном случае будет только клиент-сервер.

# Uncomment this directive if multiple clients
# might connect with the same certificate/key
# files or common names.  This is recommended
# only for testing purposes.  For production use,
# each client should have its own certificate/key
# pair.
#
# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE "COMMON NAME",
# UNCOMMENT THIS LINE OUT.
;duplicate-cn

; Тут можно раскомментировать, если лень делать сертификаты на всех клиентов - 
; будет возможно заходить множеству клиентов по одному сертификату.

# The keepalive directive causes ping-like
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
;tls-auth ta.key 0 # This file is secret

# Select a cryptographic cipher.
# This config item must be copied to
# the client config file as well.
;cipher BF-CBC        # Blowfish (default)
cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES

; Тут выбирается метод шифрования.
; На клиенте должен быть прописан такой же.

# Enable compression on the VPN link.
# If you enable it here, you must also
# enable it in the client config file.
comp-lzo yes

; включение сжатия. Есть варианты yes, no и adaptive -
; соответственно включено всегда, выключено всегда и
; автоматический выбор по мере надобности

# The maximum number of concurrently connected
# clients we want to allow.
max-clients 14

; Максимальное количество клиентов

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
user nobody
group nobody

# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun

# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
status openvpn-status.log


# Set the appropriate level of log
# file verbosity.
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3

Вот примерно так это должно выглядеть.

Теперь осталось сделать конфиг для клиента. Возьмем его оттуда же из примеров и поправим на свой вкус:

bzcat /usr/share/doc/openvpn-2.3.8/examples/sample/sample-config-files/client.conf.bz2 > ~/openvpn.conf

 

##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server.     #
#                                            #
# This configuration can be used by multiple #
# clients, however each client should have   #
# its own cert and key files.                #
#                                            #
# On Windows, you might want to rename this  #
# file so it has a .ovpn extension           #
##############################################

# Specify that we are a client and that we
# will be pulling certain config file directives
# from the server.
client

# Use the same setting as you are using on
# the server.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun

# Windows needs the TAP-Win32 adapter name
# from the Network Connections panel
# if you have more than one.  On XP SP2,
# you may need to disable the firewall
# for the TAP adapter.
;dev-node MyTap

# Are we connecting to a TCP or
# UDP server?  Use the same setting as
# on the server.
;proto tcp
proto udp

; Тут не забыть вписать то же, что и в клиенте

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 8.8.8.8 1294
;remote my-server-2 1194

; Указываем адрес и порт сервера, к которому мы будем подключаться.

# Keep trying indefinitely to resolve the
# host name of the OpenVPN server.  Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite

# Most clients don't need to bind to
# a specific local port number.
nobind

# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nobody

; Здесь стоит раскомментировать, но только для невиндовых клиентов.

# Try to preserve some state across restarts.
persist-key
persist-tun

# If you are connecting through an
# HTTP proxy to reach the actual OpenVPN
# server, put the proxy server/IP and
# port number here.  See the man page
# if your proxy server requires
# authentication.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

; Можно вписать прокси

# Wireless networks often produce a lot
# of duplicate packets.  Set this flag
# to silence duplicate packet warnings.
;mute-replay-warnings

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
ca keys//ca.crt
cert keys//nowhereman.crt
key keys//nowhereman.key

; тут прописываем открытый ключ и сертификаты клиента.

# Verify server certificate by checking that the
# certicate has the correct key usage set.
# This is an important precaution to protect against
# a potential attack discussed here:
#  http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the keyUsage set to
#   digitalSignature, keyEncipherment
# and the extendedKeyUsage to
#   serverAuth
# EasyRSA can do this for you.
remote-cert-tls server

# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
cipher AES-128-CBC

; Метод шифрования. Должен быть таким же как и на сервере.

# Enable compression on the VPN link.
# Don't enable this unless it is also
# enabled in the server config file.
comp-lzo yes

; Сжатие. Должно быть таким же как на сервере.

# Set log file verbosity.
verb 4

Вот, собственно, и все. Остается закинуть клиенту файлики ca.crt, client1.crt, client1.key и созданный конфиг, и можно подключаться.

Да. Для виндовой версии конфиг надо переименовать в openvpn.ovpn.

Теги