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

Configure your dream server. Top performance with an excellent connection at an unbeatable price!

Want to contribute?

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

Find out more