OpenVPN Setup for Android
There are probably many ways to do this, but this is what worked for me in the end, after several trials and errors. I ended up making a "standalone" server solution based on running in GNU Screen to avoid messing too much with my existing server.
I started by downloading the EasyRSA scripts to help generating certificates and such. Then ran the following commands:
./easyrsa init-pki ./easyrsa build-ca ./easyrsa build-server-full server ./easyrsa build-client-full client ./easyrsa gen-dh
You will have to enter a CA key passphrase and PEM passphrase, keep those for later.
Once the files are created, copy them into a new location where everything will be stored, in my case the "openvpn" directory under my home directory:
mkdir ~/openvpn cp pki/ca.crt ~/openvpn/ cp pki/dh.pem ~/openvpn/ cp pki/issued/client.crt ~/openvpn/ cp pki/issued/server.crt ~/openvpn/ cp pki/private/ca.key ~/openvpn/ cp pki/private/client.key ~/openvpn/ cp pki/private/server.key ~/openvpn/
The OpenVPN server configuration file must be created manually, at ~/openvpn/server.cfg with the following contents:
ca ca.crt cert server.crt key server.key dh dh.pem dev tun ifconfig 10.8.0.1 10.8.0.2 tls-server port 1194 proto udp comp-lzo push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "ifconfig 10.8.0.2 10.8.0.1" mode server verb 4 client-config-dir ccd
Create a new directory "ccd" under the directory structure and create the file ~/openvpn/ccd/client with the following single line:
iroute 10.8.0.0 255.255.255.0
To be able to start things easily and open the necessary parts of the firewall a script like this can be used, placed at ~/openvpn/start.sh:
#!/bin/sh screen -S openvpn -d -m sudo openvpn server.cfg sudo iptables -A INPUT -p udp --dport 1194 -i eth0 -j ACCEPT sudo iptables -A INPUT -i tun0 -j ACCEPT sudo iptables -A FORWARD -i tun0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -d 10.8.0.0/255.255.255.0 -j ACCEPT
This particular server already has iptables setup for NAT and such, so that is not present in this configuration.
Finally, the Android OpenVPN application requires a matching "ovpn" file with the client configuration. I had to make this one by manually looking something like this:
client dev tun proto udp remote my.openvpn.server.com 1194 resolv-retry infinite nobind persist-key persist-tun comp-lzo verb 3 <cert> -----BEGIN CERTIFICATE----- <contents of client.crt file> -----END CERTIFICATE----- </cert> <key> -----BEGIN ENCRYPTED PRIVATE KEY----- <contents of client.key file> -----END ENCRYPTED PRIVATE KEY----- </key> <ca> -----BEGIN CERTIFICATE----- <contents of ca.crt file> -----END CERTIFICATE----- </ca>