add dns hosts file option for user side dns filtering

pull/1656/head
Jeff Becker 3 years ago
parent a24b82119b
commit a6fbaa7c7a
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -748,6 +748,21 @@ namespace llarp
m_bind.setPort(53);
});
conf.defineOption<std::string>(
"dns",
"add-hosts",
ClientOnly,
Comment{"Add a hosts file to the dns resolver", "For use with client side dns filtering"},
[=](std::string arg) {
if (arg.empty())
return;
fs::path path{arg};
if (not exists(path))
throw std::invalid_argument{
stringify("cannot add hosts file ", path, " as it does not seem to exist")};
m_hostfiles.emplace_back(std::move(path));
});
// Ignored option (used by the systemd service file to disable resolvconf configuration).
conf.defineOption<bool>(
"dns",

@ -137,6 +137,7 @@ namespace llarp
{
SockAddr m_bind;
std::vector<SockAddr> m_upstreamDNS;
std::vector<fs::path> m_hostfiles;
void
defineConfigOptions(ConfigDefinition& conf, const ConfigGenParameters& params);

@ -26,9 +26,9 @@ namespace llarp::dns
}
bool
Proxy::Start(SockAddr addr, std::vector<SockAddr> resolvers)
Proxy::Start(SockAddr addr, std::vector<SockAddr> resolvers, std::vector<fs::path> hostfiles)
{
if (not PacketHandler::Start(addr, std::move(resolvers)))
if (not PacketHandler::Start(addr, std::move(resolvers), std::move(hostfiles)))
return false;
return m_Server->listen(addr);
}
@ -44,13 +44,14 @@ namespace llarp::dns
}
bool
PacketHandler::Start(SockAddr, std::vector<SockAddr> resolvers)
PacketHandler::Start(SockAddr, std::vector<SockAddr> resolvers, std::vector<fs::path> hostfiles)
{
return SetupUnboundResolver(std::move(resolvers));
return SetupUnboundResolver(std::move(resolvers), std::move(hostfiles));
}
bool
PacketHandler::SetupUnboundResolver(std::vector<SockAddr> resolvers)
PacketHandler::SetupUnboundResolver(
std::vector<SockAddr> resolvers, std::vector<fs::path> hostfiles)
{
// if we have no resolvers don't set up unbound
if (resolvers.empty())
@ -85,6 +86,10 @@ namespace llarp::dns
}
m_Resolvers.emplace(resolver);
}
for (const auto& path : hostfiles)
{
m_UnboundResolver->AddHostsFile(path);
}
return true;
}

@ -35,7 +35,10 @@ namespace llarp
virtual ~PacketHandler() = default;
virtual bool
Start(SockAddr localaddr, std::vector<SockAddr> upstreamResolvers);
Start(
SockAddr localaddr,
std::vector<SockAddr> upstreamResolvers,
std::vector<fs::path> hostfiles);
void
Stop();
@ -58,7 +61,7 @@ namespace llarp
HandleUpstreamFailure(const SockAddr& from, const SockAddr& to, Message msg);
bool
SetupUnboundResolver(std::vector<SockAddr> resolvers);
SetupUnboundResolver(std::vector<SockAddr> resolvers, std::vector<fs::path> hostfiles);
IQueryHandler* const m_QueryHandler;
std::set<SockAddr> m_Resolvers;
@ -73,7 +76,10 @@ namespace llarp
explicit Proxy(EventLoop_ptr loop, IQueryHandler* handler);
bool
Start(SockAddr localaddr, std::vector<SockAddr> resolvers) override;
Start(
SockAddr localaddr,
std::vector<SockAddr> upstreamResolvers,
std::vector<fs::path> hostfiles) override;
protected:
void

@ -3,6 +3,7 @@
#include "server.hpp"
#include <llarp/util/buffer.hpp>
#include <sstream>
#include <llarp/util/str.hpp>
namespace llarp::dns
{
@ -119,6 +120,21 @@ namespace llarp::dns
return true;
}
void
UnboundResolver::AddHostsFile(const fs::path& file)
{
LogDebug("adding hosts file ", file);
const auto str = file.u8string();
if (auto ret = ub_ctx_hosts(unboundContext, str.c_str()))
{
throw std::runtime_error{stringify("Failed to add host file ", file, ": ", ub_strerror(ret))};
}
else
{
LogInfo("added hosts file ", file);
}
}
void
UnboundResolver::Lookup(SockAddr to, SockAddr from, Message msg)
{

@ -7,6 +7,7 @@
#include <queue>
#include <llarp/ev/ev.hpp>
#include <llarp/util/fs.hpp>
#include "message.hpp"
@ -52,6 +53,9 @@ namespace llarp::dns
bool
AddUpstreamResolver(const SockAddr& upstreamResolverIP);
void
AddHostsFile(const fs::path& file);
void
Lookup(SockAddr to, SockAddr from, Message msg);
};

@ -477,7 +477,7 @@ namespace llarp
GetRouter()->loop()->add_ticker([this] { Flush(); });
llarp::LogInfo("Trying to start resolver ", m_LocalResolverAddr);
return m_Resolver->Start(m_LocalResolverAddr, m_UpstreamResolvers);
return m_Resolver->Start(m_LocalResolverAddr, m_UpstreamResolvers, {});
}
return true;
}

@ -169,6 +169,7 @@ namespace llarp
m_LocalResolverAddr = dnsConf.m_bind;
m_UpstreamResolvers = dnsConf.m_upstreamDNS;
m_hostfiles = dnsConf.m_hostfiles;
m_BaseV6Address = conf.m_baseV6Address;
@ -945,7 +946,8 @@ namespace llarp
llarp::LogError(Name(), " failed to set up network interface");
return false;
}
if (!m_Resolver->Start(m_LocalResolverAddr.createSockAddr(), m_UpstreamResolvers))
if (!m_Resolver->Start(
m_LocalResolverAddr.createSockAddr(), m_UpstreamResolvers, m_hostfiles))
{
llarp::LogError(Name(), " failed to start DNS server");
return false;

@ -266,6 +266,8 @@ namespace llarp
llarp::IPRange m_OurRange;
/// upstream dns resolver list
std::vector<SockAddr> m_UpstreamResolvers;
/// dns host files list
std::vector<fs::path> m_hostfiles;
/// local dns
IpAddress m_LocalResolverAddr;
/// list of strict connect addresses for hooks

Loading…
Cancel
Save