Facebook Twitter Instagram
    TecAdmin
    • Home
    • FeedBack
    • Submit Article
    • About Us
    Facebook Twitter Instagram
    TecAdmin
    You are at:Home»VPN»How To Install OpenVPN Server on Debian 10/9

    How To Install OpenVPN Server on Debian 10/9

    By Hitesh JethvaSeptember 24, 202013 Mins Read

    A virtual private network (VPN) is a protocol used to add security and privacy to private and public networks. VPNs send traffic between two or more devices on a network in an encrypted tunnel. Once a VPN connection is made, all of the network traffic is encrypted on the client’s end. VPNs mask your IP address so that your online actions are virtually untraceable.

    Advertisement

    It provides encryption and anonymity, and protects your online activities, online shopping, sending emails, and also helps to keep your Web browsing anonymous.

    In this tutorial, we will show you how to install and configure the OpenVPN server and Client on Debian 10 server.

    Getting Started

    Before starting, it is a good idea to update your system’s packages to the latest version.

    Run the following command to update and upgrade your system’s packages:

    apt-get update -y
    apt-get upgrade -y
    

    Once your system is up-to-date, you can proceed to the next step.

    Step 1 – Enable IP Forwarding

    Next, you will need to enable IP forwarding in your system. IP forwarding allows your operating system to accept the incoming network packets and forward it to the other network if the destination is on another network.

    To enable the IP forwarding, edit the file /etc/sysctl.conf:

    nano /etc/sysctl.conf
    

    Add the following line:

    net.ipv4.ip_forward = 1
    

    Save the file when you are finished. Then, run the following command to apply the changes:

    sysctl -p
    

    Step 2 – Install OpenVPN Server

    By default, the OpenVPN package is available in the Debian 10 default repository. You can install it with the following command:

    apt-get install openvpn -y
    

    Once the installation has been completed, you will also need to copy the easy-rsa directory for managing SSL certificates.

    Run the following command to copy easy-rsa directory from /usr/share directory to /etc/openvpn directory.

    cp -r /usr/share/easy-rsa /etc/openvpn/
    

    Step 3 – Setup Certificate Authority

    Easy RSA uses a set of scripts to generate keys and certificates. First, you will need to configure the Certificate Authority on your system.

    To do so, change the directory to /etc/openvpn/easy-rsa and create a new Easy RSA’s configuration file:

    cd /etc/openvpn/easy-rsa
    nano vars
    

    Add the following lines including your country, city, and preferred email address:

    set_var EASYRSA                 "$PWD"
    set_var EASYRSA_PKI             "$EASYRSA/pki"
    set_var EASYRSA_DN              "cn_only"
    set_var EASYRSA_REQ_COUNTRY     "INDIA"
    set_var EASYRSA_REQ_PROVINCE    "Gujrat"
    set_var EASYRSA_REQ_CITY        "Ahmedabad"
    set_var EASYRSA_REQ_ORG         "Tecadmin CERTIFICATE AUTHORITY"
    set_var EASYRSA_REQ_EMAIL	"[email protected]"
    set_var EASYRSA_REQ_OU          "Tecadmin EASY CA"
    set_var EASYRSA_KEY_SIZE        2048
    set_var EASYRSA_ALGO            rsa
    set_var EASYRSA_CA_EXPIRE	7500
    set_var EASYRSA_CERT_EXPIRE     365
    set_var EASYRSA_NS_SUPPORT	"no"
    set_var EASYRSA_NS_COMMENT	"Tecadmin CERTIFICATE AUTHORITY"
    set_var EASYRSA_EXT_DIR         "$EASYRSA/x509-types"
    set_var EASYRSA_SSL_CONF        "$EASYRSA/openssl-easyrsa.cnf"
    set_var EASYRSA_DIGEST          "sha256"
    

    Save the file when you are finished.

    Next, run the following command to initiate the PKI directory.

    ./easyrsa init-pki
    

    Output:

    Note: using Easy-RSA configuration from: ./vars
    
    init-pki complete; you may now create a CA or requests.
    Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki
    

    Next, build the CA certificates with the following command:

    ./easyrsa build-ca
    

    You should get the following output:

    Note: using Easy-RSA configuration from: ./vars
    
    Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
    
    Enter New CA Key Passphrase: 
    Re-Enter New CA Key Passphrase: 
    Generating RSA private key, 2048 bit long modulus (2 primes)
    ....................................................................+++++
    ..........................................................................................................................................+++++
    e is 65537 (0x010001)
    Can't load /etc/openvpn/easy-rsa/pki/.rnd into RNG
    140218549745472:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:98:Filename=/etc/openvpn/easy-rsa/pki/.rnd
    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.
    -----
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
    
    CA creation complete and you may now import and sign cert requests.
    Your new CA certificate file for publishing is at:
    /etc/openvpn/easy-rsa/pki/ca.crt
    

    The above command will generate two files named ca.key and ca.crt. These certificates will be used to sign your server and clients’ certificates.

    Step 4 – Generate Server Certificate Files

    Next, you will need to generate a keypair and certificate request for your server.

    Run the following command to generate the server key named tecadmin-server:

    ./easyrsa gen-req tecadmin-server nopass
    

    You should get the following output:

    Note: using Easy-RSA configuration from: ./vars
    
    Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
    Generating a RSA private key
    ...........................+++++
    ...............................................................................................................................................................................................................................................................................................+++++
    writing new private key to '/etc/openvpn/easy-rsa/pki/private/tecadmin-server.key.kOlBTwtY6a'
    -----
    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.
    -----
    Common Name (eg: your user, host, or server name) [tecadmin-server]:
    
    Keypair and certificate request completed. Your files are:
    req: /etc/openvpn/easy-rsa/pki/reqs/tecadmin-server.req
    key: /etc/openvpn/easy-rsa/pki/private/tecadmin-server.key
    

    Step 5 – Sign the Server Key Using CA

    Next, you will need to sign the tecadmin-server key using your CA certificate:

    Run the following command to sign the server key:

    ./easyrsa sign-req server tecadmin-server
    

    You should get the following output:

    Note: using Easy-RSA configuration from: ./vars
    
    Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
    
    You are about to sign the following certificate.
    Please check over the details shown below for accuracy. Note that this request
    has not been cryptographically verified. Please be sure it came from a trusted
    source or that you have verified the request checksum with the sender.
    
    Request subject, to be signed as a server certificate for 365 days:
    
    subject=
        commonName                = tecadmin-server
    
    
    Type the word 'yes' to continue, or any other input to abort.
      Confirm request details: yes
    Using configuration from /etc/openvpn/easy-rsa/pki/safessl-easyrsa.cnf
    Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName            :ASN.1 12:'tecadmin-server'
    Certificate is to be certified until Feb 16 05:00:50 2021 GMT (365 days)
    
    Write out database with 1 new entries
    Data Base Updated
    
    Certificate created at: /etc/openvpn/easy-rsa/pki/issued/tecadmin-server.crt
    

    Next, verify the generated certificate file with the following command:

    openssl verify -CAfile pki/ca.crt pki/issued/tecadmin-server.crt 
    

    If everything is fine, you should get the following output:

    pki/issued/tecadmin-server.crt: OK
    

    Next, run the following command to generate a strong Diffie-Hellman key to use for the key exchange:

    ./easyrsa gen-dh
    

    You should get the following output:

    Note: using Easy-RSA configuration from: ./vars
    
    Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
    Generating DH parameters, 2048 bit long safe prime, generator 2
    This is going to take a long time
    ....+................................+........................................+.....++*++*++*++*
    
    DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem
    

    After creating all certificate files, copy them to the /etc/openvpn/server/ directory:

    cp pki/ca.crt /etc/openvpn/server/
    cp pki/dh.pem /etc/openvpn/server/
    cp pki/private/tecadmin-server.key /etc/openvpn/server/
    cp pki/issued/tecadmin-server.crt /etc/openvpn/server/
    

    Step 6 – Generate Client Certificate and Key File

    Next, you will need to generate the key and certificate file for the client.

    First, run the following command to build the client key file:

    ./easyrsa gen-req client nopass
    

    You should see the following output:

    Note: using Easy-RSA configuration from: ./vars
    
    Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
    Generating a RSA private key
    ......................................................+++++
    ...+++++
    writing new private key to '/etc/openvpn/easy-rsa/pki/private/client.key.e38GUtzHie'
    -----
    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.
    -----
    Common Name (eg: your user, host, or server name) [client]:
    
    Keypair and certificate request completed. Your files are:
    req: /etc/openvpn/easy-rsa/pki/reqs/client.req
    key: /etc/openvpn/easy-rsa/pki/private/client.key
    

    Next, sign the client key using your CA certificate:

    ./easyrsa sign-req client client
    

    You should get the following output:

    Note: using Easy-RSA configuration from: ./vars
    
    Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
    
    
    You are about to sign the following certificate.
    Please check over the details shown below for accuracy. Note that this request
    has not been cryptographically verified. Please be sure it came from a trusted
    source or that you have verified the request checksum with the sender.
    
    Request subject, to be signed as a client certificate for 365 days:
    
    subject=
        commonName                = client
    
    
    Type the word 'yes' to continue, or any other input to abort.
      Confirm request details: yes
    Using configuration from /etc/openvpn/easy-rsa/pki/safessl-easyrsa.cnf
    Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName            :ASN.1 12:'client'
    Certificate is to be certified until Feb 16 05:11:19 2021 GMT (365 days)
    
    Write out database with 1 new entries
    Data Base Updated
    
    Certificate created at: /etc/openvpn/easy-rsa/pki/issued/client.crt
    

    Next, copy all client certificate and key file to the /etc/openvpn/client/ directory:

    cp pki/ca.crt /etc/openvpn/client/
    cp pki/issued/client.crt /etc/openvpn/client/
    cp pki/private/client.key /etc/openvpn/client/
    

    Step 7 – Configure OpenVPN Server

    Next, create a new OpenVPN configuration file inside /etc/openvpn/ directory:

    nano /etc/openvpn/server.conf
    

    Add the following lines:

    port 1194
    proto udp
    dev tun
    ca /etc/openvpn/server/ca.crt
    cert /etc/openvpn/server/tecadmin-server.crt
    key /etc/openvpn/server/tecadmin-server.key
    dh /etc/openvpn/server/dh.pem
    server 10.8.0.0 255.255.255.0
    push "redirect-gateway def1"
    
    push "dhcp-option DNS 208.67.222.222"
    push "dhcp-option DNS 208.67.220.220"
    duplicate-cn
    cipher AES-256-CBC
    tls-version-min 1.2
    tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
    auth SHA512
    auth-nocache
    keepalive 20 60
    persist-key
    persist-tun
    compress lz4
    daemon
    user nobody
    group nogroup
    log-append /var/log/openvpn.log
    verb 3
    

    Save the file when you are finished.

    Step 8 – Start OpenVPN Service

    OpenVPN is now installed and configured. You can now start the OpenVPN service and enable it to start after the system reboot using the following command:

    systemctl start [email protected]
    systemctl enable [email protected]
    

    Run the following command to verify the status of OpenVPN service:

    systemctl status [email protected]
    

    You should get the following output:

    ● [email protected] - OpenVPN connection to server
       Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2020-02-21 15:38:31 UTC; 4s ago
         Docs: man:openvpn(8)
               https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
               https://community.openvpn.net/openvpn/wiki/HOWTO
     Main PID: 3044 (openvpn)
       Status: "Initialization Sequence Completed"
        Tasks: 1 (limit: 2359)
       Memory: 1.3M
       CGroup: /system.slice/system-openvpn.slice/[email protected]
               └─3044 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config /etc/openvpn/server.
    
    Feb 21 15:38:31 debian10 systemd[1]: Starting OpenVPN connection to server...
    Feb 21 15:38:31 debian10 systemd[1]: Started OpenVPN connection to server.
    

    Once the OpenVPN service started successfully, it will create a new network interface named tun0. You can check it with the following command:

    ip a show tun0
    

    You should get the new interface tun0 in the following output:

    59: tun0:  mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
        link/none 
        inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::90:e3c0:5f1a:27f5/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    

    Step 9 – Generate Client Configuration

    Next, create a new OpenVPN client configuration file named client.ovpn. You will require this file to connect your OpenVPN server from the client system.

    nano /etc/openvpn/client/client.ovpn
    

    Add the following lines:

    client
    dev tun
    proto udp
    remote vpn-server-ip 1194
    ca ca.crt
    cert client.crt
    key client.key
    cipher AES-256-CBC
    auth SHA512
    auth-nocache
    tls-version-min 1.2
    tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
    resolv-retry infinite
    compress lz4
    nobind
    persist-key
    persist-tun
    mute-replay-warnings
    verb 3
    

    Save the file when you are finished.

    Step 10 – Configure Routing using UFW

    By default, the UFW firewall is not installed in Debian 10. You can install it with the following command:

    apt-get install ufw -y
    

    After installing the UFW firewall, you will need to add firewall rules to enable masquerading so that your VPN clients access to the Internet.

    First, you will need to configure UFW to accept the forwarded packets. You can do it by editing the file /etc/default/ufw:

    nano /etc/default/ufw
    

    Change the following line:

    DEFAULT_FORWARD_POLICY="ACCEPT"
    

    Save and close the file. Then, open the /etc/ufw/before.rules file:

    nano /etc/ufw/before.rules
    

    Add the following lines at the end of the file:

    *nat
    :POSTROUTING ACCEPT [0:0]
    -A POSTROUTING -s 10.8.0.0/16 -o ens3 -j MASQUERADE
    COMMIT
    

    Save the file when you are finished.

    Note: Replace ens3 with the name of your public network interface.

    Next, allow the default OpenVPN port 1194 and OpenSSH with the following command:

    ufw allow 1194/udp
    ufw allow OpenSSH
    

    Next, reload the UFW firewall using the following command:

    ufw disable
    ufw enable
    

    Step 11 – Connect OpenVPN from Client

    First, log in to the client machine and install the OpenVPN package with the following command:

    apt-get install openvpn -y
    

    Next, you will need to download the OpenVPN client configuration files from the OpenVPN server to the client machine.

    On the client machine, run the following command to download all the client configuration file:

    scp -r [email protected]:/etc/openvpn/client .
    

    Once downloaded, change the directory to the client and run the following command to connect to the OpenVPN server:

    cd client
    openvpn --config client.ovpn
    

    You should see the following output:

    Fri Feb 21 15:39:18 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]69.87.218.145:1194
    Fri Feb 21 15:39:18 2020 Socket Buffers: R=[212992->212992] S=[212992->212992]
    Fri Feb 21 15:39:18 2020 UDP link local: (not bound)
    Fri Feb 21 15:39:18 2020 UDP link remote: [AF_INET]69.87.218.145:1194
    Fri Feb 21 15:39:18 2020 TLS: Initial packet from [AF_INET]69.87.218.145:1194, sid=6d27e1cb 524bd8cd
    Fri Feb 21 15:39:18 2020 VERIFY OK: depth=1, CN=Easy-RSA CA
    Fri Feb 21 15:39:18 2020 VERIFY OK: depth=0, CN=tecadmin-server
    Fri Feb 21 15:39:18 2020 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, 2048 bit RSA
    Fri Feb 21 15:39:18 2020 [tecadmin-server] Peer Connection Initiated with [AF_INET]69.87.218.145:1194
    Fri Feb 21 15:39:19 2020 SENT CONTROL [tecadmin-server]: 'PUSH_REQUEST' (status=1)
    Fri Feb 21 15:39:19 2020 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 20,ping-restart 60,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM'
    Fri Feb 21 15:39:19 2020 OPTIONS IMPORT: timers and/or timeouts modified
    Fri Feb 21 15:39:19 2020 OPTIONS IMPORT: --ifconfig/up options modified
    Fri Feb 21 15:39:19 2020 OPTIONS IMPORT: route options modified
    

    After a successfull connection, OpenVPN will assign an IP address to your system. You can check it with the following command:

    ip a show tun0
    

    Output:

    4: tun0:  mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
        link/none 
        inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::7226:57b1:f101:313b/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    

    You can also check the OpenVPN server log to verify the connection status:

    tail -f /var/log/openvpn.log 
    

    You should see the following output:

    Fri Feb 21 15:39:18 2020 45.58.34.83:37445 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, 2048 bit RSA
    Fri Feb 21 15:39:18 2020 45.58.34.83:37445 [client] Peer Connection Initiated with [AF_INET]45.58.34.83:37445
    Fri Feb 21 15:39:18 2020 client/45.58.34.83:37445 MULTI_sva: pool returned IPv4=10.8.0.6, IPv6=(Not enabled)
    Fri Feb 21 15:39:18 2020 client/45.58.34.83:37445 MULTI: Learn: 10.8.0.6 -> client/45.58.34.83:37445
    Fri Feb 21 15:39:18 2020 client/45.58.34.83:37445 MULTI: primary virtual IP for client/45.58.34.83:37445: 10.8.0.6
    Fri Feb 21 15:39:19 2020 client/45.58.34.83:37445 PUSH: Received control message: 'PUSH_REQUEST'
    Fri Feb 21 15:39:19 2020 client/45.58.34.83:37445 SENT CONTROL [client]: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 20,ping-restart 60,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM' (status=1)
    Fri Feb 21 15:39:19 2020 client/45.58.34.83:37445 Data Channel: using negotiated cipher 'AES-256-GCM'
    Fri Feb 21 15:39:19 2020 client/45.58.34.83:37445 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
    Fri Feb 21 15:39:19 2020 client/45.58.34.83:37445 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
    

    Conclusion

    Congratulations! you have successfully installed and configured the OpenVPN server and Client on Debian 10 server. You can now access the internet securely and protect your identity.

    Debian 10 OpenVPN OpenVPN Server VPN
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email WhatsApp

    Related Posts

    How to Install Tomcat 10 on Debian 10

    How to Install Tomcat 10 on Debian 11/10

    How To Install and Configure VNC Server on Debian 10

    How To Install PHP 8 on Debian 10

    View 7 Comments

    7 Comments

    1. az12 on December 8, 2020 12:22 pm

      Hello Everyone,

      I have an issue : When i insert this line “openvpn –config client.ovpn” it don’t work.

      Someone could you help me please ?

      Reply
    2. Oxmo on October 28, 2020 9:10 pm

      Installation was fine ty a lot for your tuto.
      How can i have an active admin web’s interface (:943) plz ?

      Best regards.

      Reply
    3. Woger on October 20, 2020 7:04 pm

      Thanks a million!

      One thing that could make life easier for clients is adding a line ‘remote-cert-tls server’ to the .ovpn config file (you send to the client): some vpn clients will balk if there’s no certificate verfication method (or location) stated.

      Best, take care.

      Reply
    4. Mark Olbert on October 17, 2020 2:24 am

      This was a great help, thanx!

      Reply
    5. Peter on August 27, 2020 11:52 am

      Server installation went fine without errors during install but I’m stuck at
      systemctl status [email protected]
      It says activating (auto-restarting) and tun interface doesn’t show up

      Reply
      • sumguy on September 15, 2020 5:39 pm

        ME TOO PLEASE SOLVE THIS ISSUE

        Reply
    6. Ruslan on June 24, 2020 11:54 am

      Hi, everything works on PC and Mac but not on mobile devices(

      Reply

    Leave A Reply Cancel Reply

    Advertisement
    Recent Posts
    • Configure Postfix to Use Gmail SMTP on Ubuntu & Debian
    • PHP Arrays: A Beginner’s Guide
    • Deploying Flask Application on Ubuntu (Apache+WSGI)
    • OpenSSL: Working with SSL Certificates, Private Keys and CSRs
    • How to Create and Read List in Python
    Facebook Twitter Instagram Pinterest
    © 2023 Tecadmin.net. All Rights Reserved | Terms  | Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.