mirror of https://github.com/oxen-io/lokinet
add dns hosts file option for user side dns filtering
This commit is contained in:
parent
a24b82119b
commit
a6fbaa7c7a
|
@ -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…
Reference in New Issue