Два экземпляра прокси-сервера Dante с двумя интерфейсами.

Вопрос или проблема

Я запускаю 2 экземпляра сервера Dante на своей Linux машине, один из них называется danted, который должен подключать меня к интернету через кабель Ethernet, а другой – sockd, который должен подключать меня через соединение OpenVPN.

Первый, danted, настроен на использование моего Ethernet кабеля (ens33):

internal: ens33 port=1080
external: ens33

Второй, sockd, настроен на использование интерфейса OpenVPN (tun0):

internal: ens33 port=2080
external: tun0

Серверы Dante настроены правильно, и когда OpenVPN не подключен, danted работает нормально, но когда OpenVPN подключается, danted перестает работать. Когда я проверяю его журналы, я просто вижу, что соединение истекает по времени.

Моя таблица маршрутизации, когда OpenVPN не подключен, выглядит так:

default via 192.168.1.1 dev ens33 src 192.168.1.10 metric 202 
default via 192.168.1.1 dev ens33 proto dhcp metric 20001 
169.254.0.0/16 dev ens33 scope link metric 1000 
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.10 metric 1 
192.168.1.0/24 dev ens33 proto dhcp scope link src 192.168.1.10 metric 202 

И когда OpenVPN подключен, она выглядит так:

0.0.0.0/1 via 10.123.58.1 dev tun0 
default via 192.168.1.1 dev ens33 src 192.168.1.10 metric 202 
default via 192.168.1.1 dev ens33 proto dhcp metric 20001 
10.123.58.0/23 dev tun0 proto kernel scope link src 10.123.58.65 
128.0.0.0/1 via 10.123.58.1 dev tun0 
169.254.0.0/16 dev ens33 scope link metric 1000 
openvpn.server.wan.ipaddress via 192.168.1.1 dev ens33 
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.10 metric 1 
192.168.1.0/24 dev ens33 proto dhcp scope link src 192.168.1.10 metric 202

Таким образом, OpenVPN добавляет 4 новых маршрута в мою таблицу. Я пробовал поочередно удалять каждое из этих правил или выполнил ip route flush dev tun0 или удалял правило 0/1 и добавлял правило по умолчанию для интерфейса tun0; но когда я пробую это, и тестирую прокси-сервер sockd, мой IP – это IP моего Ethernet кабеля, а не IP сервера OpenVPN.

Я понятия не имею, как это исправить, я много гуглил по этому поводу, я думал, что это простая задача, так как прокси-сервер Dante просто связывается с внешними соединениями.

Резюме для баунти:

Я пробовал использовать IPv4 адреса моего интерфейса вместо имен интерфейсов, например, использовал 192.168.1.10 вместо ens33 и использовал 10.123.58.1 вместо tun0, но это не решило проблему (я знаю, что внутренний адрес OpenVPN изменяется каждый раз при переподключении).

Я указываю внешний (исходящий) интерфейс в конфигурации Dante, поэтому, насколько я понимаю, он на самом деле не должен использовать таблицу маршрутизации Ubuntu, он просто должен слушать входящие соединения и перенаправлять их на внешний интерфейс? Я не понимаю, почему добавленные маршруты OpenVPN вызывают у меня проблемы, даже если я могу легко пинговать компьютеры в моей локальной сети, я проверил нет добавленных правил фаервола в моих iptables (iptables -n -v -L).

Вот логи, когда я тестирую сервер SOCKS:

[18:18] Testing Started.
    Proxy Server
    Address:    192.168.1.10:1080
    Protocol:   SOCKS 5
    Authentication: NO

[18:18] Starting: Test 1: Connection to the Proxy Server
[18:18] IP Address: 192.168.1.10
[18:18] Connection established
[18:18] Test passed.
[18:18] Starting: Test 2: Connection through the Proxy Server
[18:18] Authentication was successful.
[18:49] Error : the proxy server cannot establish connection to www.google.com:80
    Error = 0x06 (Timeout).
    Please confirm that the target host address is correct.
    The error may also indicate that the proxy server is not operating properly.
[18:49] Test failed.
[18:49] Testing Finished.

Целевой адрес хоста правильный, я проверил логи dante-server, как я уже сказал ранее, и я вижу IP-адрес google.com:

Aug 26 19:01:11 (1629988271.706256) danted[106897]: info: pass(2): tcp/connect ]: 0 -> 192.168.1.15.9786 192.168.1.10.1080 -> 0, 0 -> 192.168.1.10.9786 142.250.186.174.443 -> 0: connect timeout.  Session duration: 31s

Когда OpenVPN отключен, успешное подключение выглядит так:

Aug 26 19:06:18 (1629988578.802869) danted[106897]: info: pass(2): tcp/connect ]: 0 -> 192.168.1.15.9796 192.168.1.10.1080 -> 0, 0 -> 192.168.1.129.9796 142.250.185.238.443 -> 0: local client closed.  Session duration: 10s

Мой вопрос конкретный о Dante-SOCKS5-Server, хотя я пробовал Squid-HTTPS-Server и у меня была такая же проблема с ним:

Мой вопрос конкретный о Dante-SOCKS5-Server, хотя я пробовал Squid-HTTPS-Server и у меня была такая же проблема с ним:
[05:40] Starting: Test 1: Connection to the Proxy Server
[05:40] IP Address: 192.168.1.10
[05:40] Connection established
[05:40] Test passed.
[05:40] Starting: Test 2: Connection through the Proxy Server
[06:40] Error : the proxy server cannot establish connection with 142.250.186.174:443
    The error indicates that the target host is down or unreachable.
    Please try to use another host and/or port as a test target.
    The proxy server reply header is:
        HTTP/1.1 503 Service Unavailable
        Server: squid/4.10
        Mime-Version: 1.0
        Date: Thu, 26 Aug 2021 16:36:40 GMT
        Content-Type: text/html;charset=utf-8
        Content-Length: 3438
        X-Squid-Error: ERR_CONNECT_FAIL 110
        Vary: Accept-Language
        Content-Language: en
[06:40] Test failed.
[06:40] Testing Finished.

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

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

  1. Выберите имена для ваших интерфейсов Wireguard. Я бы рекомендовал использовать что-то вроде местоположения VPN сервера или другое запоминающееся имя вместо простых чисел. Например, wg-us-nyc вместо wg0.

  2. Отредактируйте файл /etc/iproute2/rt_tables, чтобы добавить таблицу маршрутизации для каждого интерфейса. Например:

101      wg-us-nyc
102      wg-uk-lon

Здесь 101 и 102 – это идентификаторы таблиц. Вы не обязаны использовать именно эти числа, любые числа от 1 до 255 подойдут, пока нет существующих записей в rt_tables, использующих эти числа.

  1. Переименуйте ваши конфигурации Wireguard в соответствие с выбранными именами интерфейсов. Например, конфигурация для wg-us-nyc должна быть названа /etc/wireguard/wg-us-nyc.conf.

  2. В каждой конфигурации добавьте следующее в раздел [Interface]:

[Interface]
Table = <interface_name>
PostUp = ip rule add from $(ip -4 -o a l %i | awk -F"https://serverfault.com/" +' '{print $4}') lookup %i
PreDown = ip rule delete from $(ip -4 -o a l %i | awk -F"https://serverfault.com/" +' '{print $4}')

Здесь вы должны заменить <interface_name> на фактическое имя интерфейса (wg-us-nyc или wg-uk-lon в этом примере). Вы не можете использовать %i, потому что wg-quick не поддерживает его для имени таблицы.

Вышеуказанное предполагает, что ваши VPN используют только IPv4. Если вам нужен IPv6, вам потребуется самостоятельно определить конкретные команды, но применяются те же принципы.

Очевидно, для работы этого требуется, чтобы все IP-адреса ваших интерфейсов Wireguard были разными.

  1. Используйте wg-quick для подключения ваших интерфейсов Wireguard:
sudo systemctl enable wg-quick@wg-us-nyc
sudo systemctl enable wg-quick@wg-uk-lon

sudo systemctl start wg-quick@wg-us-nyc
sudo systemctl start wg-quick@wg-uk-lon

Ответ или решение

Вопрос, с точки зрения сетевых технологий и подсистем маршрутизации, требует тщательного анализа конфигурации двух инстансов прокси-сервера Dante с различными интерфейсами сети, а именно ethernet (ens33) и OpenVPN (tun0). Основная проблема заключается в том, что при установлении соединения через OpenVPN, первый прокси-сервер на ethernet интерфейсе перестает работать.

Теоретическая часть

Прежде чем перейти к решению, важно рассмотреть, как происходит маршрутизация трафика в Linux при использовании нескольких сетевых интерфейсов. Когда подключается OpenVPN, он вносит изменения в таблицу маршрутизации, чтобы направлять весь трафик через туннель. Это делается с помощью добавления правил нулевого маршрута 0.0.0.0/1 и 128.0.0.0/1, которые захватывают весь остальной трафик, тем самым обходя стандартный маршрут через ethernet (ens33).

Это поведение нередко вызывает проблемы в многосетевых конфигурациях, где требуется использовать разные шлюзы для различных потоков трафика. В данной ситуации, прокси-серверы Dante пытаются взаимодействовать с внешней сетью через свой "external" интерфейс, но изменения в таблице маршрутизации препятствуют этому, перенаправляя трафик через VPN, когда это не является необходимым.

Пример

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

Применение

Чтобы разрешить эту проблему, мы можем рассмотреть возможность использования маркировки политики маршрутизации (Policy-Based Routing, PBR). Это позволит нам назначить различным потокам трафика уникальные метки, и на основе этих меток контролировать, какой маршрутизатор должен использоваться, тем самым эффективно разделяя трафик между интерфейсами ens33 и tun0.

  1. Создание дополнительных таблиц маршрутизации:

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

    В файле /etc/iproute2/rt_tables создайте записи для новых таблиц:

    100  ens33Table
    101  tun0Table
  2. Настройка правил маршрутизации:

    Используйте правила ip rule, чтобы направлять трафик через созданные таблицы.

    ip rule add from <ens33-сеть> lookup ens33Table
    ip rule add from <tun0-сеть> lookup tun0Table

    Здесь <ens33-сеть> и <tun0-сеть> — это соответствующие диапазоны IP-адресов сетей для интерфейсов.

  3. Настройка маршрутов в новых таблицах:

    В новых таблицах задайте непосредственно маршруты для каждого интерфейса. Например, в таблице ens33Table установите стандартный маршрут через шлюз ens33, а в таблице tun0Table — через шлюз tun0.

    ip route add default via 192.168.1.1 dev ens33 table ens33Table
    ip route add default via 10.123.58.1 dev tun0 table tun0Table
  4. Конфигурация Dante:

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

    В конфигурации danted добавить:

    internal: ens33 port=1080
    external: ens33

    В конфигурации sockd добавить:

    internal: ens33 port=2080
    external: tun0

Заключительные замечания

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

Оцените материал
Добавить комментарий

Капча загружается...