Установка OpenVPN сервера на CentOS 6 и правило в ip-tables
Установка OpenVPN сервера на CentOS 6
Настройка приватного VPN сервера на базе OpenVPN в CentOS 6
Проверяем наличие устройства tun
[root@dev-server /]# file /dev/net/tun
/dev/net/tun: character special |
Установка EPEL-репозитория
yum install epel-release |
Устанавливаем OpenVPN
Устанавливаем пакет openvpn
из репозитория EPEL.
yum -y install openvpn easy-rsa |
Добавляем в автозапуск
chkconfig openvpn on |
Создаем файл конфигурации
cp /usr/share/doc/openvpn-2.3.6/sample/sample-config-files/server.conf /etc/openvpn/ |
Конфигурация OpenVPN
nano /etc/openvpn/server.conf |
Указываем на каком IP будет работать OpenVPN сервер (тут 192.168.1.100
– внешний IP сервера):
# Which local IP address should OpenVPN
# listen on? (optional)
local 192.168.1.100 |
Задаём OpenVPN сеть
# 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 10.0.0.0 255.255.255.0 |
Передаём параметр клиентам, благодаря которому весь их трафик будет направляться через OpenVPN
# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
push "redirect-gateway def1 bypass-dhcp" |
Теперь зададим DNS-сервера для клиентов:
# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses. CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
push "dhcp-option DNS 10.0.0.1"
push "dhcp-option DNS 8.8.8.8" |
Изменим пользователя, под которым будет работать OpenVPN демон:
# 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 |
Меняем настройки логирования:
# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
status /var/log/openvpn-status.log
...
# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
# the "Program FilesOpenVPNlog" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it. Use one
# or the other (but not both).
;log openvpn.log
log-append /var/log/openvpn.log |
Все готово.
Сохраняем и выходим.
Создание сертификатов для OpenVPN сервера
Для начала создадим директорию для сертификатов:
mkdir -p /etc/openvpn/easy-rsa/keys |
Скопируем необходимые файлы:
cp -r /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/ |
Для удобства отредактируем параметры, чтобы не вводить их при генерации сертификатов /etc/openvpn/easy-rsa/vars
:
export KEY_COUNTRY="RU"
export KEY_PROVINCE="NW"
export KEY_CITY="Moscow"
export KEY_ORG="OrgName"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
# X509 Subject Field
export KEY_NAME="EasyRSA" |
Генерируем сертификаты
Переходим в созданную нами директорию для сертификатов
cd /etc/openvpn/easy-rsa |
Перечитаем файл vars
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys |
Удаляем старые ключи:
./clean-all |
Создаём корневой сертификат:
./build-ca |
После этого шага в каталоге /etc/openvpn/easy-rsa/keys
появляются новые CA
(Central Authority) сертификаты:
./build-ca
Generating a 2048 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) [RU]:
State or Province Name (full name) [NW]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [OrgName]:
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:
Common Name (eg, your name or your server's hostname) [server]:vpn.example.com
Name [EasyRSA]: |
-rw-r--r--. 1 root root 1,8K Апр 21 15:43 ca.crt -rw-------. 1 root root 1,7K Апр 21 15:43 ca.key |
Далее создаём корневой сертификат для самого сервера:
./build-key-server server
Generating a 2048 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) [RU]:
State or Province Name (full name) [NW]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [OrgName]:
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:
Common Name (eg, your name or your server's hostname) [server]:vpn.example.com
Name [EasyRSA]:
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'NW'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'OrgName'
organizationalUnitName:PRINTABLE:'MyOrganizationalUnit'
commonName :PRINTABLE:'vpn.example.com'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Apr 18 12:43:37 2025 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, 2048 bit long safe prime, generator 2 This is going to take a long time ..............................................+......+................................................+.........................................................................................................................................................+............................................................................................................+..............................................................................................................................................+...................................................................................................+........+.............................................................................................................+............ |
Процесс занимает от 2 до 5 минут. Можно выпить чашечку кофе.
Приступим к созданию клиентских сертификатов – повторяем отдельно для каждого клиента:
./build-key client
Generating a 2048 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) [RU]:
State or Province Name (full name) [NW]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [OrgName]:
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:
Common Name (eg, your name or your server's hostname) [client]:
Name [EasyRSA]:
Email Address [me@myhost.mydomain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'NW'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'OrgName'
organizationalUnitName:PRINTABLE:'MyOrganizationalUnit'
commonName :PRINTABLE:'client'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Apr 18 12:57:59 2025 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 |
Поскольку сертификаты будут храниться у клиентов, то лучше на данных пунктах задать имя и пароль:
A challenge password []:
An optional company name []:
Скопируем ключи
ls -l /etc/openvpn/easy-rsa/keys итого 84 -rw-r--r--. 1 root root 5669 Апр 21 15:43 01.pem -rw-r--r--. 1 root root 5516 Апр 21 15:58 02.pem -rw-r--r--. 1 root root 1830 Апр 21 15:43 ca.crt -rw-------. 1 root root 1704 Апр 21 15:43 ca.key -rw-r--r--. 1 root root 5516 Апр 21 15:58 client.crt -rw-r--r--. 1 root root 1184 Апр 21 15:57 client.csr -rw-------. 1 root root 1704 Апр 21 15:57 client.key -rw-r--r--. 1 root root 424 Апр 21 15:46 dh2048.pem -rw-r--r--. 1 root root 307 Апр 21 15:58 index.txt -rw-r--r--. 1 root root 21 Апр 21 15:58 index.txt.attr -rw-r--r--. 1 root root 21 Апр 21 15:43 index.txt.attr.old -rw-r--r--. 1 root root 161 Апр 21 15:43 index.txt.old -rw-r--r--. 1 root root 3 Апр 21 15:58 serial -rw-r--r--. 1 root root 3 Апр 21 15:43 serial.old -rw-r--r--. 1 root root 5669 Апр 21 15:43 server.crt -rw-r--r--. 1 root root 1115 Апр 21 15:43 server.csr -rw-------. 1 root root 1704 Апр 21 15:43 server.key |
cd keys/
cp dh2048.pem ca.crt server.crt server.key /etc/openvpn |
Настройка роутинга и запуск OpenVPN сервера
Добавим правила iptables
iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT iptables -I FORWARD -i eth0 -o tun0 -j ACCEPT iptables -I FORWARD -i tun0 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.100 |
Тут предполагается что внешний интерфейс – eth0
с IP 192.168.1.100
, а сеть для клиентов OpenVPN – 10.0.0.0/24
.
Предлагаю использовать MASQUERADE
вместо SNAT
.
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE |
# service iptables status
...
Table: nat
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 SNAT all -- 10.0.0.0/24 0.0.0.0/0 to:192.168.2.100
2 SNAT all -- 10.0.0.0/24 0.0.0.0/0 to:192.168.2.100
3 MASQUERADE all -- 10.0.0.0/24 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:1194
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination |
Теперь добавим IP Forwarding
в ядро:
nano /etc/sysctl.conf |
И изменим параметр net.ipv4.ip_forward
с 0
на 1
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 |
Перезагружаем настройки sysctl
sysctl -p /etc/sysctl.conf |
Запускаем OpenVPN сервер:
# service openvpn start
Starting openvpn: [ OK ] |
Проверяем лог-файл
# tail -f /var/log/openvpn.log
Tue Apr 21 16:02:06 2015 OpenVPN 2.3.6 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Dec 2 2014
Tue Apr 21 16:02:06 2015 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.03
Tue Apr 21 16:02:06 2015 Diffie-Hellman initialized with 2048 bit key
Tue Apr 21 16:02:06 2015 Socket Buffers: R=[124928->131072] S=[124928->131072]
Tue Apr 21 16:02:06 2015 ROUTE_GATEWAY XX.XX.XX.XX
Tue Apr 21 16:02:06 2015 TUN/TAP device tun0 opened
Tue Apr 21 16:02:06 2015 TUN/TAP TX queue length set to 100
Tue Apr 21 16:02:06 2015 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Tue Apr 21 16:02:06 2015 /sbin/ip link set dev tun0 up mtu 1500
Tue Apr 21 16:02:06 2015 /sbin/ip addr add dev tun0 local 10.0.0.1 peer 10.0.0.2
Tue Apr 21 16:02:06 2015 /sbin/ip route add 10.0.0.0/24 via 10.0.0.2
Tue Apr 21 16:02:06 2015 GID set to nobody
Tue Apr 21 16:02:06 2015 UID set to nobody
Tue Apr 21 16:02:06 2015 UDPv4 link local (bound): [AF_INET]192.168.2.100:1194
Tue Apr 21 16:02:06 2015 UDPv4 link remote: [undef]
Tue Apr 21 16:02:06 2015 MULTI: multi_init called, r=256 v=256
Tue Apr 21 16:02:06 2015 IFCONFIG POOL: base=10.0.0.4 size=62, ipv6=0
Tue Apr 21 16:02:06 2015 IFCONFIG POOL LIST
Tue Apr 21 16:02:06 2015 Initialization Sequence Completed |
# ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.0.0.1 P-t-P:10.0.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:10368 errors:0 dropped:0 overruns:0 frame:0
TX packets:17505 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:2016895 (1.9 MiB) TX bytes:18911882 (18.0 MiB) |
netstat -tupln | grep openvpn udp 0 0 192.168.2.100:1194 0.0.0.0:* 11804/openvpn |
Сервер запущен. Готово.
Настройка клиента осуществляется для каждой системы по-своему.
Не забываем скопировать клиентские сертификаты.
Безболезненное обновление версии CentOS с 6 до версии 7.
Настройка OpenVPN на CentOS 6.x (6,3)
Не знаю по какой причине, но в версии CentOS 6.x отсутствует такой чудесный пакет как OpenVPN. А он частенько бывает нам необходим. К счастью существует достаточно дополнительных репозитариев, где все это есть.
Итак, приступим.
Первым делом подключим репозитарий, в котором есть наш пакет. В моем примере это будет repoforge.
Заходим в консоль сервера, например, в папку /root, скачиваем необходимый нам rpm пакет, содержащий установку rpmforge и устанавливаем его:
# cd /root
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
# rpm -ivh rpmforge-release-0.5.2-2.el6.rf.i686.rpm
Далее, необходимо проверить установлен и активен ли у нас tun/tap интерфейс:
# sudo cat /dev/net/tun
В результате выполнения этой команды, должно появиться сообщение вида
# cat: /dev/net/tun: File descriptor in bad state
Это значит что с интерфейсом все нормально.
Далее устанавливаем, собственно, сам OpenVPN:
# yum install openvpn
А вот дальше начинается самое интересное. Нам нужно сгенерировать ключи для OpenVPN. Для этого копируем соответствующий инструментарий в /etc/openvpn:
# cp -r /usr/share/doc/openvpn-2.2.2/easy-rsa/ /etc/openvpn/
Затем необходимо немного изменить файл vars, чтоб он правильно работал в CentOS 6.3. Открываем файл /etc/openvpn/easy-rsa/2.0/vars в любимом редакторе и правим:
# vi /etc/openvpn/easy-rsa/2.0/vars
меняем строку 29 с:
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
на:
export KEY_CONFIG=/etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf
Сохраняемся и выходим.
Далее генерируем ключи:
# chmod 755 /etc/openvpn/easy-rsa/2.0/*
#cd /etc/openvpn/easy-rsa/2.0
# source /etc/openvpn/easy-rsa/2.0/vars
# /etc/openvpn/easy-rsa/2.0/clean-all
# chmod 755 /usr/share/doc/openvpn-2.2.2/easy-rsa/2.0/pkitool
# /etc/openvpn/easy-rsa/2.0/build-ca
# /etc/openvpn/easy-rsa/2.0/build-key-server server
# /etc/openvpn/easy-rsa/2.0/build-dh
# /etc/openvpn/easy-rsa/2.0/build-key client1
# /etc/openvpn/easy-rsa/2.0/build-key client2
Копируем полученные ключи в папку /etc/openvpn
cp -r /etc/openvpn/easy-rsa/2.0/keys/* /etc/openvpn/
и конфигурационный файл server.conf туда же:
cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn/
Правим его.
Ниже приведу мой конфиг:
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
comp-lzo
max-clients 5
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 0
Теперь включаем форвард в ядре. Для этого изменяем в файле /etc/sysctl.conf
# vi /etc/sysctl.conf
строку
net.ipv4.ip_forward = 0
на строку:
net.ipv4.ip_forward = 1
После этого включаем трансляцию адресов NAT чтобы пакеты от клиентской машины попадая на наш выделенный сервер могли уйти в Интернет, ну и, соответственно, возвращались назад.
/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Для VPS на базе OpenVZ команда выглядит так:
/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to-source xxx.xxx.xxx.xxx
где xxx.xxx.xxx.xxx - это Ip адрес сетевого интерфейса вашего VPS.
Сохраняем конфиг iptables:
iptables-save > /etc/sysconfig/iptables
Перезагружаем OpenVPN и радуемся настроенному VPN.
# service openvpn restart
Более подробно о настройке OpenVPN я писал статье Установка и настройка OpenVPN в CentOS 4. Здесь же описаны основные шаги по установке пакета под centos 6.x
Постоянная ссылка на статью Настройка OpenVPN на CentOS 6.x
Увы, но этот мануал совсем не
Увы, но этот мануал совсем не соответствует реалиям :(
1. Например, команда
# sudo cat /dev/net/tun
выдает:
cat: /dev/net/tun: Операция не позволяется
Или это так и должно быть? Вы вообще не написали, что же должна выдавать эта ваша команда в случае наличия или отсутствия tun.
2. Или:
> А вот дальше начинается самое интересное. Нам нужно сгенерировать ключи для OpenVPN.
> Для этого копируем соответствующий инструментарий в /etc/openvpn:
> # cp -r /usr/share/doc/openvpn-2.2.2/easy-rsa/ /etc/openvpn/
- а вот нету этого каталога .../easy-rsa/ в системе и все тут! И что дальше?
3. Идем дальше:
> Затем необходимо немного изменить файл vars, чтоб он правильно работал в CentOS 6.3.
> Открываем файл /etc/openvpn/easy-rsa/2.0/vars в любимом редакторе и правим:
# vi /etc/openvpn/easy-rsa/2.0/vars
меняем строку 29 с:
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
на:
export KEY_CONFIG=/etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf
Оч интерсное заявление! Получается, что создатели OpenVPN дураки, и лишь один автор статьи Д'Артаньян и нашел ошибку, и знает как ее исправить?
То хотя бы объяснил тогда, почему именно так, а не иначе, нужно исправлять эту строку, потому что никакой связи с версией 6.3 в этих строках не наблюдается.
А если бы версия была 6.5 или 6.6, тогда как - для каждой подверсии CentOS создавать свой уникальный мануал по установке???
Уважаемый автор, если вы уж производится какие-то свои шаманства, то хотя бы потрудитесь пояснять, почему именно так вы делаете.
И т.д. и т.п. В-общем, статья написана наспех и содержит ряд погрешностей и недомолвок.
С ее помощью мне так и не удалось установить OpenVPN на CentOS 6.6.
И что самое противное, что все подобные статьи на эту же тему не похожи друг друга.
Отсюда возникает печальный чисто философский вопрос: почему заурядная установка сервера OpenVPN разными авторами реализуется по разному?
Во-первых, это как минимум, свидетельствует об отсутствии унификации подхода (а его многообразие в таком деле и нахрен не нужно), во-вторых, это вызывает недоверие к каждому из этих авторов, которые мутят на свой лад и соответственно своему уровню подготовки.
Должен быть единый унифицированный и понятный подход, а не нужно оригинальничать - это вызывает только ошибки и недоумение.
В моей заметке речь шла о Centos 6.3
С тех пор вышло значительное количество обновлений для пакета openvpn.
Там есть изменения. Например необходимо доустанавливать пакет easy-rsa, который теперь по умолчанию не входит в пакет openvpn. Соответственно и пути для файлов меняются.
Источник: http://dedicatesupport.com/content/nastroika-openvpn-na-centos-6x