Openvpn Blocks Outgoing Apache Sites

Openvpn Blocks Outgoing Apache Sites

I host a site to teach SQL (databases.pacha.dev) by using Apache in a DigitalOcean droplet. I wanted to install OpenVPN to have a VPN in the same server, and I run this as root

#!/bin/bash

echo "Setting up OpenVPN..."

IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
PROTOCOL=udp
PORT=1194

echo "OpenVPN configuration:"
echo "    Listen on: $IP:$PORT"
echo "    Protocol : $PROTOCOL"
echo "    Resolver : pi.hole (10.8.0.1)"

# Install easy-rsa
EASYRSAURL='
wget -O ~/easyrsa.tgz "$EASYRSAURL" 2>/dev/null || curl -Lo ~/easyrsa.tgz "$EASYRSAURL"
tar xzf ~/easyrsa.tgz -C ~/
mv ~/EasyRSA-3.0.5/ /etc/openvpn/server/
mv /etc/openvpn/server/EasyRSA-3.0.5/ /etc/openvpn/server/easy-rsa/
chown -R root:root /etc/openvpn/server/easy-rsa/
rm -f ~/easyrsa.tgz
cd /etc/openvpn/server/easy-rsa/ || exit 1
sed -i 's/^RANDFILE/#RANDFILE/g' openssl-easyrsa.cnf
patch --ignore-whitespace << 'EOF'
From cdaa4a1fb0851beb17f364febb6e9b1f694baff8 Mon Sep 17 00:00:00 2001
From: Luiz Angelo Daros de Luca <>
Date: Tue, 25 Sep 2018 17:58:03 -0300
Subject: [PATCH] include index.txt.attr as CA files

Remove a warning when the first certificate is generated

Can't open .../easy-rsa/pki/index.txt.attr for reading, No such file or directory

Signed-off-by: Luiz Angelo Daros de Luca <>
---
 easyrsa | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/easyrsa b/easyrsa
index de4fe43..969b5d9 100755
--- a/easyrsa
+++ b/easyrsa
@@ -428,7 +428,7 @@ verify_ca_init() {
    verify_pki_init

    # verify expected files present:
-   for i in serial index.txt ca.crt private/ca.key; do
+   for i in serial index.txt index.txt.attr ca.crt private/ca.key; do
        if [ ! -f "$EASYRSA_PKI/$i" ]; then
            [ "$1" = "test" ] && return 1
            die "\
@@ -543,6 +543,7 @@ current CA keypair. If you intended to start a new CA, run init-pki first."
        mkdir -p "$EASYRSA_PKI/$i" || die "$err_file"
    done
    printf "" > "$EASYRSA_PKI/index.txt" || die "$err_file"
+   printf "" > "$EASYRSA_PKI/index.txt.attr" || die "$err_file"
    print "01" > "$EASYRSA_PKI/serial" || die "$err_file"

    # Default CN only when not in global EASYRSA_BATCH mode:
--
2.17.1
EOF

# Create the PKI, set up the CA and the server and client certificates
./easyrsa init-pki
./easyrsa --batch build-ca nopass
EASYRSA_CERT_EXPIRE=90 ./easyrsa build-server-full server nopass
EASYRSA_CRL_DAYS=90 ./easyrsa gen-crl

# Move the stuff we need
cp pki/ca.crt pki/private/ca.key pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn/server

# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:nogroup /etc/openvpn/server/crl.pem

# Generate key for tls-auth
openvpn --genkey --secret /etc/openvpn/server/ta.key

# Create the DH parameters file using the predefined ffdhe2048 group
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/server/dh.pem

# Generate server.conf
echo "port $PORT
proto $PROTOCOL" > /etc/openvpn/server/server.conf
echo 'dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
log /var/log/openvpn.log
crl-verify crl.pem' >> /etc/openvpn/server/server.conf

# Enable net.ipv4.ip_forward for the system
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/30-openvpn-forward.conf

# Enable without waiting for a reboot or service restart
echo 1 > /proc/sys/net/ipv4/ip_forward

# Add post-routing rule (other required rules already configured)
iptables-restore /etc/iptables/rules.v4
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source "$IP"
iptables-save > /etc/iptables/rules.v4

# And finally, enable and start the OpenVPN service
systemctl enable --now 

# client-common.txt is created so we have a template to add further users later
echo "client
dev tun
proto $PROTOCOL
sndbuf 0
rcvbuf 0
remote $IP $PORT
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
setenv opt block-outside-dns
key-direction 1
verb 3" > /etc/openvpn/server/client-common.txt

echo "OpenVPN setup complete."

echo "Creating new client config..."

newclient () {
    cd /etc/openvpn/server/easy-rsa/ || exit 1
    EASYRSA_CERT_EXPIRE=90 ./easyrsa build-client-full "$1" nopass
    # Generates the custom client.ovpn
    cp /etc/openvpn/server/client-common.txt "/root/$1.ovpn"
    {
        echo "<ca>"
        cat /etc/openvpn/server/easy-rsa/pki/ca.crt
        echo "</ca>"
        echo "<cert>"
        sed -ne '/BEGIN CERTIFICATE/,$ p' "/etc/openvpn/server/easy-rsa/pki/issued/$1.crt"
        echo "</cert>"
        echo "<key>"
        cat "/etc/openvpn/server/easy-rsa/pki/private/$1.key"
        echo "</key>"
        echo "<tls-auth>"
        sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/server/ta.key
        echo "</tls-auth>"
    } >> "/root/$1.ovpn"
}

CLIENT="client"
if [ -n "$1" ]
then
    CLIENT="$1"
fi
newclient "$CLIENT"

THISFILE='/var/lib/cloud/scripts/per-instance/03-create-client-config'
LINKPATH='/root/create-client-config.sh'
if [ ! -f "$LINKPATH" ]
then
    ln -s "$THISFILE" "$LINKPATH"
fi

echo "Client config creation complete (~/$CLIENT.ovpn)."

This is my ufw status (enabled)

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache Full                ALLOW       Anywhere                  
5432/tcp                   ALLOW       Anywhere                  
3306/tcp                   ALLOW       Anywhere                  
1433/tcp                   ALLOW       Anywhere                  
4022/tcp                   ALLOW       Anywhere                  
135/tcp                    ALLOW       Anywhere                  
1434/tcp                   ALLOW       Anywhere                  
1434/udp                   ALLOW       Anywhere                  
1194                       ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6)             
5432/tcp (v6)              ALLOW       Anywhere (v6)             
3306/tcp (v6)              ALLOW       Anywhere (v6)             
1433/tcp (v6)              ALLOW       Anywhere (v6)             
4022/tcp (v6)              ALLOW       Anywhere (v6)             
135/tcp (v6)               ALLOW       Anywhere (v6)             
1434/tcp (v6)              ALLOW       Anywhere (v6)             
1434/udp (v6)              ALLOW       Anywhere (v6)             
1194 (v6)                  ALLOW       Anywhere (v6) 

However, even after doing systemctl stop openvpn I can't open the site that I provide via Apache in that server. I tried both from laptop and mobile.

Ping is working correctly

~ $ ping databases.pacha.dev
PING databases.pacha.dev (164.92.122.20) 56(84) bytes of data.
64 bytes from 164.92.122.20 (164.92.122.20): icmp_seq=1 ttl=47 time=204 ms
64 bytes from 164.92.122.20 (164.92.122.20): icmp_seq=2 ttl=47 time=256 ms
64 bytes from 164.92.122.20 (164.92.122.20): icmp_seq=3 ttl=47 time=250 ms

Any ideas?

Sophia Al-Mansoor
Author

Sophia Al-Mansoor

Sophia analyzes international trade, startup ecosystems, retail transformation, and supply chain logistics for modern digital publications.