chore: fixed again log output with split tunneling info
This commit is contained in:
parent
76640311ab
commit
3011a0e306
3 changed files with 82 additions and 87 deletions
|
@ -1,16 +1,14 @@
|
||||||
#include "xrayprotocol.h"
|
#include "xrayprotocol.h"
|
||||||
|
|
||||||
#include "utilities.h"
|
|
||||||
#include "core/networkUtilities.h"
|
|
||||||
|
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QNetworkInterface>
|
#include <QNetworkInterface>
|
||||||
|
|
||||||
|
#include "core/networkUtilities.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
XrayProtocol::XrayProtocol(const QJsonObject &configuration, QObject *parent):
|
XrayProtocol::XrayProtocol(const QJsonObject &configuration, QObject *parent) : VpnProtocol(configuration, parent)
|
||||||
VpnProtocol(configuration, parent)
|
|
||||||
{
|
{
|
||||||
readXrayConfiguration(configuration);
|
readXrayConfiguration(configuration);
|
||||||
m_routeGateway = NetworkUtilities::getGatewayAndIface();
|
m_routeGateway = NetworkUtilities::getGatewayAndIface();
|
||||||
|
@ -45,10 +43,7 @@ ErrorCode XrayProtocol::start()
|
||||||
|
|
||||||
QStringList args = QStringList() << "-c" << m_xrayCfgFile.fileName() << "-format=json";
|
QStringList args = QStringList() << "-c" << m_xrayCfgFile.fileName() << "-format=json";
|
||||||
|
|
||||||
qDebug().noquote() << "XrayProtocol::start()"
|
qDebug().noquote() << "XrayProtocol::start()" << xrayExecPath() << args.join(" ");
|
||||||
<< xrayExecPath() << args.join(" ");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_xrayProcess.setProcessChannelMode(QProcess::MergedChannels);
|
m_xrayProcess.setProcessChannelMode(QProcess::MergedChannels);
|
||||||
m_xrayProcess.setProgram(xrayExecPath());
|
m_xrayProcess.setProgram(xrayExecPath());
|
||||||
|
@ -66,14 +61,15 @@ ErrorCode XrayProtocol::start()
|
||||||
#endif
|
#endif
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(&m_xrayProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
|
connect(&m_xrayProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this,
|
||||||
qDebug().noquote() << "XrayProtocol finished, exitCode, exitStatus" << exitCode << exitStatus;
|
[this](int exitCode, QProcess::ExitStatus exitStatus) {
|
||||||
setConnectionState(Vpn::ConnectionState::Disconnected);
|
qDebug().noquote() << "XrayProtocol finished, exitCode, exitStatus" << exitCode << exitStatus;
|
||||||
if ((exitStatus != QProcess::NormalExit) || (exitCode != 0)) {
|
setConnectionState(Vpn::ConnectionState::Disconnected);
|
||||||
emit protocolError(amnezia::ErrorCode::XrayExecutableCrashed);
|
if ((exitStatus != QProcess::NormalExit) || (exitCode != 0)) {
|
||||||
emit setConnectionState(Vpn::ConnectionState::Error);
|
emit protocolError(amnezia::ErrorCode::XrayExecutableCrashed);
|
||||||
}
|
emit setConnectionState(Vpn::ConnectionState::Error);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
m_xrayProcess.start();
|
m_xrayProcess.start();
|
||||||
m_xrayProcess.waitForStarted();
|
m_xrayProcess.waitForStarted();
|
||||||
|
@ -82,11 +78,10 @@ ErrorCode XrayProtocol::start()
|
||||||
setConnectionState(Vpn::ConnectionState::Connecting);
|
setConnectionState(Vpn::ConnectionState::Connecting);
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
return startTun2Sock();
|
return startTun2Sock();
|
||||||
}
|
} else
|
||||||
else return ErrorCode::XrayExecutableMissing;
|
return ErrorCode::XrayExecutableMissing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ErrorCode XrayProtocol::startTun2Sock()
|
ErrorCode XrayProtocol::startTun2Sock()
|
||||||
{
|
{
|
||||||
m_t2sProcess->start();
|
m_t2sProcess->start();
|
||||||
|
@ -98,71 +93,68 @@ ErrorCode XrayProtocol::startTun2Sock()
|
||||||
connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::stateChanged, this,
|
connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::stateChanged, this,
|
||||||
[&](QProcess::ProcessState newState) { qDebug() << "PrivilegedProcess stateChanged" << newState; });
|
[&](QProcess::ProcessState newState) { qDebug() << "PrivilegedProcess stateChanged" << newState; });
|
||||||
|
|
||||||
connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::setConnectionState, this,
|
connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::setConnectionState, this, [&](int vpnState) {
|
||||||
[&](int vpnState) {
|
qDebug() << "PrivilegedProcess setConnectionState " << vpnState;
|
||||||
qDebug() << "PrivilegedProcess setConnectionState " << vpnState;
|
if (vpnState == Vpn::ConnectionState::Connected) {
|
||||||
if (vpnState == Vpn::ConnectionState::Connected)
|
setConnectionState(Vpn::ConnectionState::Connecting);
|
||||||
{
|
QList<QHostAddress> dnsAddr;
|
||||||
setConnectionState(Vpn::ConnectionState::Connecting);
|
dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns1).toString()));
|
||||||
QList<QHostAddress> dnsAddr;
|
dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns2).toString()));
|
||||||
dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns1).toString()));
|
|
||||||
dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns2).toString()));
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
QThread::msleep(8000);
|
QThread::msleep(8000);
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q_OS_MACOS
|
#ifdef Q_OS_MACOS
|
||||||
QThread::msleep(5000);
|
QThread::msleep(5000);
|
||||||
IpcClient::Interface()->createTun("utun22", amnezia::protocols::xray::defaultLocalAddr);
|
IpcClient::Interface()->createTun("utun22", amnezia::protocols::xray::defaultLocalAddr);
|
||||||
IpcClient::Interface()->updateResolvers("utun22", dnsAddr);
|
IpcClient::Interface()->updateResolvers("utun22", dnsAddr);
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
QThread::msleep(1000);
|
QThread::msleep(1000);
|
||||||
IpcClient::Interface()->createTun("tun2", amnezia::protocols::xray::defaultLocalAddr);
|
IpcClient::Interface()->createTun("tun2", amnezia::protocols::xray::defaultLocalAddr);
|
||||||
IpcClient::Interface()->updateResolvers("tun2", dnsAddr);
|
IpcClient::Interface()->updateResolvers("tun2", dnsAddr);
|
||||||
#endif
|
#endif
|
||||||
#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
|
#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
|
||||||
// killSwitch toggle
|
// killSwitch toggle
|
||||||
if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) {
|
if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) {
|
||||||
m_configData.insert("vpnServer", m_remoteAddress);
|
m_configData.insert("vpnServer", m_remoteAddress);
|
||||||
IpcClient::Interface()->enableKillSwitch(m_configData, 0);
|
IpcClient::Interface()->enableKillSwitch(m_configData, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (m_routeMode == 0) {
|
if (m_routeMode == Settings::RouteMode::VpnAllSites) {
|
||||||
IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "0.0.0.0/1");
|
IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "0.0.0.0/1");
|
||||||
IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "128.0.0.0/1");
|
IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "128.0.0.0/1");
|
||||||
IpcClient::Interface()->routeAddList(m_routeGateway, QStringList() << m_remoteAddress);
|
IpcClient::Interface()->routeAddList(m_routeGateway, QStringList() << m_remoteAddress);
|
||||||
}
|
}
|
||||||
IpcClient::Interface()->StopRoutingIpv6();
|
IpcClient::Interface()->StopRoutingIpv6();
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
IpcClient::Interface()->updateResolvers("tun2", dnsAddr);
|
IpcClient::Interface()->updateResolvers("tun2", dnsAddr);
|
||||||
QList<QNetworkInterface> netInterfaces = QNetworkInterface::allInterfaces();
|
QList<QNetworkInterface> netInterfaces = QNetworkInterface::allInterfaces();
|
||||||
for (int i = 0; i < netInterfaces.size(); i++) {
|
for (int i = 0; i < netInterfaces.size(); i++) {
|
||||||
for (int j = 0; j < netInterfaces.at(i).addressEntries().size(); j++)
|
for (int j = 0; j < netInterfaces.at(i).addressEntries().size(); j++) {
|
||||||
{
|
// killSwitch toggle
|
||||||
// killSwitch toggle
|
if (m_vpnLocalAddress == netInterfaces.at(i).addressEntries().at(j).ip().toString()) {
|
||||||
if (m_vpnLocalAddress == netInterfaces.at(i).addressEntries().at(j).ip().toString()) {
|
if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) {
|
||||||
if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) {
|
IpcClient::Interface()->enableKillSwitch(QJsonObject(), netInterfaces.at(i).index());
|
||||||
IpcClient::Interface()->enableKillSwitch(QJsonObject(), netInterfaces.at(i).index());
|
|
||||||
}
|
|
||||||
m_configData.insert("vpnAdapterIndex", netInterfaces.at(i).index());
|
|
||||||
m_configData.insert("vpnGateway", m_vpnGateway);
|
|
||||||
m_configData.insert("vpnServer", m_remoteAddress);
|
|
||||||
IpcClient::Interface()->enablePeerTraffic(m_configData);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
m_configData.insert("vpnAdapterIndex", netInterfaces.at(i).index());
|
||||||
|
m_configData.insert("vpnGateway", m_vpnGateway);
|
||||||
|
m_configData.insert("vpnServer", m_remoteAddress);
|
||||||
|
IpcClient::Interface()->enablePeerTraffic(m_configData);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
setConnectionState(Vpn::ConnectionState::Connected);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
setConnectionState(Vpn::ConnectionState::Connected);
|
||||||
|
}
|
||||||
#if !defined(Q_OS_MACOS)
|
#if !defined(Q_OS_MACOS)
|
||||||
if (vpnState == Vpn::ConnectionState::Disconnected) {
|
if (vpnState == Vpn::ConnectionState::Disconnected) {
|
||||||
setConnectionState(Vpn::ConnectionState::Disconnected);
|
setConnectionState(Vpn::ConnectionState::Disconnected);
|
||||||
IpcClient::Interface()->deleteTun("tun2");
|
IpcClient::Interface()->deleteTun("tun2");
|
||||||
IpcClient::Interface()->StartRoutingIpv6();
|
IpcClient::Interface()->StartRoutingIpv6();
|
||||||
IpcClient::Interface()->clearSavedRoutes();
|
IpcClient::Interface()->clearSavedRoutes();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
});
|
});
|
||||||
|
|
||||||
return ErrorCode::NoError;
|
return ErrorCode::NoError;
|
||||||
}
|
}
|
||||||
|
@ -204,7 +196,7 @@ void XrayProtocol::readXrayConfiguration(const QJsonObject &configuration)
|
||||||
m_localPort = QString(amnezia::protocols::xray::defaultLocalProxyPort).toInt();
|
m_localPort = QString(amnezia::protocols::xray::defaultLocalProxyPort).toInt();
|
||||||
m_remoteHost = configuration.value(amnezia::config_key::hostName).toString();
|
m_remoteHost = configuration.value(amnezia::config_key::hostName).toString();
|
||||||
m_remoteAddress = NetworkUtilities::getIPAddress(m_remoteHost);
|
m_remoteAddress = NetworkUtilities::getIPAddress(m_remoteHost);
|
||||||
m_routeMode = configuration.value(amnezia::config_key::splitTunnelType).toInt();
|
m_routeMode = static_cast<Settings::RouteMode>(configuration.value(amnezia::config_key::splitTunnelType).toInt());
|
||||||
m_primaryDNS = configuration.value(amnezia::config_key::dns1).toString();
|
m_primaryDNS = configuration.value(amnezia::config_key::dns1).toString();
|
||||||
m_secondaryDNS = configuration.value(amnezia::config_key::dns2).toString();
|
m_secondaryDNS = configuration.value(amnezia::config_key::dns2).toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
#ifndef XRAYPROTOCOL_H
|
#ifndef XRAYPROTOCOL_H
|
||||||
#define XRAYPROTOCOL_H
|
#define XRAYPROTOCOL_H
|
||||||
|
|
||||||
#include "openvpnprotocol.h"
|
|
||||||
#include "QProcess"
|
#include "QProcess"
|
||||||
|
|
||||||
#include "containers/containers_defs.h"
|
#include "containers/containers_defs.h"
|
||||||
|
#include "openvpnprotocol.h"
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
class XrayProtocol : public VpnProtocol
|
class XrayProtocol : public VpnProtocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
XrayProtocol(const QJsonObject& configuration, QObject* parent = nullptr);
|
XrayProtocol(const QJsonObject &configuration, QObject *parent = nullptr);
|
||||||
virtual ~XrayProtocol() override;
|
virtual ~XrayProtocol() override;
|
||||||
|
|
||||||
ErrorCode start() override;
|
ErrorCode start() override;
|
||||||
|
@ -24,11 +26,12 @@ protected:
|
||||||
private:
|
private:
|
||||||
static QString xrayExecPath();
|
static QString xrayExecPath();
|
||||||
static QString tun2SocksExecPath();
|
static QString tun2SocksExecPath();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_localPort;
|
int m_localPort;
|
||||||
QString m_remoteHost;
|
QString m_remoteHost;
|
||||||
QString m_remoteAddress;
|
QString m_remoteAddress;
|
||||||
int m_routeMode;
|
Settings::RouteMode m_routeMode;
|
||||||
QJsonObject m_configData;
|
QJsonObject m_configData;
|
||||||
QString m_primaryDNS;
|
QString m_primaryDNS;
|
||||||
QString m_secondaryDNS;
|
QString m_secondaryDNS;
|
||||||
|
@ -37,7 +40,6 @@ private:
|
||||||
QSharedPointer<IpcProcessTun2SocksReplica> m_t2sProcess;
|
QSharedPointer<IpcProcessTun2SocksReplica> m_t2sProcess;
|
||||||
#endif
|
#endif
|
||||||
QTemporaryFile m_xrayCfgFile;
|
QTemporaryFile m_xrayCfgFile;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // XRAYPROTOCOL_H
|
#endif // XRAYPROTOCOL_H
|
||||||
|
|
|
@ -218,12 +218,6 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede
|
||||||
qDebug() << QString("Trying to connect to VPN, server index is %1, container is %2")
|
qDebug() << QString("Trying to connect to VPN, server index is %1, container is %2")
|
||||||
.arg(serverIndex)
|
.arg(serverIndex)
|
||||||
.arg(ContainerProps::containerToString(container));
|
.arg(ContainerProps::containerToString(container));
|
||||||
qDebug() << QString("Site split tunneling is %1, route mode is %2")
|
|
||||||
.arg(m_settings->isSitesSplitTunnelingEnabled() ? "enabled" : "diabled")
|
|
||||||
.arg(m_settings->routeMode());
|
|
||||||
qDebug() << QString("App split tunneling is %1, route mode is %2")
|
|
||||||
.arg(m_settings->isAppsSplitTunnelingEnabled() ? "enabled" : "diabled")
|
|
||||||
.arg(m_settings->getAppsRouteMode());
|
|
||||||
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
|
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
|
||||||
if (!m_IpcClient) {
|
if (!m_IpcClient) {
|
||||||
m_IpcClient = new IpcClient(this);
|
m_IpcClient = new IpcClient(this);
|
||||||
|
@ -346,26 +340,26 @@ void VpnConnection::appendSplitTunnelingConfig()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings::RouteMode routeMode = Settings::RouteMode::VpnAllSites;
|
Settings::RouteMode sitesRouteMode = Settings::RouteMode::VpnAllSites;
|
||||||
QJsonArray sitesJsonArray;
|
QJsonArray sitesJsonArray;
|
||||||
if (m_settings->isSitesSplitTunnelingEnabled()) {
|
if (m_settings->isSitesSplitTunnelingEnabled()) {
|
||||||
routeMode = m_settings->routeMode();
|
sitesRouteMode = m_settings->routeMode();
|
||||||
|
|
||||||
if (allowSiteBasedSplitTunneling) {
|
if (allowSiteBasedSplitTunneling) {
|
||||||
auto sites = m_settings->getVpnIps(routeMode);
|
auto sites = m_settings->getVpnIps(sitesRouteMode);
|
||||||
for (const auto &site : sites) {
|
for (const auto &site : sites) {
|
||||||
sitesJsonArray.append(site);
|
sitesJsonArray.append(site);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow traffic to Amnezia DNS
|
// Allow traffic to Amnezia DNS
|
||||||
if (routeMode == Settings::VpnOnlyForwardSites) {
|
if (sitesRouteMode == Settings::VpnOnlyForwardSites) {
|
||||||
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
|
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
|
||||||
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
|
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode);
|
m_vpnConfiguration.insert(config_key::splitTunnelType, sitesRouteMode);
|
||||||
m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray);
|
m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray);
|
||||||
|
|
||||||
Settings::AppsRouteMode appsRouteMode = Settings::AppsRouteMode::VpnAllApps;
|
Settings::AppsRouteMode appsRouteMode = Settings::AppsRouteMode::VpnAllApps;
|
||||||
|
@ -381,6 +375,13 @@ void VpnConnection::appendSplitTunnelingConfig()
|
||||||
|
|
||||||
m_vpnConfiguration.insert(config_key::appSplitTunnelType, appsRouteMode);
|
m_vpnConfiguration.insert(config_key::appSplitTunnelType, appsRouteMode);
|
||||||
m_vpnConfiguration.insert(config_key::splitTunnelApps, appsJsonArray);
|
m_vpnConfiguration.insert(config_key::splitTunnelApps, appsJsonArray);
|
||||||
|
|
||||||
|
qDebug() << QString("Site split tunneling is %1, route mode is %2")
|
||||||
|
.arg(m_settings->isSitesSplitTunnelingEnabled() ? "enabled" : "disabled")
|
||||||
|
.arg(sitesRouteMode);
|
||||||
|
qDebug() << QString("App split tunneling is %1, route mode is %2")
|
||||||
|
.arg(m_settings->isAppsSplitTunnelingEnabled() ? "enabled" : "disabled")
|
||||||
|
.arg(appsRouteMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Q_OS_ANDROID
|
#ifdef Q_OS_ANDROID
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue