Авторизация  
TEXHO

SBC+VPN+Tor+obfsproxy в кармане(2016)

В теме 1 сообщение

В этой статье будет рассказано об одном из вариантов получения переносного решения с 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

 

1d2b01a14edb488090b4d2620500cb14.png

 

2) wlan-eth

 

53f0973b30d4400fb39f387dc09d9e2f.png

 

3) wlan-wlan

 

b75c1d6de0284f44b850916759e45a2e.png

 

4) eth-wlan

 

a5b261b2090646178edd0f61c27f0370.png

 

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

 

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
или

 

Code:
 echo 1 > /proc/sys/net/ipv4/ip_forward
Для проверки можно использовать команду:

 

Code:
cat /proc/sys/net/ipv4/ip_forward
Она должна вернуть «1».

 

iptables

 

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

Code:
 iptables -t nat -A POSTROUTING -s 10.5.5.0/24 -o tun0 -j MASQUERADE
Вместо этого можно было бы прописать статические маршруты и статический адрес для клиента. Или использовать ccd.

 

 

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

 

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

Code:
sudo apt-get updatesudo apt-get upgrade
Установка из репозиториев:

Code:
 sudo apt-get install python2.7 python-pip python-dev build-essential tor openvpn obfs-proxy
Если вы хотите схему с точкой доступа, то помимо этого установим hostapd и DHCP-cервер:

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

 

 

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

 

Схема eth-eth

 

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

Code:
ip a add 10.5.5.2/24 dev <интерфейс>ip route add default gw 10.5.5.1
А в файл /etc/resolv.conf добавить запись:

Code:
 nameserver 10.8.0.1
Схема wlan-eth

 

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

 

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

 

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

 

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

Code:
 nmcli d wifi connect <SSID точки> password <пароль> iface <интерфейс>
Схема eth-wlan

 

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

 

Tor + obfsproxy

 

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

 

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

 

/etc/tor/torrc
Code:
SocksPort 9050RunAsDaemon 1VirtualAddrNetwork 172.16.0.0/12DNSPort 53DNSListenAddress 127.0.0.1AutomapHostsOnResolve 1BridgeRelay 1Exitpolicy reject *:*ServerTransportPlugin obfs3 exec /usr/bin/obfsproxy managedobfs3 <адрес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
Code:
с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 #Использовать протокол TLStls-auth /etc/openvpn/keys/ta.key 1 #Ключ для аутентификации в TLSauth SHA1 #Задать SHA1 как алгоритм хешированияcipher AES-128-CBC #Задать основным алгоритмом шифрования AES с длиной ключа в 128 бит в режиме сцепления блоков.
По настройке сервера есть достаточно много инструкцией в интернете. Ссылки я привел в «источниках» в конце статьи. Ключевым в настройке является совпадение параметров и наличие в конфиге сервера строчки «push «redirect-gateway def»». Она необходима, чтобы на клиенте установился маршрут по-умолчанию для проходящего трафика, который указывает на VPN сервер.

 

 

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

 

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

 

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

 

06607de971db46739dff5b6de8d56683.png

 

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

 

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

 

0be76069ef36441ca4de0ce5d8abb41e.png

 

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

 

920abf29455a484f9f0d3738956f8a36.png

 

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

 

570570812e554f3bb640a78d68047fc4.png

 

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

 

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

 

031bedb3368c48939446c62b2afe4ce8.png

 

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

 

Результаты:

 

92e385fa74ca43eea9e5ccd80e8c4cb1.png — связка Tor + VPN+ obfsproxy

17cf6e626b2544658c5202ba1fe19121.png — только VPN

b96247ed05604a57b4d8c39921adf383.png — чистый канал

 

135c22e1ad43472fb34c85edee20e724.png

 

10f58671e7e3449dbaaf4910bf56a16e.png

 

 

Заключение

 

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

 

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

 

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

 

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

(с) copypaste

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация