Hiding openvpn traffic with stunnel so DPI firewalls are less likely to block your traffic.
As you see in the above diagram, trafic encapsulates as SSL/TLS
by stunnel
regradless of it's internal protocol. Since we need SSL/TLS
handshake, if openvpn
in the underlying protocol we need to use TCP
protocol for openvpn
.
You can find a simple tutorial for installing openvpn
on a debian machine here.
Supposing you already have installed openvpn
over TCP 1194
on your server, then you need to hide the trafiic via stunnel and this tutorials will guide you trough the rest of procedures.
This has two steps:
- Install and configure
stunnel
on server. - Install and configure
stunnel
on client.
In reality SSL/TLS
traffic is short and intermittent so still it would be easy for a goverment/ISP to detect stunnel
since lots of traffic will be passed as SSL/TLS
. It is recommended to use port TCP 443
or TCP 587
to hide the traffic so far.
You can run the script stunnel.sh
provided by this tutorial like:
sudo bash stunnel.sh
download stunnel.pem
from your home directory after installation got completed.
Now step two is configuring client side.
You should have a client.ovpn
config file or something similar for connecting to openvpn server.
Edit this file and add the following lins at the begining:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
route server_ip 255.255.255.255 net_gateway
Replace server_ip
with your server public IP address.
sudo apt install stunnel4
sudo cp ./stunnel.pem /etc/stunnel
Create /etc/stunnel/stunnel.conf
file with the following content:
[openvpn]
client = yes
accept = 1194
connect = server_ip:443
cert = /etc/stunnel/stunnel.pem
Replace server_ip
with your server public IP address. Here we used port 443
To enable Stunnel service at startup edit /etc/default/stunnel4
file and change ENABLED=0
to ENABLED=1
sudo iptables -A INPUT -p tcp -s localhost --dport 1194 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 1194 -j DROP
sudo service stunnel4 restart
Now you just connect to openvpn via its' config file and it will automatically route traffic via stunnel. Your local stunnel will connect to remote stunnel on the server which routes received trsffic to oprnvpn service.
Example:
sudo openvpn --config client.ovpn
Everything should work well by now.
You should have a client.ovpn
config file or something similar for connecting to openvpn server.
Edit this file and add the following lins at the begining:
route server_ip 255.255.255.255 net_gateway
Replace server_ip
with your server public IP address.
Download and install latest Windows stunnel client. Currently only 32-bit version is privoded and this is the latest release by the time of writing this tutorial.
By default config file is located at C:\Program Files (x86)\stunnel\config
as stunnel.conf.txt
. Edit the file and add the following content at the bottom of the file:
[openvpn]
client = yes
accept = 127.0.0.1:1194
connect = server_ip:443
cert = stunnel.pem
Replace server_ip
with your server public IP address. Here we used port 443
. Restart stunnel application to reload the new configurations.
Make sure stunnel is running and connect your openvpn
. Everything should work well by now.