diff --git a/application/defaultsettings.cpp b/application/defaultsettings.cpp index 872204e..9f9ce5b 100644 --- a/application/defaultsettings.cpp +++ b/application/defaultsettings.cpp @@ -22,6 +22,8 @@ void DefaultSettings::reset(QSettings &settings) settings.setValue("ZJUConnect/DNS", ""); settings.setValue("ZJUConnect/DNSAuto", true); settings.setValue("ZJUConnect/SecondaryDNS", ""); + settings.setValue("ZJUConnect/LocalDNSServer", ""); + settings.setValue("ZJUConnect/DNSServerBind", ""); settings.setValue("ZJUConnect/DNSTTL", 3600); settings.setValue("ZJUConnect/SOCKS5Port", 11080); settings.setValue("ZJUConnect/HTTPPort", 11081); diff --git a/core/connectionprofile.h b/core/connectionprofile.h index 0784933..d4dcfe9 100644 --- a/core/connectionprofile.h +++ b/core/connectionprofile.h @@ -31,6 +31,8 @@ struct DnsOptions int ttl = 3600; bool disableZjuDns = false; QString custom; + QString localDnsServer; + QString dnsServerBind; }; struct ProxyOptions diff --git a/infrastructure/coreprocess/corecommandbuilder.cpp b/infrastructure/coreprocess/corecommandbuilder.cpp index 744bde2..9a5e358 100644 --- a/infrastructure/coreprocess/corecommandbuilder.cpp +++ b/infrastructure/coreprocess/corecommandbuilder.cpp @@ -171,13 +171,15 @@ CoreCommand CoreCommandBuilder::build(const ConnectionProfile &profile, const Co if (!profile.dns.primary.isEmpty() || profile.dns.automatic) { - arguments << "-zju-dns-server" << (profile.dns.automatic ? "auto" : profile.dns.primary); + arguments << "-remote-dns-server" << (profile.dns.automatic ? "auto" : profile.dns.primary); } if (profile.dns.ttl != 3600) { arguments << "-dns-ttl" << QString::number(profile.dns.ttl); } appendOption(arguments, "-secondary-dns-server", profile.dns.secondary); + appendOption(arguments, "-local-dns-server", profile.dns.localDnsServer); + appendOption(arguments, "-dns-server-bind", profile.dns.dnsServerBind); if (profile.behavior.disableKeepAlive) { @@ -191,7 +193,7 @@ CoreCommand CoreCommandBuilder::build(const ConnectionProfile &profile, const Co } if (profile.dns.disableZjuDns) { - arguments << "-disable-zju-dns"; + arguments << "-disable-remote-dns"; } if (profile.behavior.disableServerConfig) { diff --git a/infrastructure/settings/settingsprofileloader.cpp b/infrastructure/settings/settingsprofileloader.cpp index 884cbd3..b5bf84b 100644 --- a/infrastructure/settings/settingsprofileloader.cpp +++ b/infrastructure/settings/settingsprofileloader.cpp @@ -53,7 +53,9 @@ ConnectionProfile SettingsProfileLoader::load( settings.value("ZJUConnect/SecondaryDNS").toString(), settings.value("ZJUConnect/DNSTTL").toInt(), settings.value("ZJUConnect/DisableZJUDNS").toBool(), - settings.value("ZJUConnect/CustomDNS", "").toString() + settings.value("ZJUConnect/CustomDNS", "").toString(), + settings.value("ZJUConnect/LocalDNSServer", "").toString(), + settings.value("ZJUConnect/DNSServerBind", "").toString() }; const QString bindPrefix = settings.value("ZJUConnect/OutsideAccess", false).toBool() diff --git a/presentation/dialogs/settingwindow/settingwindow.cpp b/presentation/dialogs/settingwindow/settingwindow.cpp index c29a7bf..ed8a04e 100644 --- a/presentation/dialogs/settingwindow/settingwindow.cpp +++ b/presentation/dialogs/settingwindow/settingwindow.cpp @@ -238,6 +238,12 @@ void SettingWindow::loadSettings() ui->dnsLineEdit->setText(settings->value("ZJUConnect/DNS").toString()); ui->dnsAutoCheckBox->setChecked(settings->value("ZJUConnect/DNSAuto").toBool()); ui->secondaryDnsLineEdit->setText(settings->value("ZJUConnect/SecondaryDNS").toString()); + ui->localDnsServerLineEdit->setText( + settings->value("ZJUConnect/LocalDNSServer", "").toString() + ); + ui->dnsServerBindLineEdit->setText( + settings->value("ZJUConnect/DNSServerBind", "").toString() + ); ui->dnsTTLSpinBox->setValue(settings->value("ZJUConnect/DNSTTL").toInt()); ui->socks5PortSpinBox->setValue(settings->value("ZJUConnect/SOCKS5Port").toInt()); ui->httpPortSpinBox->setValue(settings->value("ZJUConnect/HTTPPort").toInt()); @@ -338,6 +344,14 @@ void SettingWindow::applySettings() settings->setValue("ZJUConnect/DNS", ui->dnsLineEdit->text()); settings->setValue("ZJUConnect/DNSAuto", ui->dnsAutoCheckBox->isChecked()); settings->setValue("ZJUConnect/SecondaryDNS", ui->secondaryDnsLineEdit->text()); + settings->setValue( + "ZJUConnect/LocalDNSServer", + ui->localDnsServerLineEdit->text().trimmed() + ); + settings->setValue( + "ZJUConnect/DNSServerBind", + ui->dnsServerBindLineEdit->text().trimmed() + ); settings->setValue("ZJUConnect/DNSTTL", ui->dnsTTLSpinBox->value()); settings->setValue("ZJUConnect/SOCKS5Port", ui->socks5PortSpinBox->value()); settings->setValue("ZJUConnect/HTTPPort", ui->httpPortSpinBox->value()); diff --git a/presentation/dialogs/settingwindow/settingwindow.ui b/presentation/dialogs/settingwindow/settingwindow.ui index b8580a6..d483852 100644 --- a/presentation/dialogs/settingwindow/settingwindow.ui +++ b/presentation/dialogs/settingwindow/settingwindow.ui @@ -390,7 +390,7 @@ EasyConnect 认证信息 - + @@ -700,6 +700,34 @@ 高级 + + + + DNS 监听地址 + + + + + + + 留空则禁用,例如 127.0.0.1:53 + + + + + + + 本地 DNS + + + + + + + 用于解析 VPN 服务器域名,留空则使用系统 DNS + + + @@ -731,14 +759,14 @@ - + 勾选自动,否则不应留空 - + 不填则采用系统 DNS ,使用 DNS 劫持必须填写 @@ -759,7 +787,7 @@ - + 自动 @@ -807,7 +835,7 @@ - + DNS 服务器 @@ -821,7 +849,7 @@ - + 备用 DNS @@ -1125,6 +1153,8 @@ serverPortSpinBox dnsLineEdit secondaryDnsLineEdit + localDnsServerLineEdit + dnsServerBindLineEdit socks5PortSpinBox httpPortSpinBox multiLineCheckBox diff --git a/tests/corecommandbuilder_test.cpp b/tests/corecommandbuilder_test.cpp index 2547270..bedeec5 100644 --- a/tests/corecommandbuilder_test.cpp +++ b/tests/corecommandbuilder_test.cpp @@ -80,7 +80,8 @@ bool buildsCompleteCommandInCompatibleOrder() ConnectionProfile profile; profile.endpoint = {"atrust", "cas", "domain", "86-123", "vpn.example.edu", 8443}; profile.credentials = {"alice", "secret", "TOTP", "/tmp/client.p12", "cert-secret"}; - profile.dns = {"10.0.0.1", false, "10.0.0.2", 60, true, "example.org=1.1.1.1"}; + profile.dns = {"10.0.0.1", false, "10.0.0.2", 60, true, + "example.org=1.1.1.1", "223.5.5.5:53", "127.0.0.1:5353"}; profile.proxy = {"127.0.0.1:1080", "127.0.0.1:1081", "ss://url", "http://direct", true, "example.org"}; profile.tunnel = {true, true, true, true, true, "127.0.0.1:80/10.0.0.1:80", @@ -107,14 +108,16 @@ bool buildsCompleteCommandInCompatibleOrder() "-update-best-nodes-interval", "30", "-server", "vpn.example.edu", "-port", "8443", - "-zju-dns-server", "10.0.0.1", + "-remote-dns-server", "10.0.0.1", "-dns-ttl", "60", "-secondary-dns-server", "10.0.0.2", + "-local-dns-server", "223.5.5.5:53", + "-dns-server-bind", "127.0.0.1:5353", "-disable-keep-alive", "-keep-alive-url", "https://keepalive", "-bind-interface", "en0", "-auto-detect-interface", - "-disable-zju-dns", + "-disable-remote-dns", "-disable-server-config", "-proxy-all", "-tun-mode", diff --git a/tests/settingsprofileloader_test.cpp b/tests/settingsprofileloader_test.cpp index a9897c5..00d65ba 100644 --- a/tests/settingsprofileloader_test.cpp +++ b/tests/settingsprofileloader_test.cpp @@ -33,6 +33,8 @@ bool loadsSettingsIntoTypedProfile() settings.setValue("ZJUConnect/DNS", "10.0.0.1"); settings.setValue("ZJUConnect/DNSAuto", false); settings.setValue("ZJUConnect/SecondaryDNS", "10.0.0.2"); + settings.setValue("ZJUConnect/LocalDNSServer", "223.5.5.5:53"); + settings.setValue("ZJUConnect/DNSServerBind", "127.0.0.1:5353"); settings.setValue("ZJUConnect/DNSTTL", 60); settings.setValue("ZJUConnect/DisableZJUDNS", true); settings.setValue("ZJUConnect/CustomDNS", "example.org=1.1.1.1"); @@ -88,6 +90,8 @@ bool loadsSettingsIntoTypedProfile() && profile.dns.ttl == 60 && profile.dns.disableZjuDns && profile.dns.custom == "example.org=1.1.1.1" + && profile.dns.localDnsServer == "223.5.5.5:53" + && profile.dns.dnsServerBind == "127.0.0.1:5353" && profile.proxy.socksBind == "[::]:1080" && profile.proxy.httpBind == "[::]:1081" && profile.proxy.shadowsocksUrl == "ss://url" @@ -134,6 +138,8 @@ bool usesCompatibleDefaults() && profile.behavior.disableMultiLine && profile.behavior.disableKeepAlive && profile.behavior.disableZjuConfig + && profile.dns.localDnsServer.isEmpty() + && profile.dns.dnsServerBind.isEmpty() && !profile.debug.detailedOutput && !profile.debug.capturePcap && !profile.debug.exportTlsKeys