Как установить OpenVPN в Ubuntu или Debian с поддержкой IPv6

Введение

OpenVPN - это проект с открытым исходным кодом, созданный Джеймсом Йонаном и выпущенный еще в 2002 году. OpenVPN обеспечивает высокий уровень безопасности, используя двухточечные или межсетевые соединения с настраиваемым протоколом безопасности.
Этот учебник основан на Ubuntu 16.04 | 18.04 | 19.04 и Debian 8 | 9
Предпосылки
  • Сервер с операционной системой Linux:
    • Ubuntu 16.04 | 18.04 | 19.04
    • Debian 8 | 9
  • Корневой доступ
  • 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 - это MAC-адрес ( 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 и сервер / клиент
Примечание: срок действия сертификатов истекает через 3650 дней (10 лет), вы можете изменить стоимость.
Примечание. Вы можете изменить имя сертификата клиента (КЛИЕНТА), но не используйте специальные символы.
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.
Настройки, которые вы можете изменить:
  • порт: 1194 (по умолчанию) или 443
  • proto: udp (по умолчанию) или tcp
Примечание: лучше изменить порт, потому что порт 1194 OpenVPN может быть заблокирован. Кроме того, порт 443 идеально подходит для избежания цензуры, поскольку трафик OpenVPN выглядит идентично обычному трафику SSL.
Примечание: протокол 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                                       #Here you should add the server ipv4 address
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"

server-ipv6 2a01:4f8:c2c:5fc7:80::/112                      #Here you should add the server ipv6 address
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2     #Here you should add the server ipv6 address
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"                  #Here you should add the server ipv6 address
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}'
Вывод должен быть похож на это:
213.133.98.98
213.133.99.99
213.133.100.100
Хецнер (по умолчанию) DNS
IPV4:
    Primary     DNS: 213.133.98.98
    Alternative DNS: 213.133.99.99
    Alternative DNS: 213.133.100.100
IPV6
    Primary     DNS: 2a01:4f8:0:1::add:9898
    Alternative DNS: 2a01:4f8:0:1::add:9999
    Alternative DNS: 2a01:4f8:0:1::add:1010
Cloudflare DNS
IPV4:
    Primary     DNS: 1.1.1.1
    Alternative DNS: 1.0.0.1
IPV6
    Primary     DNS: 2606:4700:4700::1111
    Alternative DNS: 2606:4700:4700::1001
Google DNS
IPV4:
    Primary     DNS: 8.8.8.8
    Alternative DNS: 8.8.4.4
IPV6
    Primary     DNS: 2001:4860:4860::8888
    Alternative DNS: 2001:4860:4860::8844
Quad9 DNS
IPV4:
    Primary     DNS: 9.9.9.9
    Alternative DNS: 149.112.112.112
IPV6
    Primary     DNS: 2620:fe::fe
    Alternative DNS: 2620:fe::9
После того, как вы выберете DNS провайдера, добавьте их в конец файла.
Примечание. Необходимо добавить оба DNS-сервера (IPv4 и IPv6), первый из которых является основным DNS-сервером, а второй - альтернативным 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:
# We are not going to use --add-service=openvpn because that would only work with default port and protocol
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
# Set NAT for the VPN subnet
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
#Note: If you use tcp protocol you must change -p udp to -p tcp and --ddport 1194 to --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

#Note: If you use tcp protocol you must change -p udp to -p tcp and --ddport 1194 to --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               #Here you should add the server ipv4 address
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  #Here you should add the server ipv6 address
tun-ipv6
push tun-ipv6
ifconfig-ipv6 2a01:4f8:c2c:5fc7::1 2a01:4f8:c2c:5fc7::2 #Here you should add the server ipv6 address
push "route-ipv6 2a01:4f8:c2c:5fc7:2::/64"               #Here you should add the server ipv6 address
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 (необязательно)

Некоторые VPS с отключенной пересылкой пакетов IPv4 / IPv6. Чтобы включить пересылку IPv4, вы должны отредактировать /etc/sysctl.conf
nano /etc/sysctl.conf
Найдите следующие строки:
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1 
net.ipv4.ip_forward=1 

# Uncomment the next line to enable packet forwarding for IPv6
#net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1
Затем выполните следующую команду
sysctl -p.

Шаг 2 - Создание клиента OpenVPN

Чтобы нам было легко добавить нового пользователя, мы собираемся создать скрипт. Скрипт будет иметь 2 варианта:
  1. Добавить нового пользователя
  2. Удалить существующего пользователя
cd ~
nano openvpn-user-manager.sh
Скопируйте и вставьте конфигурацию ниже:
#!/usr/bin/env bash

if readlink /proc/$$/exe | grep -q "dash"; then
    echo "This script needs to be run with bash, not sh."
    exit
fi

if [[ "$EUID" -ne 0 ]]; then
    echo "Sorry, you need to run this as root"
    exit
fi

newclient () {
    # Generates the custom client.ovpn
    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 ""
        echo "What do you want to do?"
        echo "   1) Add a new user"
        echo "   2) Remove an existing user"
        echo "   3) Exit"
        read -p "Select an option [1-3]: " option
        case $option in
            1) 
            echo
            echo "Please don't use special characters, only clear words."
            read -p "Client name: " -e CLIENT
            cd /etc/openvpn/easy-rsa/
            EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full $CLIENT nopass
            newclient "$CLIENT"
            echo
            echo "Client $CLIENT added, configuration is available at:" ~/"$CLIENT.ovpn"
            exit
            ;;
            2)
            NUMBEROFCLIENTS=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep -c "^V")
            if [[ "$NUMBEROFCLIENTS" = '0' ]]; then
                echo
                echo "We were not able to find existing clients!"
                exit
            fi
            echo
            echo "Select the existing client certificate you want to revoke:"
            tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
            if [[ "$NUMBEROFCLIENTS" = '1' ]]; then
                read -p "Select one client [1]: " CLIENTNUMBER
            else
                read -p "Select one client [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 "Do you actually desire to revoke the access of the client? $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 "Certificate for the client $CLIENT is revoked!"
            else
                echo
                echo "Certificate revocation for client $CLIENT aborted!"
            fi
            exit
            ;;
            3)
            exit
            ;;
        esac
    done
else
    clear
    echo "OpenVPN is not installed."
    echo "Install OpenVPN first"
    echo "https://community.hetzner.com/tutorials/install-and-configure-openvpn-on-ubuntu-and-debian"
fi
Дайте разрешения:
chmod 755 ~/root/openvpn-user-manager.sh
Примечание. Если вы не можете подключиться к серверу vpn, перезагрузите VPS. Если проблема возникает после перезагрузки, выполните шаг 1.3.

Шаг 3 - Использование OpenVPN User Manager (openvpn-user-manager.sh)

Запустите скрипт:
bash openvpn-user-manager.sh
Вывод должен быть похож на это:
OpenVPN is installed.

What do you want to do?
   1) Add a new user
   2) Remove an existing user
   3) Exit
Select an option [1-3]:

Вывод

Ваш сервер OpenVPN теперь готов. Вы можете просматривать и вводить сайты с ограниченным доступом или отправлять личные файлы.

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0