WG/AWG SplitTunnel for desktop
This commit is contained in:
parent
4ea1a19572
commit
32c304dc1b
3 changed files with 51 additions and 18 deletions
|
|
@ -115,8 +115,12 @@ void LocalSocketController::daemonConnected() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
|
|
||||||
QString protocolName = rawConfig.value("protocol").toString();
|
QString protocolName = rawConfig.value("protocol").toString();
|
||||||
|
|
||||||
|
int splitTunnelType = rawConfig.value("splitTunnelType").toInt();
|
||||||
|
QJsonArray splitTunnelSites = rawConfig.value("splitTunnelSites").toArray();
|
||||||
|
|
||||||
QJsonObject wgConfig = rawConfig.value(protocolName + "_config_data").toObject();
|
QJsonObject wgConfig = rawConfig.value(protocolName + "_config_data").toObject();
|
||||||
|
|
||||||
QJsonObject json;
|
QJsonObject json;
|
||||||
|
|
@ -137,6 +141,7 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
|
|
||||||
QJsonArray jsAllowedIPAddesses;
|
QJsonArray jsAllowedIPAddesses;
|
||||||
|
|
||||||
|
if (splitTunnelType == 0 || splitTunnelType == 2) {
|
||||||
QJsonObject range_ipv4;
|
QJsonObject range_ipv4;
|
||||||
range_ipv4.insert("address", "0.0.0.0");
|
range_ipv4.insert("address", "0.0.0.0");
|
||||||
range_ipv4.insert("range", 0);
|
range_ipv4.insert("range", 0);
|
||||||
|
|
@ -148,12 +153,40 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
range_ipv6.insert("range", 0);
|
range_ipv6.insert("range", 0);
|
||||||
range_ipv6.insert("isIpv6", true);
|
range_ipv6.insert("isIpv6", true);
|
||||||
jsAllowedIPAddesses.append(range_ipv6);
|
jsAllowedIPAddesses.append(range_ipv6);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (splitTunnelType == 1) {
|
||||||
|
for (auto v : splitTunnelSites) {
|
||||||
|
QString ipRange = v.toString();
|
||||||
|
qDebug() << "ipRange " << ipRange;
|
||||||
|
if (ipRange.split('/').size() > 1){
|
||||||
|
QJsonObject range;
|
||||||
|
range.insert("address", ipRange.split('/')[0]);
|
||||||
|
range.insert("range", atoi(ipRange.split('/')[1].toLocal8Bit()));
|
||||||
|
range.insert("isIpv6", false);
|
||||||
|
jsAllowedIPAddesses.append(range);
|
||||||
|
} else {
|
||||||
|
QJsonObject range;
|
||||||
|
range.insert("address",ipRange);
|
||||||
|
range.insert("range", 32);
|
||||||
|
range.insert("isIpv6", false);
|
||||||
|
jsAllowedIPAddesses.append(range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
json.insert("allowedIPAddressRanges", jsAllowedIPAddesses);
|
json.insert("allowedIPAddressRanges", jsAllowedIPAddesses);
|
||||||
|
|
||||||
|
|
||||||
QJsonArray jsExcludedAddresses;
|
QJsonArray jsExcludedAddresses;
|
||||||
jsExcludedAddresses.append(wgConfig.value(amnezia::config_key::hostName));
|
jsExcludedAddresses.append(wgConfig.value(amnezia::config_key::hostName));
|
||||||
|
if (splitTunnelType == 2) {
|
||||||
|
for (auto v : splitTunnelSites) {
|
||||||
|
QString ipRange = v.toString();
|
||||||
|
jsExcludedAddresses.append(ipRange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
json.insert("excludedAddresses", jsExcludedAddresses);
|
json.insert("excludedAddresses", jsExcludedAddresses);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -158,15 +158,15 @@ bool LinuxRouteMonitor::rtmSendRoute(int action, int flags, int type,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_OIF, index);
|
nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_OIF, index);
|
||||||
|
nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_PRIORITY, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtm->rtm_type == RTN_THROW) {
|
if (rtm->rtm_type == RTN_THROW) {
|
||||||
int index = if_nametoindex(getgatewayandiface().toUtf8());
|
struct in_addr ip4;
|
||||||
if (index <= 0) {
|
inet_pton(AF_INET, getgatewayandiface().toUtf8(), &ip4);
|
||||||
logger.error() << "if_nametoindex() failed:" << strerror(errno);
|
nlmsg_append_attr(nlmsg, sizeof(buf), RTA_GATEWAY, &ip4, sizeof(ip4));
|
||||||
return false;
|
nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_PRIORITY, 0);
|
||||||
}
|
rtm->rtm_type = RTN_UNICAST;
|
||||||
nlmsg_append_attr32(nlmsg, sizeof(buf), RTA_OIF, index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sockaddr_nl nladdr;
|
struct sockaddr_nl nladdr;
|
||||||
|
|
@ -334,7 +334,7 @@ QString LinuxRouteMonitor::getgatewayandiface()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close(sock);
|
close(sock);
|
||||||
return interface;
|
return gateway_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool buildAllowedIp(wg_allowedip* ip,
|
static bool buildAllowedIp(wg_allowedip* ip,
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ void VpnConnection::onConnectionStateChanged(Vpn::ConnectionState state)
|
||||||
// qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size();
|
// qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size();
|
||||||
}
|
}
|
||||||
QString dns1 = m_vpnConfiguration.value(config_key::dns1).toString();
|
QString dns1 = m_vpnConfiguration.value(config_key::dns1).toString();
|
||||||
QString dns2 = m_vpnConfiguration.value(config_key::dns1).toString();
|
QString dns2 = m_vpnConfiguration.value(config_key::dns2).toString();
|
||||||
|
|
||||||
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << dns1 << dns2);
|
IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << dns1 << dns2);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue