diff --git a/client/protocols/xrayprotocol.cpp b/client/protocols/xrayprotocol.cpp index d79360bea..c70ac0b47 100755 --- a/client/protocols/xrayprotocol.cpp +++ b/client/protocols/xrayprotocol.cpp @@ -61,6 +61,11 @@ ErrorCode XrayProtocol::startTun2Sock() if (!m_primaryDNS.contains(amnezia::protocols::dns::amneziaDnsIp)) { dnsAddr.push_back(QHostAddress(m_secondaryDNS)); } + + #ifdef Q_OS_WIN + iface->createTun("tun2", amnezia::protocols::xray::defaultLocalAddr); + iface->updateResolvers("tun2", dnsAddr); + #endif #ifdef Q_OS_MACOS iface->createTun("utun22", amnezia::protocols::xray::defaultLocalAddr); iface->updateResolvers("utun22", dnsAddr); @@ -69,9 +74,11 @@ ErrorCode XrayProtocol::startTun2Sock() iface->createTun("tun2", amnezia::protocols::xray::defaultLocalAddr); iface->updateResolvers("tun2", dnsAddr); #endif + if (m_routeMode == Settings::RouteMode::VpnAllSites) { + iface->routeAddList(m_vpnGateway, QStringList() << "0.0.0.0/0"); + } iface->StopRoutingIpv6(); #ifdef Q_OS_WIN - iface->updateResolvers("tun2", dnsAddr); iface->enablePeerTraffic(m_xrayConfig); #endif setConnectionState(Vpn::ConnectionState::Connected); diff --git a/ipc/ipctun2socksprocess.cpp b/ipc/ipctun2socksprocess.cpp index 65d801b03..2f9bd7232 100644 --- a/ipc/ipctun2socksprocess.cpp +++ b/ipc/ipctun2socksprocess.cpp @@ -29,9 +29,7 @@ void IpcProcessTun2Socks::start() QString XrayConStr = "socks5://127.0.0.1:10808"; #ifdef Q_OS_WIN - QStringList arguments({"-device", "tun://tun2?guid={081A8A84-8D12-4DF5-B8C4-396D5B0053E4}", "-proxy", XrayConStr, "-tun-post-up", - QString("cmd /c netsh interface ip set address name=\"tun2\" static %1 255.255.255.255") - .arg(amnezia::protocols::xray::defaultLocalAddr)}); + QStringList arguments({"-device", "tun://tun2?guid={081A8A84-8D12-4DF5-B8C4-396D5B0053E4}", "-proxy", XrayConStr}); #endif #ifdef Q_OS_LINUX QStringList arguments({"-device", "tun://tun2", "-proxy", XrayConStr}); diff --git a/service/server/router.cpp b/service/server/router.cpp index 24e82c0e5..8849d27b7 100644 --- a/service/server/router.cpp +++ b/service/server/router.cpp @@ -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 diff --git a/service/server/router_win.cpp b/service/server/router_win.cpp index 7ad6505df..2ea4f61dd 100644 --- a/service/server/router_win.cpp +++ b/service/server/router_win.cpp @@ -308,6 +308,15 @@ void RouterWin::resetIpStack() } } +bool RouterWin::createTun(const QString &dev, const QString &subnet) +{ + const QString command = QString("netsh interface ip set address name=\"tun2\" static %1 255.255.255.255").arg(subnet); + + QProcess p; + p.start(command); + return p.waitForFinished(); +} + void RouterWin::suspendWcmSvc(bool suspend) { if (suspend == m_suspended) return; diff --git a/service/server/router_win.h b/service/server/router_win.h index c2412cc55..9258b7341 100644 --- a/service/server/router_win.h +++ b/service/server/router_win.h @@ -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& resolvers); bool restoreResolvers();