fix: added enablePeerTraffic call to xray (#2179)

* fix: add enablePeerTraffic call to xray

* chore: remove unnecessary steps during xray TUN setup phase

* chore: move tun init from tun2socks code to ipcserver

* chore: rework xray routing
* get rid of redundant delays
* check if remote calls are successful

* chore: xray routing fine-tuning

* fix: add service qt deps to deployment build
This commit is contained in:
Yaroslav Gurov
2026-02-04 05:35:53 +01:00
committed by GitHub
parent 87eccfb4ca
commit 24895752c1
8 changed files with 144 additions and 61 deletions

View File

@@ -6,7 +6,7 @@ project(${PROJECT} VERSION ${AMNEZIAVPN_VERSION})
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 REQUIRED COMPONENTS DBus Core Network Widgets RemoteObjects Core5Compat)
find_package(Qt6 REQUIRED COMPONENTS DBus Core Network Widgets RemoteObjects Core5Compat Concurrent)
qt_standard_project_setup()
@@ -353,7 +353,7 @@ include_directories(
add_executable(${PROJECT} ${SOURCES} ${HEADERS} ${RESOURCES})
target_link_libraries(${PROJECT} PRIVATE Qt6::Core Qt6::Widgets Qt6::Network Qt6::RemoteObjects Qt6::Core5Compat Qt6::DBus ${LIBS})
target_link_libraries(${PROJECT} PRIVATE Qt6::Core Qt6::Widgets Qt6::Network Qt6::RemoteObjects Qt6::Core5Compat Qt6::DBus Qt6::Concurrent ${LIBS})
target_compile_definitions(${PROJECT} PRIVATE "MZ_$<UPPER_CASE:${MZ_PLATFORM_NAME}>")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")

View File

@@ -66,6 +66,9 @@ void Router::resetIpStack()
bool Router::createTun(const QString &dev, const QString &subnet)
{
#ifdef Q_OS_WIN
return RouterWin::Instance().createTun(dev, subnet);
#endif
#ifdef Q_OS_LINUX
return RouterLinux::Instance().createTun(dev, subnet);
#endif

View File

@@ -5,6 +5,7 @@
#include <tchar.h>
#include <QProcess>
#include <QtConcurrent>
#include <core/networkUtilities.h>
@@ -308,6 +309,37 @@ void RouterWin::resetIpStack()
}
}
bool RouterWin::createTun(const QString &dev, const QString &subnet)
{
NET_LUID luid;
DWORD res = ConvertInterfaceAliasToLuid(reinterpret_cast<const wchar_t*>(dev.utf16()), &luid);
if (res != NO_ERROR) {
qCritical() << "Failed to convert luid: " << res;
return false;
}
MIB_UNICASTIPADDRESS_ROW row;
InitializeUnicastIpAddressEntry(&row);
row.InterfaceLuid = luid;
row.Address.si_family = AF_INET;
inet_pton(AF_INET, subnet.toStdString().c_str(), &row.Address.Ipv4.sin_addr);
row.OnLinkPrefixLength = 32;
row.ValidLifetime = 0xffffffff;
row.PreferredLifetime = 0xffffffff;
row.DadState = IpDadStatePreferred;
res = CreateUnicastIpAddressEntry(&row);
if (res != NO_ERROR && res != ERROR_OBJECT_ALREADY_EXISTS) {
qDebug() << "Failed to create IP address:" << res;
return false;
}
return true;
}
void RouterWin::suspendWcmSvc(bool suspend)
{
if (suspend == m_suspended) return;
@@ -465,11 +497,19 @@ bool RouterWin::StopRoutingIpv6()
qDebug() << "RouterWin::StopRoutingIpv6";
if (auto loopback = findLoopbackIface(); loopback.isValid()) {
for (auto subnet : kIpv6Subnets) {
QProcess{}.execute("netsh", { "interface", "ipv6", "add", "route", subnet, QString("interface=%1").arg(loopback.index()), "metric=0", "store=active" });
}
QFuture<bool> res = QtConcurrent::mappedReduced(kIpv6Subnets, [loopback](const QString &subnet) -> bool {
int res = QProcess::execute("netsh", { "interface", "ipv6", "add", "route", subnet, QString("interface=%1").arg(loopback.index()), "metric=0", "store=active" });
return res == 0;
},
[](bool &result, bool success) {
result = result && success;
}, true);
res.waitForFinished();
return res.result();
}
return true;
return false;
}
bool RouterWin::StartRoutingIpv6()
@@ -477,9 +517,14 @@ bool RouterWin::StartRoutingIpv6()
qDebug() << "RouterWin::StartRoutingIpv6";
if (auto loopback = findLoopbackIface(); loopback.isValid()) {
for (auto subnet : kIpv6Subnets) {
QProcess{}.execute("netsh", { "interface", "ipv6", "delete", "route", subnet, QString("interface=%1").arg(loopback.index()) });
}
QFuture<bool> res = QtConcurrent::mappedReduced(kIpv6Subnets, [loopback](const QString &subnet) -> bool {
int res = QProcess::execute("netsh", { "interface", "ipv6", "delete", "route", subnet, QString("interface=%1").arg(loopback.index()) });
return res == 0;
},
[](bool &result, bool success) {
result = result && success;
}, true);
}
return true;
return false;
}

View File

@@ -45,6 +45,7 @@ public:
bool StartRoutingIpv6();
bool StopRoutingIpv6();
bool createTun(const QString &dev, const QString &subnet);
void suspendWcmSvc(bool suspend);
bool updateResolvers(const QString& ifname, const QList<QHostAddress>& resolvers);
bool restoreResolvers();