qzeleza / kvas

vpn и shadowsocks клиент для роутеров keenetic
Other
649 stars 41 forks source link

Не перезапускать соединение, при команде kvas add\del #54

Closed badigit closed 1 year ago

badigit commented 1 year ago

Описание проблемы. Приветствую. Провайдер Билайн. Подключение "DHCP + L2TP", в интернет выход через L2TP. При каждом выполнении kvas add\del - перезагружается соединение с провайдером. *Из за особенностей оборудования кинетик сразу не может восстановить L2TP и еще проходит 1-2 минуты. Поэтому хотелось бы избежать перезапуска.

Мои шаги, приведшие к ошибке/проблеме. kvas add domain.com

Ожидания о поведении программы.

Снимки экрана или сам текст с консоли. Лог кинетика: Май 29 18:42:08 КВАС Запущен файл /opt/apps/kvas/bin/main/ipset Май 29 18:42:13 ndm Network::Interface::Base: "GigabitEthernet1": interface is down. Май 29 18:42:13 ndm Network::Interface::Ppp: "L2TP0": connection service standby. Май 29 18:42:13 pppd_L2TP0 Modem hangup Май 29 18:42:13 ndm Network::Interface::PppTunnel: "L2TP0": via interface is down. Май 29 18:42:13 pppd_L2TP0 Connect time 984.3 minutes.

Информация о роутере (пожалуйста, заполните следующую информацию):

qzeleza commented 1 year ago

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

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

badigit commented 1 year ago

И еще нюанс - подскажите какой механизм применяется для перезагрузки соединений? Я обратил внимание, что если инициатор: квас, то как раз есть проблема что L2TP не может восстановиться n время.

Однако, если я делаю это через веб интерфейс кинетика (нажимаю "перезагрузить"] то реконнект быстрый, нет никаких "затупов". Это наводит на мысль что сам кинетик использует другой механизм перезапуска (graceful), это корректно работает и на железяках провайдера, повторный реконнект происходит быстро.

Возможно ли применение такого реконнекта в квас? Могу какую-нибудь еще полезную информацию предоставить? image

Вот лог кинетика при нажатии "перезагрузить"

Май 31 13:05:41 pppd_L2TP0 Modem hangup Май 31 13:05:41 ndm Network::Interface::Ppp: "L2TP0": connection service standby. Май 31 13:05:41 pppd_L2TP0 Connect time 5.0 minutes. Май 31 13:05:41 pppd_L2TP0 Sent 31115149 bytes, received 18175996 bytes. Май 31 13:05:41 ndm Network::Interface::Base: "L2TP0": interface is down. Май 31 13:05:41 pppd_L2TP0 Connection terminated. Май 31 13:05:41 pppd_L2TP0 l2tp: shutting down control connection Май 31 13:05:41 pppd_L2TP0 l2tp: sending cdn Май 31 13:05:41 pppd_L2TP0 l2tp: sending stopccn Май 31 13:05:41 pppd_L2TP0 l2tp: recv [CTRL ZLB <Ns 9> <Nr 3> <RNs 2> <RNr 8>] Май 31 13:05:41 ndm Network::Interface::Base: "L2TP0": interface is up. Май 31 13:05:41 pppd_L2TP0 l2tp: recv [CTRL ZLB <Ns 9> <Nr 3> <RNs 2> <RNr 9>] Май 31 13:05:41 ndm Network::Interface::PppTunnel: "L2TP0": interface state is changed, reconnecting. Май 31 13:05:41 ndm Network::Interface::L2tp: "L2TP0": interface is down. Май 31 13:05:41 ndm Network::Interface::L2tp: "L2TP0": interface is down. Май 31 13:05:41 ndm Network::Interface::Ip: "L2TP0": IP address cleared. Май 31 13:05:41 pppd_L2TP0 Exit. Май 31 13:05:41 ndm Network::Interface::PppTunnel: "L2TP0": interface state is changed, reconnecting. Май 31 13:05:41 ndm Network::InterfaceFlusher: flushed L2TP0 conntrack and route cache. Май 31 13:05:41 ndm Network::InternetChecker: Internet access lost (status: 0x0000). Май 31 13:05:41 upnp shutting down MiniUPnPd Май 31 13:05:41 ndm Core::Session: client disconnected. Май 31 13:05:41 ndm Network::InterfaceFlusher: flushed GigabitEthernet1 conntrack and route cache.

qzeleza commented 1 year ago

Перезапуск ISP соединения осуществляется стандартными API от кеннетик. За это отвечает функция reset_ISP_connection.

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

badigit commented 1 year ago

Речь не про таймаут в 3 секунды, а про "яму" около 1 минуты, когда кинетик не может восстановить L2TP и весь дом без интернета..

Отличия поведение kvas от Web кинетика в том что кинетик перезагружает только L2TP интерфейс, а квас работает с ISP (в моём случае - GigabitEthernet1). В таком вариант L2TP не завершается корректно и остается в подвешенном состоянии, и кинетик не может переподключиться долгое время.

Я проверил - если выполнять

/interface/L2TP0 > {"down":"true"}
и потом {"up":"true"}

то реконнект происходит мгновенно и без проблем

Было бы замечательно учесть эту логику в скрипте. В случае, когда применяется выход в интернет по схеме ISP+L2TP - перезагружать именно второе соединение, либо оба, но в правильном порядке.

Подробнее - как скрипт может это понять: при запросе /show/interface, основной интерфейс GigabitEthernet1 выглядит так:

        "GigabitEthernet1": {
            "id": "GigabitEthernet1",
            "index": 1,
            "interface-name": "ISP",
            "type": "GigabitEthernet",
            "description": "Билайн",
            "traits": ["Mac", "Ethernet", "Ip", "Ip6", "Supplicant", "EthernetIp", "MtkSfpEthernet"],
            "link": "up",
            "connected": "yes",
            "state": "up",
            "mtu": 1500,
            "tx-queue-length": 2000,
            "address": "10.27.20.167",
            "mask": "255.255.254.0",
            "uptime": 760,
            "global": false,
            "security-level": "public",
            "usedby": ["L2TP0"],
            "mac": "50:ff:20:21:e8:bd",
            "auth-type": "none",
            "port": {
                "id": "GigabitEthernet1/0",
                "index": 0,
                "interface-name": "0",
                "label": "0",
                "type": "Port",
                "traits": ["EthernetPort", "MtkSfpEthernetPort"],
                "link": "up",
                "speed": "100",
                "duplex": "full",
                "auto-negotiation": "on",
                "flow-control": "off",
                "eee": "off",
                "cable-diagnostics": false,
                "transceiver": "internal",
                "sfp-combo": true
            }
        },

"L2TP0": {
            "id": "L2TP0",
            "index": 0,
            "interface-name": "L2TP0",
            "type": "L2TP",
            "description": "Билайн",
            "traits": ["Ip", "Ip6", "Supplicant", "Peer", "Ppp", "PppTunnel", "Secure", "L2tp"],
            "link": "up",
            "connected": "yes",
            "state": "up",
            "role": ["inet"],
            "mtu": 1400,
            "tx-queue-length": 1000,
            "address": "10.198.213.126",
            "mask": "255.255.255.255",
            "global": true,
            "defaultgw": true,
            "priority": 57386,
            "security-level": "public",
            "auth-type": "none",
            "remote": "77.74.65.241",
            "uptime": 130,
            "fail": "no",
            "via": "GigabitEthernet1",
            "last-change": "130.208164",
            "ipsec-enabled": false,
            "ipsec-ikev2-allowed": false,
            "ipsec-ikev2-enabled": false
        },
  1. Обращает на себя внимание наличие у ISP признаков usedby": ["L2TP0"], а также "global": false,
  2. У L2TP0 в свою очередь "global": true и "defaultgw": true,

т.е. по списку интерфейсов можно определить, что используется ISP + L2TP0 и учесть это при переподключениях в скрипте.

Могли бы это добавить?

qzeleza commented 1 year ago

Все, теперь понял Вас. Речь идет о подключении к VPN по протоколу L2TP, а не подключение к ISP по протоколу L2TP.

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

Могу это сделать, но нужен прямой доступ к Вашему устройству. Если готовы предоставить, то смогу помочь в эти выходные.

qzeleza commented 1 year ago

Для обсуждения деталей пожалуйста напишите в личку на форуме, либо личное сообщение на почту kvas собачка zeleza.ru.

badigit commented 1 year ago

Вроде пофиксили, спасибо! Можно закрывать

qzeleza commented 1 year ago

Закрываю.