Instalando o dcrseeder

3 minutos de leitura

1. Introdução

O serviço dcrseeder é o agregador da rede Decred, que expõe uma lista de nodes confiáveis usando um servidor de DNS interno. O dcrd se conecta nos servidores DNS da rede e procura nodes válidos. É esse serviço que frequentemente valida os nodes conhecidos e disponibiliza essa informação para outros nodes, que por sua vez passam a outros e assim por diante.

Figura 1 - dcrd consulta dcrseeder para atualizar informações sobre nodes
Figura 1 - dcrd consulta dcrseeder para atualizar informações sobre nodes

Para saber mais, veja o artigo A estrutura do Decred.

Pré-requisito

A linguagem Go 1.9 deve estar instalada. Para instalar, veja o artigo Instalando o Go (golang).

2. Instalação

Os passos a seguir foram executados em um Debian 9 64-bit.

a) Clone o repositório do dcrseeder:

$ git clone https://github.com/decred/dcrseeder $HOME/go/src/github.com/decred/dcrseeder

Se não possui o git instalado:

$ sudo apt-get install git

b) Entre no diretório que acabou de ser criado, execute o Dep para verificar as dependências e compile:

$ cd $HOME/go/src/github.com/decred/dcrseeder

$ dep ensure
$ go build
ou
$ /usr/local/bin/go/bin/dep ensure
$ /usr/local/bin/go/bin/go build

c) Se não ocorreu nenhum erro, deve haver um arquivo dcrseeder com atributo executável. Tente visualizar a mensagem de ajuda do dcrseeder:

$ ./dcrseeder --help

d) Para ter uma instalação permanente, instale o dcrseeder através do Go:

$ go install . ./cmd/...

3. Execução

O dcrd guarda informações sobre outros nodes dcrd no arquivo peers.json, que fica no diretório padrão do dcrd, dentro do diretório da rede (mainnet, testnet2). Quando busca outros nodes na rede o dcrd lê esse arquivo e tenta se conectar nos nodes já conhecidos. Depois de um tempo sem executar o dcrd, é possível que todos aqueles nodes conhecidos tenham sido desligados ou que seus endereços IP já tenham mudado.

Figura 2 - dcrd usa dcrseeder para localizar outros nodes da rede
Figura 2 - dcrd usa dcrseeder para localizar outros nodes da rede

Para resolver isso o dcrd se conecta nos servidores DNS da rede e procura nodes válidos. É o serviço dcrseeder que frequentemente valida os nodes conhecidos e disponibiliza essa informação para outros nodes e assim por diante.

Figura 3 - Um esquema simplificado das consultas DNS
Figura 3 - Um esquema simplificado das consultas DNS

Servidores DNS se comunicam usando a porta UDP/53. Para evitar ataques que comprometam todo o sistema, o dcrseeder é executado como um usuário comum e por isso só pode escutar em portas não privilegiadas, acima de 1024. Será necessário redirecionar o tráfego DNS com origem na Internet, padrão UDP/53, para essa porta, como UDP/5354, por exemplo.

Figura 4 - PAT configurado no firewall
Figura 4 - PAT configurado no firewall

$ sudo iptables -t nat -A PREROUTING -i $INTERFACE -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:5354

A variável $INTERFACE deve ser substituída pelo nome do dispositivo no sistema operacional (eth0, wlan0, ens33, etc.).

Além dessa modificação no firewall local, será necessário modificar também o roteador de borda, que faz a conexão com a Internet. Será necessário configurar no roteador pelo menos um NAT (Network Address Translation), que é uma tradução de endereços IP. Quando chegar no endereço IP público um pacote para a porta UDP/53, o roteador encaminhará o pacote para o endereço IP do servidor onde o dcrseeder está sendo executado.

Também é possível executar ambas as configurações no roteador de borda para não precisar configurar o PAT (Port Address Translation) no iptables local. Dessa forma o pacote chega na interface externa do roteador de borda em UDP/53 e sai na rede interna com destino ao dcrseeder na porta UDP/5354. Tradução de endereço IP e porta em uma única configuração, também chamada de PAT.

Também será necessário criar uma regra de firewall no iptables local que permita a entrada de pacotes na porta UDP/5354:

$ sudo iptables -A INPUT -p udp --dport 5354 -m comment --comment "dcrseeder" -j ACCEPT

Para executar o dcrseeder na porta UDP/5354:

$ ./dcrseeder -H dnsseed.mydcrdomain.com -n ns.mydcrdomain.com -s 127.0.0.1

As opções -H, -n e -s são obrigatórias:

-H <host>     Nome de host para registro do DNS Seed
-n <ns>       Nome de host do Servidor DNS do domínio
-s <host>     Nome de host para conexão do dcrseeder
--testnet     Funcionar como DNS Seeder da Testnet

4. Atualização

Para atualizar uma instalação existente:

$ cd $GOPATH/src/github.com/decred/dcrseeder
$ git pull
$ dep ensure
$ go install . ./cmd/...