.gitignore | ||
bitcoin.cpp | ||
bitcoin.h | ||
combine.pl | ||
compat.h | ||
db.cpp | ||
db.h | ||
dns.cpp | ||
dns.h | ||
main.cpp | ||
Makefile | ||
netbase.cpp | ||
netbase.h | ||
protocol.cpp | ||
protocol.h | ||
readme.md | ||
serialize.h | ||
strlcpy.h | ||
test.pl | ||
uint256.h | ||
util.cpp | ||
util.h |
seeder
seeder is a crawler for the LBRY network, which exposes a list of reliable nodes via a built-in DNS server.
Features:
- regularly revisits known nodes to check their availability
- bans nodes after enough failures, or bad behaviour
- accepts nodes down to v0.3.19 to request new IP addresses from, but only reports good post-v0.3.24 nodes.
- keeps statistics over (exponential) windows of 2 hours, 8 hours, 1 day and 1 week, to base decisions on.
- very low memory (a few tens of megabytes) and cpu requirements.
- crawlers run in parallel (by default 24 threads simultaneously).
Build
sudo apt-get install build-essential libboost-dev libssl-dev
make
Use
Assumptions:
- lbrycrd will use the domain
seed.example.com
to find peer nodes - you will be running this seeder on a server at domain
vps.example.com
Configure DNS
You will need two DNS records:
type | name | value |
---|---|---|
NS | seed.example.com | vps.example.com |
A | vps.example.com | 1.2.3.4 |
Test your DNS records
$ dig -t NS seed.example.com
;; ANSWER SECTION
seed.example.com. 86400 IN NS vps.example.com.
Disable systemd resolver (Ubuntu 18.04+)
You only need this if you want to run the seeder on port 53 and it's taken by Ubuntu's resolved. Run the following to turn the resolver off and prevent it from starting on reboot
sudo systemctl stop systemd-resolved.service
sudo systemctl disable systemd-resolved.service
Open firewall port
For example, if using UFW, run ufw allow 53
. Some VPS providers also
have their own firewall that you'll need to configure.
Run the seeder
On the system vps.example.com, you can now run dnsseed:
./dnsseed -h seed.example.com -n vps.example.com
If you want the DNS server to report SOA records, please provide an
e-mail address (with the @ part replaced by .) using -m
.
Running as non-root
Typically, you'll need root privileges to listen to port 53 (name service).
One solution is using an iptables rule (Linux only) to redirect it to a non-privileged port:
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 5353
If properly configured, this will allow you to run dnsseed in userspace, using the -p 5353 option.
Another solution is allowing a binary to bind to ports < 1024 with setcap (IPv6 access-safe)
setcap 'cap_net_bind_service=+ep' /path/to/dnsseed
Debugging
Server-side
On the server, run sudo tcpdump port 53
. This will show you all traffic on port 53. As
you send DNS queries, you should see A
requests come in and response IPs go out.
- no incoming responses: DNS or firewall issues, or DNS request is cached client-side
- no responses: seeder is not running, or running on the wrong port, or broken
- empty responses: requested domain doesn't match configured domain in seeder
You can also look at the output of the running seeder. It looks like this
[21-04-12 19:30:49] 28/104 available (104 tried in 994s, 1 new, 30 active), 0 banned; 38 DNS requests, 1 db queries
- if # of DNS requests is not going up as you send them, then seeder is not getting your requests
- if DNS requests are increasing but db queries are not, then the -h domain doesn't match
- if seeder didn't find any nodes, then it can't contact the nodes it itself is seeded with
Client-side
Try dig +short seed.example.com
. If you get node IPs, your setup is working.
Other things to try
dig @1.2.3.4 seed.example.com
to bypass local DNS cache or incorrect DNS recordsdig +trace seed.example.com
for detailed routing info