В этой статье будет рассказано об одном из вариантов получения переносного решения с Tor, VPN и обфускацией, к которому можно подключить свои мобильные устройства, ПК или ноутбук.

Постановка задачи: получить одноплатный компьютер, который можно подключить к своему ноутбуку/ПК/мобильному устройству и который будет заворачивать трафик сначала в VPN, затем в Tor, обфусцировать с помощью obfs-proxy и отправлять на удаленный VPN-сервер.

Исходные данные:

1) Одноплатный компьютер. В моем случае это Raspberry Pi модель B+;
2) ОС Raspbian. Для данной статьи использовалась Raspbian Jessie, билд от 18-03-2016;
3) Карта памяти (Micro SD);
4) Картридер;
5) Беспроводной адаптер или переходник ethernet to usb;
6) Удаленный OpenVPN сервер.

Схемы подключения:

1) eth-eth

2) wlan-eth

3) wlan-wlan

4) eth-wlan


Обозначения:

1. SBC — одноплатный компьютер;
2. CR — устройство, через которое осуществляется доступ в Интернет. Устройство не обязательно может быть подключено напрямую в порт SBC;
3. PC — какой-либо компьютер (или мобильное устройство) подключаемое к SBC;
4. VPN-server — целевой VPN сервер;
5. Входной интерфейс — физический интерфейс, куда поступает клиентский трафик;
6. Выходной интерфейс — физический интерфейс, с которого трафик уходит в Интернет.

Допущения:

В статье рассматривается случай, когда параметры для линка в интернет приходят по DHCP или задаются статически. Для случаев с получением параметров для линка по L2TP, PPPoE или иных ситуаций настройка будет отличаться. Также будем считать, что для удобной работы VPN-сервер выступает как DNS-relay.

Установка системы и подключение


На официальном сайте Rasbian присутствуют очень подробные инструкции для записи образа для Linux, Mac OS и Windows, поэтому я не буду описывать процесс записи образа ОС на карту памяти, чтобы не загромождать статью. По своим наблюдением могу сказать, что лучше брать карту от 16 Гб, чтобы избежать в будущем проблем с нехваткой памяти.

С подключением к плате после записи образа и включения может быть несколько вариантов:

1) Если у вас есть специальный экран/монитор/телевизор c поддержкой hdmi, то достаточно его подключить по hdmi;
2) Если экрана нет, но параметры на физический интерфейс приходят по DHCP, то можно просканировать сеть nmap-ом с другого компьютера и подключиться по ssh. Пользователь pi, пароль raspberry;
3) Если нет DHCP, то можно отредактировать файл /etc/network/interfaces и прописать туда адреса вручную.

Форвардинг трафика


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

sysctl -w net.ipv4.ip_forward=1

или

echo 1 > /proc/sys/net/ipv4/ip_forward

Для проверки можно использовать команду:

cat /proc/sys/net/ipv4/ip_forward

Она должна вернуть «1».

iptables


Для того, чтобы упростить маршрутизацию трафика, включим маскардинг для туннельного интерфейса с помощью iptables:

iptables -t nat -A POSTROUTING -s 10.5.5.0/24 -o tun0 -j MASQUERADE

Вместо этого можно было бы прописать статические маршруты и статический адрес для клиента. Или использовать ccd.

Установка пакетов


Обновить репозитории и получить обновления:

sudo apt-get update
sudo apt-get upgrade

Установка из репозиториев:

sudo apt-get install python2.7 python-pip python-dev build-essential tor openvpn obfs-proxy 

Если вы хотите схему с точкой доступа, то помимо этого установим hostapd и DHCP-cервер:

sudo apt-get install hostapd isc-dhcp-server

Вместо isc-dhcp-server вполне может быть использован любой другой. В репозиториях часто содержаться не самые последние версии, поэтому можно собрать пакеты из исходников, но если вам нужно получить быстрое решение, то подойдет и установка из репозитория.

Настройка сетевого подключения


Схема eth-eth

Данный вариант является самым простым. На физическом интерфейсе Raspberry Pi, к которому подключается ПК, достаточно настроить статический адрес. На ПК также задать параметры вручную. Также можно настроить isc-dhcp-server, чтобы он выдавал параметры. На клиентской машине на Linux для первоначальной настройки достаточно выполнить команды:

ip a add 10.5.5.2/24 dev <интерфейс> 
ip route add default gw 10.5.5.1

А в файл /etc/resolv.conf добавить запись:

nameserver 10.8.0.1

Схема wlan-eth

В данной схеме входным интерфейсом будет беспроводной интерфейс, работающий в режиме точки доступа. Вместо режима полноценной точки доступа можно настроить режим Ad-hoc.

Для организации wi-fi точки доступа с DHCP я использовал связку hostapd и isc-dhcp-server, но не обязательно использовать именно эту связку. На хабре есть несколько очень подробных статей по настройке различных вариантов в Linux. Ссылки я привел в источниках.

Привожу пример своих настроек:

/etc/hostapd/hostapd.conf
interface=wlan0 #Интерфейс 
driver=rtl871xdrv #Используемый драйвер
ssid=AP #Название точки доступа
hw_mode=g  #Стандарт работы точки доступа
channel=6 #Частотный диапазон
macaddr_acl=0 #Не использовать списки доступа
auth_algs=1 #Использовать WPA
wpa=2 #Версия протокола
wpa_passphrase=raspberry #Пароль для подключения
wpa_key_mgmt=WPA-PSK #Метод аутентификации
wpa_pairwise=TKIP #Алгоритмы работы с ключами и шифрованием
rsn_pairwise=CCMP 


/etc/dhcp/dhcpd.conf
#Задание подсети для которой будет работать данный DHCP сервер
subnet 10.5.5.0 netmask 255.255.255.0 {    
range 10.5.5.2 10.5.5.4; #Диапазон адресов
option broadcast-address 10.5.5.255; #Широковещательный адрес
option routers 10.5.5.1;   #Шлюз по умолчанию
default-lease-time 600; #Стандартное удержания адреса
max-lease-time 7200;    #Максимальное время удерживания адреса
option domain-name "local"; #Доменное имя    
option domain-name-servers 10.8.0.1;} #Список DNS-серверов.


Сразу стоит оговориться, что у некоторых могут возникнуть проблемы с драйверами и работой беспроводной карточки в режиме точки доступа. Лучше поинтересоваться такими вещами заранее. У меня была такая проблема для одной из моих карт при работе вместе с hostapd из репозитория. Проблема решилась патчем hostapd.

Схема wlan-wlan

Часть с настройкой входного интерфейса ничем не отличается от предыдущей схемы. Выходной интерфейс необходимо подключить к точке доступа. Пример подключения с использованием утилиты nmcli:

nmcli d wifi connect <SSID точки> password <пароль> iface <интерфейс> 

Схема eth-wlan

Настройка входного интерфейса происходит как в схеме eth-eth, выходного — как в wlan-wlan.

Tor + obfsproxy


Для маскировки Tor трафика будем использовать obfsproxy.

Привожу пример настройки Tor:

/etc/tor/torrc
SocksPort 9050
RunAsDaemon 1
VirtualAddrNetwork 172.16.0.0/12
DNSPort 53
DNSListenAddress 127.0.0.1
AutomapHostsOnResolve 1
BridgeRelay 1
Exitpolicy reject *:*
ServerTransportPlugin obfs3 exec /usr/bin/obfsproxy managed 
obfs3 <адрес1:порт1> <ключ1>
obfs3 <адрес2:порт2> <ключ2>
obfs3 <адрес3:порт3> <ключ3>


Данные для подключения к серверам obfsproxy можно взять здесь.

OpenVPN


Для организации VPN будем использовать OpenVPN через TCP и в режиме L3 (tap-интерфейс). Используется TCP, поскольку Tor работает только TCP-трафиком. В сам же VPN-туннель можно пускать любой трафик. Для того, чтобы направить VPN трафик в Tor, будем «проксировать» весь VPN-трафик через Tor. OpenVPN поддерживает такую возможность.

Привожу пример настройки клиентской части OpenVPN с подробными комментариями:

/etc/openvpn/client.conf
сlient #Имя клиента
dev tun #Использовать L3-интерфейс
proto tcp #Задать TCP транспортным протоколом
socks-proxy 127.0.0.1 9050 #Использовать Tor как Socks-proxy. 
socks-proxy-retry #Пытаться подключаться многократно
# Внешний IP, на или за которым находится сервер OpenVPN и порт (на сервере или на сетевом устройстве, на котором настроен проброс портов до сервера)
remote 1.1.1.1 443 #Порт специально выбран таким образом, чтобы он совпадал с портом, используемым протоколом https. 
resolv-retry infinite #Подключаться до тех пор, пока подключение не будет осуществлено.
ca /etc/openvpn/keys/ca.crt #Сертификат сервера
cert /etc/openvpn/keys/client.crt #Сертификат клиента
key /etc/openvpn/keys/client.key #Приватный ключ клиента
tls-client #Использовать протокол TLS
tls-auth /etc/openvpn/keys/ta.key 1 #Ключ для аутентификации в TLS
auth SHA1 #Задать SHA1 как алгоритм хеширования
cipher AES-128-CBC #Задать основным алгоритмом шифрования AES с длиной ключа в 128 бит в режиме сцепления блоков.


По настройке сервера есть достаточно много инструкций в интернете. Ссылки я привел в «источниках» в конце статьи. Ключевым в настройке является совпадение параметров и наличие в конфиге сервера строчки «push «redirect-gateway def»». Она необходима, чтобы на клиенте установился маршрут по-умолчанию для проходящего трафика, который указывает на VPN сервер.

Тестирование


Для теста правильности работы пустим ping от подключенного ПК до tun-интерфейса VPN-сервера, будем снимать трафик с помощью tcpdump и анализировать в Wireshark для наглядности.

1) ICMP-запрос приходит на входной интерфейс Raspberry Pi.



Стоит обратить внимание на идентификаторы BE, LE и временную метку. Далее они нужны будут для того, чтобы опознать ICMP-запрос на стороне сервера.

2) ICMP-пакет прошёл процедуру обработки в OpenVPN и направился на порт 9050, который «слушается» Tor. Снимок трафика происходит на loopback интерфейсе Raspberry Pi.



3) Пакет выходит из Raspberry Pi и направляется на один из узлов сети Tor с серверной частью obfsproxy:



4) И снимок трафика уже на туннельном интерфейсе VPN-сервера. Тут же можно заметить, что сервер послал ответ.



Идентификаторы BE, LE и временная метка совпадают с теми, которые были в отправленном пакете.

5) На этом скриншоте представлен пакет, выходящий с VPN-сервера, в котором содержиться ICMP-reply.



Также я произвел тестирование пропускной способности этого решения с помощью iperf для TCP и UDP трафика до сервера. Тестирование проводилось с использованием Raspberry Pi model B+ и ОС Raspbian в домашней сети, так что цифры для других одноплатных компьютеров с другими ОС или другой сетевой средой могут отличаться.

Результаты:

— связка Tor + VPN+ obfsproxy
— только VPN
— чистый канал




Заключение


Потенциальные подводные камни:

1) Синхронизация времени. Поскольку tor выполняет криптооперации с проверкой временных меток, то время должно быть синхронизировано. К сожалению, время нужно будет синхронизировать каждый раз после выключения платы.

2) Размер mtu. DF-бит в отправляемых пакетах может привести к тому, что трафик будет «резаться», если где-то по пути запрещена фрагментация пакетов, а значение mtu меньше вашего.

3) Использование VPN throught Tor и obfsproxy не панацея от всего.

Если вы найдете или уже сталкивались с каким-то иными проблемами, то пиши в комментариях — я добавлю в статью.

Источники


1. habrahabr.ru/post/89420, habrahabr.ru/post/188274 — AP Linux
2. habrahabr.ru/post/88281 — Adhoc в Linux
3. www.torproject.org — официальный сайт Tor Project.
4. openvpn.net/index.php/open-source/documentation/manuals.html, help.ubuntu.ru/wiki/openvpn — Настройка OpenVPN.
Поделиться с друзьями
-->

Комментарии (25)


  1. Vindicar
    30.06.2016 12:40

    Решение интересное, но что-то не пойму — если вы позиционируете его как портативное, то как вы собираетесь переконфигурировать плату на лету, например, чтобы подцепиться к новому вай-фаю?


    1. Revery
      30.06.2016 12:56

      Доступно подключение по ssh. Я захожу с ssh-клиента на телефоне, если схемы «wlan-eth» или «wlan-wlan».
      Также есть различные веб-формы для администрирования Linux, но я пока не пробовал их использовать, поэтому не могу сказать насколько они удобны для этого.


  1. lolipop
    30.06.2016 14:12

    проще купить за 14$(включая доставку) китайский роутер, который умеет то же самое(и местами даже лучше)
    например, такой:


    1. aveselov
      30.06.2016 14:59

      А где реф ссылка?


      1. ionicman
        30.06.2016 15:29

        подробно
        первый встретившийся лот на али, ревизию не проверял

        Обратите внимание на ревизию в статье на mysku, только такую можно брать.


      1. lolipop
        30.06.2016 15:56

        регнулись 2 года назад и всё это время молчали, чтобы сейчас спросить это?


        1. aveselov
          30.06.2016 17:06

          ну я 2 года назад узнал что тут можно регнутся, а комменты тогда нельзя было оставлять


    1. Revery
      30.06.2016 16:49

      Возможно, мне стоило уточнить, что моё решение и не позиционируется как наилучшее из возможных. Скорее как одно из возможных решений, которое можно перенести на другие платформы (ведь описанная настройка вполне может быть осуществлена на другой платформе, главное, чтобы там был linux и нужные пакеты) и которое можно улучшить, а те у кого уже есть подобные платы могли бы перенастроить её без покупки ещё одного устройства.
      Как мне кажется, при использовании упомянутой связки и более-менее активном потоке трафика у этой платы будут ещё большие проседания по производительности, чем с платами типа Raspberry Pi, Banana Pi и прочих (судя по характеристикам).


    1. fenixlz
      01.07.2016 08:40

      А он умеет tor over VPN? На вашем обзоре на mysku ни слова об этом


      1. chelaxe
        01.07.2016 09:25

        он умеет OpenWRT… а дальше ручками


  1. rrrav
    30.06.2016 15:39

    В списке потенциальных подводных камней забыли упомянуть «пакет Яровой». Видимо все приватные ключи придется сдавать в органы (а потом они будут выложены в спаммерских базах).


    1. Liro
      30.06.2016 18:00
      +1

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

      Выдавать могут обязать вашего VPN провайдера ( в случае специализированного сервиса)/TOR. Люди работают в этой сфере не первый год, а РФ не первая страна третьего мира, пытающаяся влезть в личную жизнь граждан. Процедуры мягкого игнорирования правительственных запросов и фокусов с юрисдикциями у таких организаций давно отработаны, выдавать они ничего не будут (в большинстве своем).

      В случае частного VPS с поднятым шлюзом удачи им доказать, что он именно ваш и вы владеете ключами, а не дядя Вася с левого форума.

      Так что не так все кошмарно. Грустно, противно от отношения к народу, как к скоту — да. Но не смертельно.


    1. rrrav
      01.07.2016 12:18
      -1

      А в карму-то минусовать зачем?


  1. rrrav
    30.06.2016 18:20

    Пока не КНДР, но стремимся. После выборов вполне могут пойти дальше и резать тор и впн в наружные сети.
    Ну и по ходу хотелось бы узнать, насколько надежно обфускатор маскирует поток, или все равно провайдер имеет возможность отловить «нехороший трафик»?
    Пардон, ошибся уровнем, не туда ответил…


  1. simpleadmin
    30.06.2016 18:48
    +2

    Привожу пример своих настроек:
    /etc/hostapd/hostapd.conf
    Заголовок спойлера
    interface=wlan0 #Интерфейс
    driver=rtl871xdrv #Используемый драйвер
    ssid=AP #Название точки доступа
    hw_mode=g #Стандарт работы точки доступа
    channel=6 #Частотный диапазон
    macaddr_acl=0 #Не использовать списки доступа
    auth_algs=1 #Использовать WPA
    wpa=2 #Версия протокола
    wpa_passphrase=raspberry #Пароль для подключения
    wpa_key_mgmt=WPA-PSK #Метод аутентификации
    wpa_pairwise=TKIP #Алгоритмы работы с ключами и шифрованием
    rsn_pairwise=CCMP


    1. Revery
      30.06.2016 22:39

      Не на 40 из тех соображений, что у меня вокруг довольно много других точек доступа. Не хотел, чтобы интерферировали, и вроде бы обычный hostapd не дает включить 40, если вокруг есть точки на такой же частоте.

      Что касается утечек на уровне браузера или пользовательского ПО, то это уже задача за рамками данной статьи, потому что тут уже зависит от аккуратности пользователя, настроек браузера, плагинов и правильности настройки VPN сервера, поскольку это решение отвечает только за безопасный канал до VPN-сервера. Но если говорить об отрезке от выходного интерфейса платы до VPN сервера, то здесь я не заметил никаких утечек пользовательского трафика.


      1. simpleadmin
        30.06.2016 22:56

        Не на 40 из тех соображений, что у меня вокруг довольно много других точек доступа. Не хотел, чтобы интерферировали, и вроде бы обычный hostapd не дает включить 40, если вокруг есть точки на такой же частоте.

        Да, нужно патчить hostapd, я делал зимой для 2.5, если интересно могу поискать.


        1. Revery
          05.07.2016 16:55

          Да. Напишите, если сможете найти.
          Я добавлю в статью.


  1. s256
    30.06.2016 19:15

    Было бы интересно оформить подобную сборку в виде docker контейнера


  1. Maxlinus
    01.07.2016 16:04

    сильно не пинайте но вот я думаю тоже как вариант routerboard.com/RBmAPL-2nD плюс wiki.mikrotik.com/wiki/Use_Metarouter_to_Implement_Tor_Anonymity_Software :)


    1. chelaxe
      02.07.2016 06:54

      Есть у меня такой. Минус в том что нет USB и один Ethernet порт, а так железка прекрасная.


      1. simpleadmin
        02.07.2016 11:11

        Если не лень, сделайте тест — https://2ip.ru/privacy/
        Лучше из нескольких браузеров.

        Особенно интересуют:
        — Утечка IP через Flash
        — Утечка IP через WebRTC

        Совпали ли с реальным?


        1. simpleadmin
          02.07.2016 11:18

          в идеале должно быть как-то так

          Заголовок спойлера
          image


    1. chelaxe
      02.07.2016 07:02

      А по ссылке они делают прозрачное проксирование 80 порта через TOR. Предлагая TOR поднять на виртуалке в роутере на OpenWRT. Теперь собственно вопрос: а почему не взять роутер с OpenWRT и не сделать на нем это все? Можно и Squid привязать и https прозрачно проксировать. Сделать wpad. И openwpn нормальный или даже SoftEther запустить. Для таких поделок OpenWRT самое то.


  1. Rampages
    10.11.2016 18:14

    Допустим убили вы дедушку, но это произошло в прошлом другой ветки событий и вашу историю/существование, оно не должно затрагивать.
    На мой взгляд должно существовать бесконечное количество альтернативных вариантов событий начиная с самого начала бытия.