summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2019-12-16 10:54:59 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-01-02 10:45:00 +0100
commit64202c7648f567ad41e1b2a304f0fbe34df6d064 (patch)
tree02d610be22ab463b6d49a169fc600974f028c8e5
parent8c649ed364fb1db71ee76ae4685fc2debb5c0861 (diff)
downloadmullvadvpn-64202c7648f567ad41e1b2a304f0fbe34df6d064.tar.xz
mullvadvpn-64202c7648f567ad41e1b2a304f0fbe34df6d064.zip
Update RestrictDns in WinFw
-rw-r--r--windows/winfw/src/winfw/fwcontext.cpp7
-rw-r--r--windows/winfw/src/winfw/mullvadguids.cpp15
-rw-r--r--windows/winfw/src/winfw/mullvadguids.h1
-rw-r--r--windows/winfw/src/winfw/rules/restrictdns.cpp106
-rw-r--r--windows/winfw/src/winfw/rules/restrictdns.h10
5 files changed, 56 insertions, 83 deletions
diff --git a/windows/winfw/src/winfw/fwcontext.cpp b/windows/winfw/src/winfw/fwcontext.cpp
index bd89b3cf65..931ced34a9 100644
--- a/windows/winfw/src/winfw/fwcontext.cpp
+++ b/windows/winfw/src/winfw/fwcontext.cpp
@@ -166,9 +166,10 @@ bool FwContext::applyPolicyConnected
ruleset.emplace_back(std::make_unique<rules::RestrictDns>(
tunnelInterfaceAlias,
- wfp::IpAddress(v4DnsHost),
- (v6DnsHost != nullptr) ? std::make_unique<wfp::IpAddress>(v6DnsHost) : nullptr,
- (relay.port == 53) ? std::make_unique<wfp::IpAddress>(relay.ip) : nullptr
+ wfp::IpAddress(std::wstring(v4DnsHost)),
+ nullptr != v6DnsHost ? std::make_optional<wfp::IpAddress>(std::wstring(v6DnsHost)) : std::nullopt,
+ std::wstring(relay.ip),
+ relay.port
));
return applyRuleset(ruleset);
diff --git a/windows/winfw/src/winfw/mullvadguids.cpp b/windows/winfw/src/winfw/mullvadguids.cpp
index 770c81f7db..e73fac26ed 100644
--- a/windows/winfw/src/winfw/mullvadguids.cpp
+++ b/windows/winfw/src/winfw/mullvadguids.cpp
@@ -52,7 +52,6 @@ DetailedWfpObjectRegistry MullvadGuids::BuildDetailedRegistry()
registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitVpnTunnel_Outbound_Ipv6()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterRestrictDns_Outbound_Ipv4()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterRestrictDns_Outbound_Tunnel_Ipv4()));
- registry.insert(std::make_pair(WfpObjectType::Filter, FilterRestrictDns_HACK_TO_ALLOW_RELAY_ON_PORT_53()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterRestrictDns_Outbound_Ipv6()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterRestrictDns_Outbound_Tunnel_Ipv6()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitVpnTunnelService_Ipv4()));
@@ -474,20 +473,6 @@ const GUID &MullvadGuids::FilterRestrictDns_Outbound_Tunnel_Ipv4()
}
//static
-const GUID& MullvadGuids::FilterRestrictDns_HACK_TO_ALLOW_RELAY_ON_PORT_53()
-{
- static const GUID g =
- {
- 0x6a613b73,
- 0x7308,
- 0x4ae4,
- { 0x91, 0x7d, 0xd2, 0xa2, 0x29, 0x17, 0xcc, 0x3f }
- };
-
- return g;
-}
-
-//static
const GUID &MullvadGuids::FilterRestrictDns_Outbound_Ipv6()
{
static const GUID g =
diff --git a/windows/winfw/src/winfw/mullvadguids.h b/windows/winfw/src/winfw/mullvadguids.h
index a2001a2bdb..3c3ca9702b 100644
--- a/windows/winfw/src/winfw/mullvadguids.h
+++ b/windows/winfw/src/winfw/mullvadguids.h
@@ -58,7 +58,6 @@ public:
static const GUID &FilterRestrictDns_Outbound_Ipv4();
static const GUID &FilterRestrictDns_Outbound_Tunnel_Ipv4();
- static const GUID &FilterRestrictDns_HACK_TO_ALLOW_RELAY_ON_PORT_53();
static const GUID &FilterRestrictDns_Outbound_Ipv6();
static const GUID &FilterRestrictDns_Outbound_Tunnel_Ipv6();
diff --git a/windows/winfw/src/winfw/rules/restrictdns.cpp b/windows/winfw/src/winfw/rules/restrictdns.cpp
index 2eb560d973..efa4c8421b 100644
--- a/windows/winfw/src/winfw/rules/restrictdns.cpp
+++ b/windows/winfw/src/winfw/rules/restrictdns.cpp
@@ -12,14 +12,16 @@ using namespace wfp::conditions;
namespace rules
{
-RestrictDns::RestrictDns(const std::wstring& tunnelInterfaceAlias,
+RestrictDns::RestrictDns(const std::wstring &tunnelInterfaceAlias,
const wfp::IpAddress v4DnsHost,
- std::unique_ptr<wfp::IpAddress> v6DnsHost,
- std::unique_ptr<wfp::IpAddress> relay)
+ std::optional<wfp::IpAddress> v6DnsHost,
+ wfp::IpAddress relay,
+ uint16_t relayPort)
: m_tunnelInterfaceAlias(tunnelInterfaceAlias)
, m_v4DnsHost(v4DnsHost)
- , m_v6DnsHost(std::move(v6DnsHost))
- , m_relayHost(std::move(relay))
+ , m_v6DnsHost(v6DnsHost)
+ , m_relayHost(relay)
+ , m_relayPort(relayPort)
{
}
@@ -37,23 +39,21 @@ bool RestrictDns::apply(IObjectInstaller &objectInstaller)
// TODO: Have each rule specify requirements?
//
- if (nullptr != m_relayHost) {
-
- filterBuilder
- .key(MullvadGuids::FilterRestrictDns_Outbound_Ipv4())
- .name(L"Permit relay connection over port 53 (IPv4)")
- .key(MullvadGuids::FilterRestrictDns_HACK_TO_ALLOW_RELAY_ON_PORT_53())
- .description(L"This filter is part of a rule that restricts DNS traffic")
- .provider(MullvadGuids::Provider())
- .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V4)
- .sublayer(MullvadGuids::SublayerBlacklist())
- .weight(wfp::FilterBuilder::WeightClass::Max)
- .permit();
+ filterBuilder
+ .provider(MullvadGuids::Provider())
+ .description(L"This filter is part of a rule that restricts DNS traffic")
+ .sublayer(MullvadGuids::SublayerBlacklist())
+ .key(MullvadGuids::FilterRestrictDns_Outbound_Tunnel_Ipv4())
+ .name(L"Restrict DNS requests inside the VPN tunnel (IPv4)")
+ .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V4)
+ .weight(MAXUINT16)
+ .permit();
+ {
wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V4);
- conditionBuilder.add_condition(ConditionPort::Remote(53));
- conditionBuilder.add_condition(ConditionIp::Remote(*m_relayHost, CompareEq()));
+ conditionBuilder.add_condition(ConditionInterface::Alias(m_tunnelInterfaceAlias, CompareEq()));
+ conditionBuilder.add_condition(ConditionIp::Remote(m_v4DnsHost, CompareEq()));
if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
{
@@ -64,35 +64,21 @@ bool RestrictDns::apply(IObjectInstaller &objectInstaller)
filterBuilder
.key(MullvadGuids::FilterRestrictDns_Outbound_Ipv4())
.name(L"Block DNS requests outside the VPN tunnel (IPv4)")
- .description(L"This filter is part of a rule that restricts DNS traffic")
- .provider(MullvadGuids::Provider())
.layer(FWPM_LAYER_ALE_AUTH_CONNECT_V4)
- .sublayer(MullvadGuids::SublayerBlacklist())
- .weight(wfp::FilterBuilder::WeightClass::Max)
+ .weight(MAXUINT16 - 1)
.block();
{
wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V4);
-
conditionBuilder.add_condition(ConditionPort::Remote(53));
- conditionBuilder.add_condition(ConditionInterface::Alias(m_tunnelInterfaceAlias, CompareNeq()));
- if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
+ if (53 == m_relayPort)
{
- return false;
+ //
+ // Allow relay traffic over port 53
+ //
+ conditionBuilder.add_condition(ConditionIp::Remote(m_relayHost, CompareNeq()));
}
- }
-
- filterBuilder
- .name(L"Restrict DNS requests inside the VPN tunnel (IPv4)")
- .key(MullvadGuids::FilterRestrictDns_Outbound_Tunnel_Ipv4())
- .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V4);
-
- {
- wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V4);
-
- conditionBuilder.add_condition(ConditionPort::Remote(53));
- conditionBuilder.add_condition(ConditionIp::Remote(m_v4DnsHost, CompareNeq()));
if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
{
@@ -104,38 +90,38 @@ bool RestrictDns::apply(IObjectInstaller &objectInstaller)
// IPv6 also
//
- filterBuilder
- .key(MullvadGuids::FilterRestrictDns_Outbound_Ipv6())
- .name(L"Block DNS requests outside the VPN tunnel (IPv6)")
- .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
-
+ if (m_v6DnsHost.has_value())
{
- wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
-
- conditionBuilder.add_condition(ConditionPort::Remote(53));
- conditionBuilder.add_condition(ConditionInterface::Alias(m_tunnelInterfaceAlias, CompareNeq()));
+ filterBuilder
+ .key(MullvadGuids::FilterRestrictDns_Outbound_Tunnel_Ipv6())
+ .name(L"Restrict DNS requests inside the VPN tunnel (IPv6)")
+ .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V6)
+ .weight(MAXUINT16)
+ .permit();
- if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
{
- return false;
+ wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
+
+ conditionBuilder.add_condition(ConditionInterface::Alias(m_tunnelInterfaceAlias, CompareEq()));
+ conditionBuilder.add_condition(ConditionIp::Remote(m_v6DnsHost.value(), CompareEq()));
+
+ if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
+ {
+ return false;
+ }
}
}
filterBuilder
- .key(MullvadGuids::FilterRestrictDns_Outbound_Tunnel_Ipv6())
- .name(L"Restrict DNS requests inside the VPN tunnel (IPv6)")
- .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
+ .key(MullvadGuids::FilterRestrictDns_Outbound_Ipv6())
+ .name(L"Block DNS requests outside the VPN tunnel (IPv6)")
+ .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V6)
+ .weight(MAXUINT16 - 1)
+ .block();
{
wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
-
conditionBuilder.add_condition(ConditionPort::Remote(53));
-
- if (m_v6DnsHost != nullptr)
- {
- conditionBuilder.add_condition(ConditionIp::Remote(*m_v6DnsHost, CompareNeq()));
- }
-
return objectInstaller.addFilter(filterBuilder, conditionBuilder);
}
}
diff --git a/windows/winfw/src/winfw/rules/restrictdns.h b/windows/winfw/src/winfw/rules/restrictdns.h
index 0b54a6465e..cdfe1f4697 100644
--- a/windows/winfw/src/winfw/rules/restrictdns.h
+++ b/windows/winfw/src/winfw/rules/restrictdns.h
@@ -2,7 +2,9 @@
#include "ifirewallrule.h"
#include "libwfp/ipaddress.h"
+#include <optional>
#include <string>
+#include <cstdint>
namespace rules
{
@@ -11,7 +13,7 @@ class RestrictDns : public IFirewallRule
{
public:
- RestrictDns(const std::wstring &tunnelInterfaceAlias, const wfp::IpAddress v4DnsHost, std::unique_ptr<wfp::IpAddress> v6DnsHost, std::unique_ptr<wfp::IpAddress> relay);
+ RestrictDns(const std::wstring &tunnelInterfaceAlias, const wfp::IpAddress v4DnsHost, std::optional<wfp::IpAddress> v6DnsHost, wfp::IpAddress relay, uint16_t relayPort);
bool apply(IObjectInstaller &objectInstaller) override;
@@ -19,9 +21,9 @@ private:
const std::wstring m_tunnelInterfaceAlias;
const wfp::IpAddress m_v4DnsHost;
- const std::unique_ptr<wfp::IpAddress> m_v6DnsHost;
- // If connecting to relay on port 53, the traffic to port 53 should be allowed.
- const std::unique_ptr<wfp::IpAddress> m_relayHost;
+ const std::optional<wfp::IpAddress> m_v6DnsHost;
+ const uint16_t m_relayPort;
+ const wfp::IpAddress m_relayHost;
};