НейроАгент

Почему OpenVPN блокирует SOCKS прокси 3proxy

Решение проблемы недоступности SOCKS прокси 3proxy после консольного подключения к OpenVPN в VirtualBox. Узнайте о маршрутизации и настройках OpenVPN.

Почему после подключения к OpenVPN из консоли перестаёт работать SOCKS прокси 3proxy на той же виртуальной машине VirtualBox?

Подробное описание проблемы:

Есть две виртуальные машины VirtualBox для тестов:

  1. Ubuntu 18
  2. Alpine Linux

Они между собой никак не связаны, проблема проявляется на обеих системах независимо, что указывает на то, что дело не в конкретном дистрибутиве Linux.

Настройки:

  • Файл конфигурации OpenVPN (ovpn)
  • OpenVPN установлен через менеджер пакетов
  • На виртуальной машине установлен SOCKS прокси 3proxy с простой конфигурацией для тестов
  • Необходимый порт проброшен в VirtualBox на хост-машину
  • SOCKS прокси используется некоторыми программами на хост-машине

Проблема:

  • При подключении к OpenVPN через GUI сетевой менеджера в Ubuntu 18: интернет есть через OpenVPN, SOCKS прокси работает, программы подключенные к прокси ходят через OpenVPN (что и требуется)
  • При подключении через консоль командой “openvpn 1.ovpn”: подключение успешно устанавливается, но SOCKS прокси становится недоступен с хоста
  • При отключении OpenVPN SOCKS прокси снова работает

Дополнительные наблюдения:

  • Порт SOCKS прокси доступен (проверено через telnet)
  • Через SOCKS прокси интернет не ходит

Файл конфигурации 1.ovpn:

nobind
client
auth-nocache

# Path to certificates here
ca "ca.crt"
cert "blabla.crt"
key "blabla.key"

remote-cert-tls server
dev tun
proto tcp

resolv-retry infinite
persist-key
persist-tun

# Block outside DNS servers
# 
# COMMENT THIS LINE FOR
#   KEENETIC ROUTERS
#
setenv opt block-outside-dns

# OpenVPN 2.5 compatibility
setenv opt data-ciphers AES-128-GCM:AES-256-GCM

# Remote connections
remote-random
server-poll-timeout 15
connect-retry-max 20

remote blabla.com 23
remote blabla.com 43
remote blabla.com 49
remote blabla.com 53
remote  blabla.com 123
remote blabla.com 161
remote blabla.com 179
remote blabla.com 465
remote blabla.com 587
remote blabla.com 993
remote blabla.com 995
remote blabla.com 1194
remote blabla.com 443
remote blabla.com 495
НейроАгент

Проблема возникает из-за того, что при подключении к OpenVPN через консоль происходит изменение таблицы маршрутизации, которое блокирует доступ к локальным службам, включая SOCKS прокси 3proxy. В отличие от GUI подключения, консольная версия OpenVPN автоматически добавляет маршруты, направляющие весь трафик через VPN-туннель, включая трафик к localhost, что делает недоступным локальный SOCKS прокси.

Содержание

Основная причина проблемы

При подключении к OpenVPN через консоль с использованием команды openvpn 1.ovpn, клиент OpenVPN автоматически изменяет системную таблицу маршрутизации. Это изменение включает добавление маршрутов по умолчанию через VPN-туннель, которые перенаправляют весь трафик, включая трафик к локальным службам таким как SOCKS прокси 3proxy.

Согласно исследованиям, OpenVPN при консольном подключении обычно выполняет команду redirect-gateway (или аналогичную), которая добавляет маршруты типа 0.0.0.0/1 и 128.0.0.0/1 через интерфейс tun0. Эти маршруты захватывают весь трафик, включая подключения к localhost:порт_прокси.

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

Различия между GUI и консольным подключением

Исследования показывают, что существуют значительные различия в поведении OpenVPN при подключении через графический интерфейс и через консоль:

GUI подключение:

  • Часто использует более консервативные настройки маршрутизации
  • Может не применять redirect-gateway def1 автоматически
  • Сохраняет доступ к локальным сетевым службам

Консольное подключение:

  • Автоматически добавляет маршруты через VPN-туннель
  • Создает два маршрута-квантора: 0.0.0.0/1 и 128.0.0.0/1 через tun0
  • Полностью перенаправляет трафик через VPN, включая localhost

Как отмечено в одном из источников, “when using ‘def1’ (it’s the right thing to do), OpenVPN will install two routes, namely 128.0.0.0/1 and 0.0.0.0/1), and won’t touch the default gateway” [источник 10].

Изменения в таблице маршрутизации

При консольном подключении к OpenVPN происходят следующие изменения в таблице маршрутизации:

bash
# До подключения к OpenVPN
default via 192.168.1.1 dev eth0 
127.0.0.1/8 dev lo scope host

# После консольного подключения
0.0.0.0/1 via 10.8.0.1 dev tun0
128.0.0.0/1 via 10.8.0.1 dev tun0
default via 10.8.0.1 dev tun0
127.0.0.1/8 dev lo scope host

Эти изменения означают, что:

  1. Весь трафик к IP-адресам с первым октетом 0-127 идет через 128.0.0.0/1
  2. Весь трафик к IP-адресам с первым октетом 128-255 идет через 0.0.0.0/1
  3. Оба маршрута указывают на VPN-шлюз 10.8.0.1

В результате подключения к localhost:port SOCKS прокси также пытаются пройти через VPN-туннель, что приводит к недоступности службы.

Решения и обходные пути

1. Отключение перенаправления шлюза в конфигурации OpenVPN

Добавьте в файл конфигурации 1.ovpn следующие строки:

# Не перенаправлять весь трафик через VPN
redirect-gateway def1 bypass-dhcp

# Или полностью отключить перенаправление шлюза
# redirect-gateway no

2. Создание кастомной таблицы маршрутизации

Создайте отдельную таблицу маршрутизации для VPN и настройте правила accordingly:

bash
# Добавьте в скрипт запуска OpenVPN
ip route add default via 10.8.0.1 dev tun0 table vpn
ip rule add from all lookup vpn pref 10000

3. Использование split-tunneling

Настройте OpenVPN для маршрутизации только определенных сетей через VPN:

# Маршрутизация только определенных сетей через VPN
route 10.0.0.0 255.0.0.0
route 172.16.0.0 255.240.0.0
route 192.168.0.0 255.255.0.0

4. Настройка 3proxy для работы с VPN

Измените конфигурацию 3proxy для прослушивания только на loopback интерфейсе:

conf
# В конфиге 3proxy
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536
timeouts 1 5 30 60 180 1800 15 60

# Слушать только на localhost
socks -p1080 -a127.0.0.1

Настройка OpenVPN для сохранения доступа к локальным службам

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

conf
# Базовые настройки
nobind
client
auth-nocache

# Пути к сертификатам
ca "ca.crt"
cert "blabla.crt"
key "blabla.key"
remote-cert-tls server
dev tun
proto tcp

# Настройки переоткрытия соединений
resolv-retry infinite
persist-key
persist-tun

# Важно: отключаем блокировку внешних DNS
# setenv opt block-outside-dns

# Совместимость с OpenVPN 2.5
setenv opt data-ciphers AES-128-GCM:AES-256-GCM

# Настройки удаленных серверов
remote-random
server-poll-timeout 15
connect-retry-max 20

# Ключевые изменения для сохранения доступа к локальным службам
redirect-gateway def1 bypass-dhcp

# Или используйте split-tunneling вместо перенаправления шлюза
# route 10.0.0.0 255.0.0.0
# route 172.16.0.0 255.240.0.0
# route 192.168.0.0 255.255.0.0

# Удаленные серверы
remote blabla.com 23
remote blabla.com 43
# ... остальные remote директивы

Если вы хотите полностью отключить перенаправление шлюза, используйте:

redirect-gateway no

Заключение

  • Основная проблема: Консольное подключение к OpenVPN изменяет таблицу маршрутизации, блокируя доступ к локальным службам таким как SOCKS прокси
  • Ключевое отличие: GUI подключение обычно не так агрессивно изменяет маршрутизацию, сохраняя доступ к localhost службам
  • Решения: Отключить перенаправление шлюза, использовать split-tunneling, настроить отдельные таблицы маршрутизации или изменить конфигурацию 3proxy
  • Рекомендация: Для тестовых сред лучше использовать redirect-gateway no в конфигурации OpenVPN при консольном подключении, чтобы избежать проблем с локальными службами

Проблема связана с тем, что OpenVPN по умолчанию при консольном подключении пытается маршрутизировать весь трафик через VPN-туннель, включая трафик к локальным службам. Правильная настройка конфигурации OpenVPN позволяет решить эту проблему и сохранить доступ к SOCKS прокси 3proxy.

Источники

  1. OpenVPN routing table change - Super User
  2. How to stop openvpn from changing the routing table? - Reddit
  3. RoutedLans – OpenVPN Community Wiki
  4. Prevent the client routing table modification during OpenVPN connection - OpenVPN Forum
  5. How to push the routing table to the client? - OpenVPN Forum
  6. OpenVPN - Understand the routing table + How to route only the traffic to a specific ip via the VPN - Unix & Linux Stack Exchange
  7. iptables - Rerouting traffic from OpenVPN client for local-only access - Unix & Linux Stack Exchange
  8. How can we change the routes that are created by openvpn? - OpenVPN Forum
  9. problem setting up routing in openvpn - OpenVPN Forum
  10. Default routing behavior in OpenVPN - OpenVPN Forum