Настройка и использование VPN от HideMyAss через WiFi

Зачем и почему использовать VPN нет смысла рассказавыть. Думаю многие сталкивались с такой проблемой, что многие сайты не работают, а точнее не дают доступ к своему контенту, если у вас к примеру не американский IP адрес. Из таких: Pandora, Google Music, iTunes, ABC, YellowPages и далее по списку. Обмануть ушлых админов можно с помощью анонимайзера, но это крайне не удобно, другое дело VPN, получашь IP адрес сервера расположенного в Лос-Анджелесе и погнал лазить где тебе нравится. Сама по себе настройка соединения VPN от HideMyAss очень проста, но у меня стояла задача организовать целую Wi-Fi инфраструктуру, т/е я хотел что-бы все устройства с Wi-Fi чипом на борту могли сидеть на сети, у которой тот IP который нравится мне. Понятно, что для организации такой сети вам понадобится WiFi роутер, Ubuntu Linux и аккаунт на HideMyAss. О том, как все это замутить и авторизировать в Ubuntu 12.04.1 LTS Server читайте ниже.

HideMyAss

Это довольно известный буржуйский сервис, где за небольшие деньги можно купить аккаунт и использовать их сервера в своих целях, полачая разные IP, на безопастность не расчитывайте, так как когда трафик проходит через чужие сервера, по чужим каналам и с помощью чужих сертификатами говорить о приватности нет смысла.

Как это работает?

После того как вы зарегистрировались на сайте HideMyAss.com и заплатили за использование сервиса, в вашем аккаунте есть выбор для какой ОС загрузить сертификаты и программу для использования VPN. Нас интересует Linux. Подробности тут.

Установка и настройка

Я купил простой WiFi роутер и настроил его работать в обычном режиме, роутер получает по DHCP адрес от сервера, делает NAT и раздает уже свои адреса через свой DHCP. Стандартная конфигурация, ничего особенного. На сервере, в моем случае это Ubuntu 12.04.1 LTS делаем папку /root/openvpn

mkdir /root/openvpn
mkdir /root/openvpn

Распакуйте туда скаченный ахив, у вас должны появится файлы:
client.cfg
hma-start
keys папка

Идея
Я хотел реализовать следующие опции:

  • Запуск скрипта для просмотра списка доступных стран
  • Проверка на наличие уже работающего openvpn
  • Корректная остановка работы openvpn
  • Автоматический ввод логина и пароля
  • Немного информации о соединении (IP, статус, страна)

    Срипт первый
    Первый скрипт логично было написать для старта:

    cd /root/openvpn
    touch startVpn.sh
    chmod +x startVpn.sh
    cd /root/openvpn
    touch startVpn.sh
    chmod +x startVpn.sh

    Текст срипта:

    #!/bin/bash
    #
    # Internet interface
    INET_IFACE="tun0"
     
    # Go to VPN directory
    cd /root/openvpn
     
    # Check if another openvpn proccess is already running
    if [ -e .openvpnup ] ;
    then
      echo "OpenVPN is already running, connected to:";
      cat .openvpnup
      echo "You must close this connection before continuing. Example: ./stopVpn.sh";
    exit;
    fi
     
    # To get list of countries and to start hma-autostart.sh script
    if [[ $1 == '-l' ]]
    then
       curl -s "http://vpn.hidemyass.com/vpnconfig/countries.php";
       exit;
    fi
     
    COUNTRY=`echo $1 | sed 's/ /+/g'`
    if [ "$COUNTRY" = "" ]
    then
      echo "You must specify a country in the commandline, use -l option for a list of countries";
      exit;
    fi
     
    # Start hma-autostart script
    curl -s "http://vpn.hidemyass.com/vpnconfig/client_config.php?win=1&loc=$COUNTRY" > client.cfg
    ./hma-autostart.sh &
     
    until ifconfig|grep -q $INET_IFACE;do
    sleep 1
    #echo "We are waiting"
    done
     
    # Turn on forwarding and transperency mode
    iptables -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
    echo "1" > /proc/sys/net/ipv4/ip_forward
     
    # Echo
    echo ""
    echo "YOU ARE CONNECTED!"
    wget -nv -O - http://checkip.dyndns.org/ 2>&1 | cut -d">" -f7-|cut -d"< " -f-1
    echo ""
    echo $COUNTRY > .openvpnup
    #!/bin/bash
    #
    # Internet interface
    INET_IFACE="tun0"
    
    # Go to VPN directory
    cd /root/openvpn
    
    # Check if another openvpn proccess is already running
    if [ -e .openvpnup ] ;
    then
      echo "OpenVPN is already running, connected to:";
      cat .openvpnup
      echo "You must close this connection before continuing. Example: ./stopVpn.sh";
    exit;
    fi
    
    # To get list of countries and to start hma-autostart.sh script
    if [[ $1 == '-l' ]]
    then
       curl -s "http://vpn.hidemyass.com/vpnconfig/countries.php";
       exit;
    fi
    
    COUNTRY=`echo $1 | sed 's/ /+/g'`
    if [ "$COUNTRY" = "" ]
    then
      echo "You must specify a country in the commandline, use -l option for a list of countries";
      exit;
    fi
    
    # Start hma-autostart script
    curl -s "http://vpn.hidemyass.com/vpnconfig/client_config.php?win=1&loc=$COUNTRY" > client.cfg
    ./hma-autostart.sh &
    
    until ifconfig|grep -q $INET_IFACE;do
    sleep 1
    #echo "We are waiting"
    done
    
    # Turn on forwarding and transperency mode
    iptables -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    # Echo
    echo ""
    echo "YOU ARE CONNECTED!"
    wget -nv -O - http://checkip.dyndns.org/ 2>&1 | cut -d">" -f7-|cut -d"< " -f-1
    echo ""
    echo $COUNTRY > .openvpnup

    Скрипт второй
    Второй скрипт необходим для остановки, тут приведено много разных способов как убить демон openvpn.

    cd /root/openvpn
    touch stopVpn.sh
    chmod +x stopVpn.sh
    cd /root/openvpn
    touch stopVpn.sh
    chmod +x stopVpn.sh

    Текст срипта:

    #!/bin/bash
    #
    echo ""
    echo "Wait a second, script working..."
     
    # This will kill openvpn and delete .openvpnup file
    #kill -9 `ps -ef|grep openvpn|grep -v grep|cut -d" " -f7`
    #kill -9 $(ps opid= -C openvpn)
    #pidof openvpn
    killall -9 openvpn
    pkill openpvn
     
    cd /root/openvpn
    rm -rf .openvpnup
     
    echo ""
    echo "Done...Now you can start script ./startVpn.sh"
    echo ""
    #!/bin/bash
    #
    echo ""
    echo "Wait a second, script working..."
    
    # This will kill openvpn and delete .openvpnup file
    #kill -9 `ps -ef|grep openvpn|grep -v grep|cut -d" " -f7`
    #kill -9 $(ps opid= -C openvpn)
    #pidof openvpn
    killall -9 openvpn
    pkill openpvn
    
    cd /root/openvpn
    rm -rf .openvpnup
    
    echo ""
    echo "Done...Now you can start script ./startVpn.sh"
    echo ""

    Скрипт третий
    Третий скрипт поможет с автоматичесим вводом логина и пароля:

    cd /root/openvpn
    touch hma-autostart.sh
    chmod +x hma-autostart.sh
    cd /root/openvpn
    touch hma-autostart.sh
    chmod +x hma-autostart.sh

    Текст срипта:

    #!/usr/bin/expect -f
    set timeout 2
    spawn  openvpn client.cfg
    expect "Enter Auth Username:"
    send "MYLOGIN\r"
    expect "Enter Auth Password:"
    send "MYPASSWORD\r\r"
    expect "< "
    interact
    #!/usr/bin/expect -f
    set timeout 2
    spawn  openvpn client.cfg
    expect "Enter Auth Username:"
    send "MYLOGIN\r"
    expect "Enter Auth Password:"
    send "MYPASSWORD\r\r"
    expect "< "
    interact

    1) Содержание скриптов я хорошо прокомментировал. Работает это просто, запускаем скрипт startVpn.sh он использует вспомогательный скрипт hma-autostart.sh, он же делает проверки и он же корректирует правила в iptables, он же показывает IP адрес того места куда вы подклчились и выдает статус подключения в конце, он же переводит режим работы в фоновый, т.е. вы можете продожлить использовать консоль.

    2) Скрипт stopVpn.sh запускается в случае если вы хотите прервать текущее соеденение
    3) Скрипт hma-autostart.sh вводит логин и пароль

    Выглядит это так, проверяем список доступных локаций:

    root@ubuntuVpn:~/openvpn# ./startVpn.sh -l
    USA, California, Los Angeles (DC1 S1) 
    USA, California, Los Angeles (DC1 S2) 
    USA, California, Los Angeles (DC1 S3) 
    USA, California, Los Angeles (LOC1 S4) 
    USA, California, Los Angeles (LOC1 S5) 
    USA, California, Los Angeles (LOC1 S6) 
    USA, California, Los Angeles (LOC1 S7) 
    USA, California, Los Angeles (LOC1 S8) 
    USA, California, Orange County (DC1 S2) 
    USA, California, San Diego (DC1 S2) 
    ......
    Switzerland, Zurich 
    Turkey, Ankara 
    Turkey, Istanbul 
    Ukraine, Odessa
    [email protected]:~/openvpn# ./startVpn.sh -l
    USA, California, Los Angeles (DC1 S1) 
    USA, California, Los Angeles (DC1 S2) 
    USA, California, Los Angeles (DC1 S3) 
    USA, California, Los Angeles (LOC1 S4) 
    USA, California, Los Angeles (LOC1 S5) 
    USA, California, Los Angeles (LOC1 S6) 
    USA, California, Los Angeles (LOC1 S7) 
    USA, California, Los Angeles (LOC1 S8) 
    USA, California, Orange County (DC1 S2) 
    USA, California, San Diego (DC1 S2) 
    ......
    Switzerland, Zurich 
    Turkey, Ankara 
    Turkey, Istanbul 
    Ukraine, Odessa

    Подключаемся к Лондону:

    root@ubuntuVpn:~/openvpn# ./startVpn.sh "UK, London (LOC1 S1)"
    ....
    YOU ARE CONNECTED!
    Current IP Address: 139.143.71.2
    [email protected]:~/openvpn# ./startVpn.sh "UK, London (LOC1 S1)"
    ....
    YOU ARE CONNECTED!
    Current IP Address: 139.143.71.2

    Останавливаем соединение:

    root@ubuntuVpn:~/openvpn# ./stopVpn.sh 
    Wait a second, script working...
    Done...Now you can start script ./startVpn.sh
    [email protected]:~/openvpn# ./stopVpn.sh 
    Wait a second, script working...
    Done...Now you can start script ./startVpn.sh

    Связь с WiFi

    Как уже было сказано, скрипт запускаетс на сервере, таким образом получается, что сервер подключен к Англии и имеет IP адрес Лондона, к серверу подключен WiFi роутер, а к роутеру поключаются уже все остальные устройства имеющие на борту WiFi, Samsung Galaxy SIII, Nexus 7 и MacBookPro в моем случае.

    Все пакеты которые проходят через сервер, будут выходить через виртуальный интерфейс tun0 который имеет Лондонский IP, это можно увидеть в таблице маршрутизации:

    root@ubuntuVpn:~/openvpn# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         109.123.79.4    128.0.0.0       UG    0      0        0 tun0 
    [email protected]:~/openvpn# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         109.123.79.4    128.0.0.0       UG    0      0        0 tun0 

    О правильном роутинге позаботился как вы уже поняли скрипт:
    iptables -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
    echo “1” > /proc/sys/net/ipv4/ip_forward

    Далее просто находим WiFi сеть в списке сетей и подключаем устройство

    То как все работает продемонстрированно на схеме

    Оригинальная фотка высокого разрешения тут