Наскоро трябваше да се справим със ситуация където достъпът до VPN сървър на наш клиент беше недостъпен от негови партньори в страни които филтрират VPN достъпа чрез Deep Packet Inspection (DPI). След направен анализ от наша страна се оказа, че в конкретната държава се филтрират всички стандартни VPN протоколи като PPTP, L2TP/IPSec и OpenVPN. Не бяхме сигурни и не тествахме SSTP и IKEv2 протоколите, но така или иначе клиента не разполагаше със сървър с Microsoft Windows. Решението което имплементирахме беше OpenVPN + Obfsproxy. Obfsproxy е интрумент, който ефективно заобикаля DPI като трансформира мрежовия трафик между клиента и сървъра. По този начин между клиента и сървъра ще има само невинно изглеждащ, трансформиран трафик, вместо реалния такъв, който DPI може да класифицира като VPN трафик и блокира. Конфигурацията на Obfsproxy + OpenVPN се оказа сравнително лесна, поради факта че OpenVPN поддържа socks прокси. Всичко което трябваше да направим е да стартираме Obfsproxy така:
obfsproxy --log-file=/var/log/obfsproxy.log --log-min-severity=info obfs2 --dest=127.0.0.1:12456 --shared-secret=some_shared_secret server 0.0.0.0:8080 &
Така казваме на Obfsproxy да слуша на TCP порт 8080 и да изпраща трафика от Obfsproxy клиентите на OpenVPN сървъра работещ на порт 12456. Shared-secret е предварително уговорена парола между двете страни. Съответно променихме и конфигурацията на OpenVPN да слуша на TCP порт 12456:
proto tcp
port 12456
На клиента стартираме Obfsproxy така:
obfsproxy --log-file=/tmp/obfsproxy.log --log-min-severity=info obfs2 --shared-secret=some_shared_secret socks 127.0.0.1:10194 &
И правим следните промени в OpenVPN клиентския конфигурационен файл:
proto tcp
remote remote_server_ip 8080
route remote_server_ip 255.255.255.255 net_gateway
socks-proxy-retry
socks-proxy 127.0.0.1 10194
Заменяме remote_server_ip с IP адреса на OpenVPN сървъра. Редът "route remote_server_ip 255.255.255.255 net_gateway" е нужен, за да не се рутира трафика към IP адреса на OpenVPN сървъра през Obfsproxy.