Описание
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 частта, имате няколко избора:
- Използване на системните DNS-си
- Cloudflare DNS
- Google DNS
- 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
Създаването на нов потребител е кошмар, затова ще създадем скрипт, който ще има две опции:
- Създаване на потребител
- Премахване на потребител
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 сървър е готов. Вече може да браузвате в интернет безпроблемно и анонимно.