Собрать tunsocks очень сложно. Я предлагаю менее элегантное, но более доступное решение на базе виртуалки. Достоинством является кроссплатформенность и то, что можно будет преобразовать в прокси любой VPN.
В главном окне VirtualBox: Файл - Настройки - Сеть - Виртуальные сети хоста - значок + (добавляете новую сеть) vboxnet0. Настройки vboxnet0 такие:
Адаптер:
IPv4 адрес: 192.168.56.1
IPv4 маска сети: 255.255.255.0
DHCP сервер:
Отключен
Устанавливаете Windows в виртуалку.
У виртуалки должно быть два сетевых адаптера.
Это уже настройки самой виртуалки, а не глобальные:
Адаптер 1. NAT, тут всё понятно, по умолчанию.
Адаптер 2. Тип подключения: Виртуальный адаптер хоста. Имя: vboxnet0 (которое мы создавали в глобальных настройках).
В реальной системе (в хосте) должен появиться адаптер vboxnet0. Если нет (например, в Linux), в Network Manager’е выберите “Добавить подключение - Ethernet”.
Его нужно настроить. Имя: VirtualBox.
Параметры IPv6: Игнорировать
Параметры IPv4: Вручную
Адрес: 192.168.56.1
Маска: 24 (указать надо 255.255.255.0, оно превратится в 24)
Шлюз: пустой (обязательно должен быть пустой, иначе пропадет интернет)
DNS: Любой, например 8.8.8.8
Вкладка Ethernet:
Устройство: vboxnet0
Запустите виртуальную Windows, установите гостевые дополнения.
Теперь настройка сети внутри виртуальной Windows:
1-ый адаптер (можно переименовать в NAT): Свойства - оставить только галочку на “Протокол Интернета (TCP/IP)” - Свойства - “Получить IP адрес автоматически”, DNS тоже автоматически или можно указать свой.
2-ый адаптер (можно переименовать в Internal): Свойства - оставить только галочку на “Протокол Интернета (TCP/IP)” - Свойства:
IP-адрес: 192.168.56.2
Маска подсети: 255.255.255.0
Основной шлюз: пустой (обязательно должен быть пустой, иначе пропадет интернет)
DNS сервера по желанию, например 192.168.56.1, 8.8.8.8 или пустой
Итак, мы создали виртуальную внутреннюю сеть между хостом (192.168.56.1) и виртуалкой (192.168.56.2). (Адаптер 2)
При этом виртуалка также получает интернет через NAT. (Адаптер 1)
Поднимаете в виртуальной Windows любой VPN.
А теперь надо установить в виртуальную Windows какой-нибудь локальный прокси, например, Proxomitron, который примет интернет от виртуального VPN и перешлет в хост с помощью прокси.
Proxomitron соответственно должен быть запущен вместе с виртуальным VPN.
Настройки Proxomitron такие:
В главном окне снимаете все галочки.
Config - Don’t use textures (отключает цветную тему, требуется перезапуск)
Access - Allow access to the following IP address range - From 192.168.56.1 to 192.168.56.2
Blockfile - удаляете все строчки
HTTP - локальный порт любой, например 8020, следите чтобы не было конфликтов
File - Save default settings
Теперь в реальной системе (в хосте) в браузерах вы можете указать HTTP и HTTPS прокси
192.168.56.2 порт 8020
И браузеры получат доступ к VPN через прокси.
Получится VPN > Proxy конвертер с помощью виртуалки.
Чтобы не было утечек (коннектов мимо прокси) браузеры нужно дополнительно настроить.
На примере Firefox отключить в about:config следующие опции:
media.peerconnection.enabled - false (WebRTC)
network.dns.disableIPv6 - true (IPv6)
network.notify.IPv6 - false (IPv6)
network.http.http3.enable - false (HTTP3/QUIC UDP) в хромобраузерах chrome://flags #enable-quic - Disabled
network.proxy.failover_direct - false (из-за проблем с прокси может быть fallback в direct)
Но, во всей этой системе нет Kill switch. Если виртуальный VPN отключится (во время реконнекта tun шлюз разорвется), то Proxomitron будет транслировать в прокси интернет, который виртуалка получает по NAT.
Так что забота о Kill switch перекладывается на виртуальный VPN. С OpenVPN наверняка будут проблемы. Wireguard держит шлюз надежнее.
Необязательно:
Можно сделать 100% рабочий Kill Switch. Но это ограничит протоколы VPN до TCP на 443 порту.
В виртуалке отключаем NAT адаптер (в VirtualBox снимаем галочку “кабель подключен” или можно отключить адаптер в самой виртуальной системе). Итак, виртуалка лишена интернета. Надо ей его провести. Проведем его все через тот же виртуальный сетевой интерфейс.
Для этого на реальной системе поднимаем другой локальный прокси. Это может быть тоже Proxomitron. В Linux хосте это может быть polipo. Вот его конфиг:
logSyslog = false
#logFile = polipo.log
proxyAddress = 192.168.56.1
proxyPort = 8060
allowedClients = 192.168.56.2, 192.168.56.1, 127.0.0.1
allowedPorts = 1-65535
proxyName = "direct"
cacheIsShared = false
#socksParentProxy = 127.0.0.1:9050
#socksProxyType = socks5
#parentProxy = 127.0.0.1:8080
chunkHighMark = 67108864
diskCacheRoot = ""
localDocumentRoot = ""
disableLocalInterface = true
disableConfiguration = true
dnsUseGethostbyname = yes
disableVia = true
censoredHeaders = from,accept-language,x-pad,link
censorReferer = maybe
maxConnectionAge = 10m
maxConnectionRequests = 120
serverMaxSlots = 16
serverSlots = 8
tunnelAllowedPorts = 1-65535
Теперь в виртуальном VPN мы должны указать этот вышестоящий HTTP прокси: 192.168.56.1:8060
Через прокси могут работать, например OpenVPN TCP и SoftEther.
Если у виртуального VPN будут проблемы и он разорвет шлюз, то в виртуалке интернета не будет (кроме вышестоящего прокси, но о нем знает только VPN клиент и будет через него реконнектится). А Proxomitron, который раздает нам VPN интернет в реальную систему, останется без интернета и будет ждать реконнекта VPN. Тем самый предотвращается утечка в случае сбоев.
Вообще, такой способ позволяет проводить хитрые манипуляции. Можно, например, пустить OpenVPN через любой прокси (если в polipo указать еще более вышестоящий). Но все прокси ограничены TCP.
У меня появилась возможность использовать SoftEther VPNGate в Linux, хотя SoftEther VPNGate не поддерживает Linux.