Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Инсталация на OpenVPN на Ubuntu или Deabian с поддръжка на IPv6

profile picture
Author
Мартин Шолев
Published
2019-06-12
Time to read
10 minutes reading time

Описание

OpenVPN е проект с отворен код, създаден от James Yonan през 2002. OpenVPN предлага високо ниво на защита използвайки point-to-point или site-to-site връзки с персонализиран протокол за сигурност.

Предварителни изисквания

  • Сървър с операционна система линукс :

    • Ubuntu 16.04|18.04|19.04
    • Debian 8|9
  • Root access

  • IP Адрес: Намерете вашият IPv4 и IPv6 адрес

IPv4 адрес

ip addr show dev eth0 | grep "inet" | awk '{ print $2 }'

Резултата трябва да бъде подобен на този:

root@ubuntu-2gb-nbg1-1:~# ip addr show dev eth0 | grep "inet" | awk '{ print $2 }'
116.203.180.222/32

IPv4 адреса е 116.203.180.222, а неговата събнет маска е /32.

IPv6 адрес

#IPv6
ip addr show dev eth0 | grep "inet6 " | awk '{ print $2 }'

Резултата трябва да бъде подобен на този:

root@ubuntu-2gb-nbg1-1:~# ip addr show dev eth0 | grep "inet6" | awk '{ print $2 }'
2a01:4f8:c2c:5fc7::1/64
fe80::9400:ff:fe27:10db/64

IPv6 адреса е 2a01:4f8:c2c:5fc7::1, а събнет маската е /64.

Вторият IPv6 адрес fe80::9400:ff:fe27:10db е мак адреса на мрежовата карта (RFC 4291)

Стъпка 1 - Инсталация и конфигуриране

Стъпка 1.1 Инсталация

Инсталиране на OpenVPN, IPTables, OpenSSL и ca-certificates пакетите.

apt-get install openvpn iptables openssl ca-certificates -y

След, като приключим с инсталацията на главните пакети, инсталираме easy-rsa.

wget -O ~/easyrsa.tgz https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz 2>/dev/null || curl -Lo ~/easyrsa.tgz https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar xzf ~/easyrsa.tgz -C ~/
mv ~/EasyRSA-v3.0.6/ /etc/openvpn/
mv /etc/openvpn/EasyRSA-v3.0.6/ /etc/openvpn/easy-rsa/
rm -f ~/easyrsa.tgz

След изтеглянето на easy-rsa трябва да създадем PKI, CA и server/client сертификати.

Внимание: Сертификата ще изтече след 3650 дни (10 години).

Внимание: По подразбиране първият генериран сертификат е с името CLIENT, може да го смените, но не използвайте специални знаци.

cd /etc/openvpn/easy-rsa/
./easyrsa init-pki
./easyrsa --batch build-ca nopass

EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-server-full server nopass
EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full CLIENT nopass
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl

Сега ще преместим сертификатите в главната папка на OpenVPN и ще сменим потребителя и групата на файловете.

cp pki/ca.crt pki/private/ca.key pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn
chown nobody:nogroup /etc/openvpn/crl.pem

След, като сме преместили сертигикатите ще генерира tls ключа за ауторизация (tls-auth), след това ще създадем DH параметри, като ще използваме готови параметри от ffdhe2048 групата.

openvpn --genkey --secret /etc/openvpn/ta.key

Готовите DHE групи са предпочитани от IETF RFC 7919, смята се, че те са по-силни срещу атаки отколкото произволно генерираните.

echo '-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
-----END DH PARAMETERS-----' > /etc/openvpn/dh.pem

Стъпка 1.2 Конфигуриране

Време е да създадем и конфигурационният файл на OpenVPN

Настройки, които е хубаво да смените:

  • port: 1194 (по подразбиране) или 443
  • proto: udp (по подразбиране) или tcp

Внимание: Поради едни или други причини порт 1194 може да бъде блокиран, затова препоръчвам да използвате порт 443, той е идеален за избягване на блокирани сайтове, понеже трафика генериран от OpenVPN изглежда почти идентичен с този на нормалният ssl(https) трафик.

Внимание: UDP протокола е по-бърз от TCP протокола, но не е надежден.

nano /etc/openvpn/server.conf
port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
auth SHA512
tls-auth /etc/openvpn/ta.key 0

topology subnet

server 10.8.0.0 255.255.255.0
local 116.203.180.222                                       #Тук слагате ipv4 адреса
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"

server-ipv6 2a01:4f8:c2c:5fc7:80::/112                      #Тук слагате ipv6 адреса
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2     #Тук слагате ipv6 адреса
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"                  #Тук слагате ipv6 адреса
push "route-ipv6 2000::/3"

Стигнахем и до DNS частта, имате няколко избора:

  1. Използване на системните DNS-си
  2. Cloudflare DNS
  3. Google DNS
  4. Quad9 DNS

Системни DNS-си

grep -v '#' /run/systemd/resolve/resolv.conf | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

Резултата трябва да е подобен

185.12.64.1
185.12.64.2

Hetzner (по подразбиране) DNS

IPV4:
    Главен          DNS: 185.12.64.1
    Алтернативен    DNS: 185.12.64.2
IPV6
    Главен          DNS: 2a01:4ff:ff00::add:1
    Алтернативен    DNS: 2a01:4ff:ff00::add:2

Cloudflare DNS

IPV4:
    Главен          DNS: 1.1.1.1
    Алтернативен    DNS: 1.0.0.1
IPV6
    Главен          DNS: 2606:4700:4700::1111
    Алтернативен    DNS: 2606:4700:4700::1001

Google DNS

IPV4:
    Главен          DNS: 8.8.8.8
    Алтернативен    DNS: 8.8.4.4
IPV6
    Главен          DNS: 2001:4860:4860::8888
    Алтернативен    DNS: 2001:4860:4860::8844

Quad9 DNS

IPV4:
    Главен          DNS: 9.9.9.9
    Алтернативен    DNS: 149.112.112.112
IPV6
    Главен          DNS: 2620:fe::fe
    Алтернативен    DNS: 2620:fe::9

Добавете DNS сървърите в края на файла.

Внимание: Трябва да ползвате всичките DNS сървъри (ipv4 и ipv6), първият DNS сървър е главният, а втория е алтернативен.

nano /etc/openvpn/server.conf
push "dhcp-option DNS SELECTED-DNS-PROVIDER"
push "dhcp-option DNS SELECTED-DNS-PROVIDER"

След, като сме приключили с DNS частта, е време да продължим с остатъка от конфигурационният файл.

nano /etc/openvpn/server.conf

Добавете остатъка от конфигурационният файл в края.

keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
client-to-client
status /etc/openvpn/openvpn-status.log
verb 3
crl-verify /etc/openvpn/crl.pem

Добавяне на конфигурацията в защитната стена.

Ако ползвате firewalld:

# Няма да използваме --add-service=openvpn защото е възможно да ползват друг порт или протокол, които не е по подразбиране
firewall-cmd --zone=public --add-port=1194/udp
firewall-cmd --zone=trusted --add-source=10.8.0.0/24
firewall-cmd --permanent --zone=public --add-port=1194/udp
firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24
# Задаване на NAT за подмрежата на VPN-на
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to SERVER_IP
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to SERVER_IP
firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD_direct 0 -i tun0 -o eth0 -j ACCEPT

Ако използвате iptables

iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
#Внимание: Ако използвате tcp протокола трябва да смените -p udp на -p tcp и --ddport 1194 на --ddport 443
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

#Внимание: Ако използвате tcp протокола трябва да смените -p udp на -p tcp и --ddport 1194 на --ddport 443
ip6tables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
ip6tables -A INPUT -i tun0 -j ACCEPT
ip6tables -A FORWARD -i tun0 -o eth0 -s 2a01:4f8:c2c:5fc7:80::/112 -m state --state NEW -j ACCEPT

Запазване на iptables

iptables-save > /etc/iptables.rules
ip6tables-save > /etc/ip6tables.rules

Създаване на темплейта за клиентската конфигурация.

nano  /etc/openvpn/client.txt

Добавете цялата конфигурация, като сложите ип адреса на сървъра

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
tun-mtu 1500
mssfix 1420
remote 116.203.180.222 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
auth-nocache
cipher AES-256-CBC
setenv opt block-outside-dns
key-direction 1
verb 3

Накрая цялата конфигурация на OpenVPN сървъра трябва да изглежда подобно:

Покажи server.conf файла

port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
auth SHA512
tls-auth /etc/openvpn/ta.key 0

topology subnet

server 10.8.0.0 255.255.255.0
local 116.203.180.222                                   #Тук слагате ipv4 адреса
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"

#ipv6 support
server-ipv6 2a01:4f8:c2c:5fc7:80::/112                  #Тук слагате ipv6 адреса
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2 #Тук слагате ipv6 адреса
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"              #Тук слагате ipv6 адреса
push "route-ipv6 2000::/3"
push "dhcp-option DNS 2606:4700:4700::1111"
push "dhcp-option DNS 2606:4700:4700::1001"


keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
client-to-client
status /etc/openvpn/openvpn-status.log
verb 3
crl-verify /etc/openvpn/crl.pem

Стъпка 1.3 (Незадължително)

Повечето виртуални сървъри са с изключен IPv4/IPv6 packet forwarding, за да го включите редактирайте следният файл /etc/sysctl.conf.

nano /etc/sysctl.conf

Потърсете за следните редове:

# Махнете коментара(хаштага), за да вкючите IPv4 packet forwarding
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

# Махнете коментара(хаштага), за да вкючите IPv6 packet forwarding
#net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1

След това изпълнете следната команда

sysctl -p.

Стъпка 2 - Създаване на нов потребител в OpenVPN

Създаването на нов потребител е кошмар, затова ще създадем скрипт, който ще има две опции:

  1. Създаване на потребител
  2. Премахване на потребител
cd ~
nano openvpn-user-manager.sh
#!/usr/bin/env bash

if readlink /proc/$$/exe | grep -q "dash"; then
	echo "Пуснете скрипта през bash, а не през sh."
	exit
fi

if [[ "$EUID" -ne 0 ]]; then
	echo "Трябва да пуснете скрипта с root права"
	exit
fi

newclient () {
	cp /etc/openvpn/client.txt ~/$1.ovpn
	echo "<ca>" >> ~/$1.ovpn
	cat /etc/openvpn/easy-rsa/pki/ca.crt >> ~/$1.ovpn
	echo "</ca>" >> ~/$1.ovpn
	echo "<cert>" >> ~/$1.ovpn
	sed -ne '/BEGIN CERTIFICATE/,$ p' /etc/openvpn/easy-rsa/pki/issued/$1.crt >> ~/$1.ovpn
	echo "</cert>" >> ~/$1.ovpn
	echo "<key>" >> ~/$1.ovpn
	cat /etc/openvpn/easy-rsa/pki/private/$1.key >> ~/$1.ovpn
	echo "</key>" >> ~/$1.ovpn
	echo "<tls-auth>" >> ~/$1.ovpn
	sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/ta.key >> ~/$1.ovpn
	echo "</tls-auth>" >> ~/$1.ovpn
}

if [[ -e /etc/openvpn/server.conf ]]; then
	while :
	do
	clear
		echo "OpenVPN е инсталиран"
		echo
		echo "Какво искате да направите?"
		echo "   1) Създаване на потребител"
		echo "   2) Премахване на потребител"
		echo "   3) Изход"
		read -p "Изберете опция от [1-3]: " option
		case $option in
			1)
			echo
			echo "Моля, не използвайте специални символи, а само ясни думи."
			read -p "Име на клиента: " -e CLIENT
			cd /etc/openvpn/easy-rsa/
			EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full $CLIENT nopass
			# Създаване на файла client.ovpn
			newclient "$CLIENT"
			echo
			echo "Потребителя $CLIENT е създаден успешно, конфигурационният файл се намира на:" ~/"$CLIENT.ovpn"
			exit
			;;
			2)
			NUMBEROFCLIENTS=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep -c "^V")
			if [[ "$NUMBEROFCLIENTS" = '0' ]]; then
				echo
				echo "Не успяхме да намерим съществуващи потребители!!"
				exit
			fi
			echo
			echo "Изберете съществуващ клиентски сертификат, който искате да премахнете:"
			tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
			if [[ "$NUMBEROFCLIENTS" = '1' ]]; then
				read -p "Изберете един клиент [1]: " CLIENTNUMBER
			else
				read -p "Изберете един клиент [1-$NUMBEROFCLIENTS]: " CLIENTNUMBER
			fi
			CLIENT=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | sed -n "$CLIENTNUMBER"p)
			echo
			read -p "Найстина ли желаете да премахнте достъпа на $CLIENT? [y/N]: " -e REVOKE
			if [[ "$REVOKE" = 'y' || "$REVOKE" = 'Y' ]]; then
				cd /etc/openvpn/easy-rsa/
				./easyrsa --batch revoke $CLIENT
				EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
				rm -f pki/reqs/$CLIENT.req
				rm -f pki/private/$CLIENT.key
				rm -f pki/issued/$CLIENT.crt
				rm -f /etc/openvpn/crl.pem
				cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
				chown nobody:nogroup /etc/openvpn/crl.pem
				echo
				echo "Сертификата на $CLIENT е премахнат!"
			else
				echo
				echo "Премахването на сертификата е спряно!"
			fi
			exit
			;;
			3)
			exit
			;;
        esac
	done
else
    clear
    echo "Няма открита инсталация на OpenVPN."
    echo "Инсталирайте първо OpenVPN"
        echo "https://community.hetzner.com/tutorials/install-and-configure-openvpn-on-ubuntu-and-debian"
fi

Задайте права на файла:

chmod 755 ~/root/openvpn-user-manager.sh

Note: Ако не можете да се свържете с OpenVPN сървъра рестартирайте виртуалната машина.

Ако проблема продължава и след рестартиране на виртуалната машина, прегледайте стъпка 1.3

Стъпка 3 - Използване на OpenVPN User Manager (openvpn-user-manager.sh)

Стартирайте скрипта:

bash openvpn-user-manager.sh

Резултата трябва да бъде подобен на този:

OpenVPN е инсталиран.

Какво искате да направите?
   1) Създаване на потребител
   2) Премахване на потребител
   3) Изход
Изберете опция [1-3]:

Резултат

Вашият OpenVPN сървър е готов. Вече може да браузвате в интернет безпроблемно и анонимно.

Лиценз: MIT
Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue

Discover our

Dedicated Servers

Get €20/$20 free credit!

Valid until: 31 December 2026 Valid for: 3 months and only for new customers
Configure now
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more