DIG Crash Course
O DIG é uma ferramenta para interrogar servidores de DNS.
Com o DIG nós conseguiremos fazer lookup de DNS com objetivos simples como troubleshooting por exemplo.
A ideia aqui é fazer um crash course dessa ferramenta.
Um Crash Course é um tipo de “curso rápido” sobre um determinado assunto, indo direto ao ponto de forma mais objetiva possível.
Quando devo usar o DIG?
Sempre que você precisar verificar alguma coisa em nível de DNS, seguem alguns cenários que o DIG pode te ajudar :
- para testar se a resolução de DNS está funcionando
- para comparar a resolução de DNS entre NS diferentes
- quando precisamos resolver um problema de DNS
- para descobrir o IP de um registro de DNS
- para descobrir o MX de um domínio
- para descobrir o NS de um domínio
- para descobrir o SOA de um domínio
- para descobrir o PTR (reverso) de um endereço IP
- para verificar se uma alteração de registro já fez efeito
Essas são algumas das situações mais básicas em que o DIG pode ser útil.
Para quem foi feito esse post?
Aqui o foco está nas pessoas atuando nas posições abaixo:
- Sysadmin;
- Cloud Native Engineer;
- Cloud Engineer;
- DevOps Engineer;
- Plataform Engineer;
- GitOps Engineer.
Momento Merchan :P
Me siga no twitter @gutocarvalho e acompanhe meus posts sobre Cloud Native e CI/CD.
Aproveite e siga a CD Foundation e Cloud Native Foundation no twitter.
Colaboradores
Pessoas que colaboraram com o texto.
- Julia Lamenza (@jlamenza)
- João (@P0ssuidao)
- Rafael Gomex (@gomex)
- Rafael Silva (@rafaotetra)
Dig Crash Course
Aprendendo o básico para uso no dia a dia
$ dig gutocarvalho.net
fazendo uma pesquisa simples retornando só o IP
$ dig +short gutocarvalho.net
pesquisando o SOA do domínio
$ dig SOA gutocarvalho.net
pesquisando o NS do domínio
$ dig NS gutocarvalho.net
pesquisando o MX de correio
$ dig MX gutocarvalho.nmet
pesquisando o TTL do domínio
$ dig TTL gutocarvalho.net
pesquisando o PTR (reverso) de um IP
$ dig -x 8.8.8.8
pesquisando os registros TXT de um domínio
$ dig txt gutocarvalho.net
Explorando um pouco mais o DIG
pesquisando um registro em um NS específico
$ dig @1.1.1.1 lb.gutocarvalho
$ dig +dnssec gutocarvalho.net
pesquisando as chaves DNSSEC de um domínio
$ dig DNSKEY -qr gutocarvalho.net
$ dig +trace lb.gutocarvalho.net
verificando o tempo de resposta do SOA de um domínio
$ dig +nssearch gutocarvalho.net
Parâmetros interessantes do DIG
+short
$ dig gutocarvalho.net +short
185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153
O short só retorna os IPs para qual o registro aponta.
+tcp
$ dig +tcp gutocarvalho.net
Usado quando desejamos fazer a pesquisa via TCP, o padrão é UDP.
+time
$ dig +time=5 gutocarvalho.net
Define o timeout da pesquisa para 5 segundos.
+multiline
$ dig gutocarvalho.net A +dnssec +multiline
Vai pesquisar entradas A com DNSSEC associado em multi-linhas.
Primeiro vamos fazer uma pesquisa comum para ter uma saída completa
$ dig gutocarvalho.net
; <<>> DiG 9.10.6 <<>> gutocarvalho.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40038
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net. IN A
;; ANSWER SECTION:
gutocarvalho.net. 300 IN A 185.199.108.153
gutocarvalho.net. 300 IN A 185.199.109.153
gutocarvalho.net. 300 IN A 185.199.110.153
gutocarvalho.net. 300 IN A 185.199.111.153
;; Query time: 38 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 18:53:55 -03 2022
;; MSG SIZE rcvd: 109
Agora vamos testando cada parâmetro
+noall
$ dig gutocarvalho.net +noall
; <<>> DiG 9.10.6 <<>> gutocarvalho.net +noall
;; global options: +cmd
Observe que o noall omite toda a saída do comando, ele normalmente é usado com outros comandos de forma composta, um exemplo é o answer.
+answer +noall
$ dig gutocarvalho.net +noall +answer
; <<>> DiG 9.10.6 <<>> gutocarvalho.net +noall +answer
;; global options: +cmd
gutocarvalho.net. 300 IN A 185.199.111.153
gutocarvalho.net. 300 IN A 185.199.108.153
gutocarvalho.net. 300 IN A 185.199.109.153
gutocarvalho.net. 300 IN A 185.199.110.153
O answer é útil junto com o noall, ele vai nos trazer apenas a resposta, sem comments, question, authority, stats e quaisquer outras informações que estiverem disponíveis na resposta.
+nocmd
dig +nocmd a lb.gutocarvalho.net +noall +answer
lb.gutocarvalho.net. 42 IN A 200.150.204.87
Quando aplicado retira a versao do bind e comando
; <<>> DiG 9.10.6 <<>> a lb.gutocarvalho.net +noall +answer
Para funcionar o parâmetro tem que vir logo após o comando dig
$ dig gutocarvalho.net +nocomments
; <<>> DiG 9.10.6 <<>> gutocarvalho.net +nocomments
;; global options: +cmd
;gutocarvalho.net. IN A
gutocarvalho.net. 297 IN A 185.199.110.153
gutocarvalho.net. 297 IN A 185.199.111.153
gutocarvalho.net. 297 IN A 185.199.108.153
gutocarvalho.net. 297 IN A 185.199.109.153
;; Query time: 29 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 18:58:57 -03 2022
;; MSG SIZE rcvd: 109
O nocomments retira toda a parte inicial da resposta
; <<>> DiG 9.10.6 <<>> gutocarvalho.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40925
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net. IN A
+noquestion
$ dig gutocarvalho.net +noquestion
; <<>> DiG 9.10.6 <<>> gutocarvalho.net +noquestion
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10078
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; ANSWER SECTION:
gutocarvalho.net. 300 IN A 185.199.108.153
gutocarvalho.net. 300 IN A 185.199.109.153
gutocarvalho.net. 300 IN A 185.199.110.153
gutocarvalho.net. 300 IN A 185.199.111.153
;; Query time: 42 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 19:01:58 -03 2022
;; MSG SIZE rcvd: 109
O noquestion retira essa parte da resposta
;; QUESTION SECTION:
;gutocarvalho.net. IN A
+nostats
$ dig gutocarvalho.net +nostats
; <<>> DiG 9.10.6 <<>> gutocarvalho.net +nostats
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63625
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net. IN A
;; ANSWER SECTION:
gutocarvalho.net. 300 IN A 185.199.109.153
gutocarvalho.net. 300 IN A 185.199.110.153
gutocarvalho.net. 300 IN A 185.199.111.153
gutocarvalho.net. 300 IN A 185.199.108.153
Esse parâmetro suprime as estatísticas da pesquisa.
;; Query time: 38 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 19:13:28 -03 2022
;; MSG SIZE rcvd: 109
+noauthority
;; AUTHORITY SECTION:
gutocarvalho.net. 3144 IN NS monroe.ns.cloudflare.com.
gutocarvalho.net. 3144 IN NS houston.ns.cloudflare.com.
É útil para remover essa parte da resposta, caso retorne o authority na pesquisa.
+noadditional
;; ADDITIONAL SECTION:
lia.ns.cloudflare.com. 84354 IN A 173.245.58.185
lia.ns.cloudflare.com. 170762 IN AAAA 2400:cb00:2049:1::adf5:3ab9
mark.ns.cloudflare.com. 170734 IN A 173.245.59.130
mark.ns.cloudflare.com. 170734 IN AAAA 2400:cb00:2049:1::adf5:3b82
A seção aditional pode trazer informações como o IP dos DNS Server autoritativos da seção authority, esse parâmetro suprime esse trecho.
+norec
$ dig +norec @monroe.ns.cloudflare.com. gutocarvalho.net a
Essa opção desabilita a pesquisa recursiva, neste caso a CloudFlare
e responsável por responder por meu domínio, sendo que o servidor monroe é um dos meus servidores DNS, ele já sabe a resposta.
Pesquisas parametrizadas comuns
pesquisa comum e rápida que retorna apenas o endereço IP
$ dig +short lb.gutocarvalho.net
pesquisando por registro A com resposta simples
$ dig +nocmd lb.gutocarvalho.net a +noall +answer
pesquisando por CNAME com resposta simples
$ dig +nocmd mail.google.com cname +noall +answer
pesquisando por registro TXT com resposta simples
$ dig +nocmd google.com txt +noall +answer
fazendo pesquisa em múltiplos domínios
$ dig ubuntu.com mx +noall +answer redhat.com ns +noall +answer
Pesquisa usando um arquivo (bulk)
Imagine que você tem o arquivo dominios.txt com o conteúdo abaixo
gutocarvalho.net
nativetrail.io
viahorizonte.life
vamos rodar agora uma pesquisa contra o arquivo
$ dig -f dominios.txt +short
saída
185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153
185.199.111.153
185.199.108.153
185.199.109.153
185.199.110.153
185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153
:)
Quer saber mais?
Para saber mais veja o help do comando
$ dig —help
Para ir além acesse a manpage
$ man dig
Configurando seu .digrc
O dig tem um arquivo de configuração, o famoso .digrc.
$ echo “+nostats +nocomments +nocmd +noquestion +recurse” > ~/.digrc
Agora você digita menos e tem o resultado desejado.
Um pouco de teoria de DNS para quem gosta :)
Entendendo o funcionamento do DIG
Imagine que mandamos essa query pelo dig
$ dig gutocarvalho.net
Essa query é estrutura da seguinte forma pelo DIG para o servidor de DNS autoritativo
+-------------------------------------+
Header | OPCODE=SQUERY |
+-------------------------------------+
Question | QNAME=GUTO.NET., QCLASS=IN, QTYPE=A |
+-------------------------------------+
Answer | <empty> |
+-------------------------------------+
Authority | <empty> |
+-------------------------------------+
Additional | <empty> |
+-------------------------------------+
A resposta do servidor que responde pelo domínio foi essa
; <<>> DiG 9.10.6 <<>> gutocarvalho.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48153
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gutocarvalho.net. IN A
;; ANSWER SECTION:
gutocarvalho.net. 300 IN A 185.199.110.153
gutocarvalho.net. 300 IN A 185.199.111.153
gutocarvalho.net. 300 IN A 185.199.108.153
gutocarvalho.net. 300 IN A 185.199.109.153
;; Query time: 146 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sun Mar 13 10:37:26 -03 2022
;; MSG SIZE rcvd: 109
Podemos estruturar dessa forma para entender melhor
+--------------------------------------------+
Header | OPCODE=SQUERY, RESPONSE, AA |
+--------------------------------------------+
Question | QNAME=GUTO.NET., QCLASS=IN, QTYPE=A |
+--------------------------------------------+
Answer | GUTO.NET. 300 IN A 185.199.108.153 |
| 300 IN A 185.199.109.153 |
| 300 IN A 185.199.110.153 |
| 300 IN A 185.199.111.153 |
+--------------------------------------------+
Authority | <empty> |
+--------------------------------------------+
Additional | <empty> |
+--------------------------------------------+
Entendendo as repostas entregues pelo DIG
Uma resposta de consulta do DIG vem composta por informações separadas nas seções Header, Question, Answer, Authority e Additional.
+------------+
| Header | Cabeçalho com informações diversas
+------------+
| Question | A questão enviada para o nameserver
+------------+
| Answer | Registros que vão responder a query
+------------+
| Authority | Registros da autoridade do domínio
+------------+
| Additional | Registros com informações adicionais
+------------+
Vamos entender cada uma delas.
- Header section, um cabeçalho fixo que contém ID, flgas e informações das outras seções (contadores)
- Question section, contém a query que foi passada (QNAME), o tipo (QTYPE) e a classe (QCLLASS). Na resposta receberemos novamente a query
- Answer section, pode conter a lista de reguistros, se houver resposta cada um irá trazer QNAME, QTYPE, QCLASS, TTL e informaçÕes de RDATA
- Authority section, pode conter a lista de registros que apontam para os servidores autoritativos
- Additional section, pode conter outros registros e mais informações sobre os servidores autoritativos
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63625
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
Informações que encontramos do HEADER
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Entendendo as informações do HEADER
QR pode conter
- 0, QUERY
- 1, RESPONSE
OPCODE pode conter os seguintes valores:
- 0 Query [RFC1035]
- 2 Status [RFC1035]
- 3 Unassigned
- 4 Notify [RFC1996]
- 5 Update [RFC2136]
- 6 DNS Stateful Operations (DSO) [RFC8490]
- 7-15 Unassigned
No Header vamos encontrar as seguintes FLAGs:
- AA: Authoritative Answer (set by the server)
- TC: message is TrunCated (set by the server)
- RD: Recursion Desired (set by the client and copied to the response)
- RA: Recursion Available (set by the server)
- AD: Authenticated Data, DNSSEC flag (set by the server)
- CD: Checking Disabled, DNSSEC flag (set by the client, copied to the response)
No Header vamos encontrar o RCODE/Status (4 bits) que pode conter:
- 0 NoError No Error [RFC1035]
- 1 FormErr Format Error [RFC1035]
- 2 ServFail Server Failure [RFC1035]
- 3 NXDomain Non-Existent Domain [RFC1035]
- 4 NotImp Not Implemented [RFC1035]
- 5 Refused Query Refused [RFC1035]
- 6 YXDomain Name Exists when it should not [RFC2136][RFC6672]
- 7 YXRRSet RR Set Exists when it should not [RFC2136]
- 8 NXRRSet RR Set that should exist does not [RFC2136]
- 9 NotAuth Server Not Authoritative for zone [RFC2136]
- 9 NotAuth Not Authorized [RFC8945]
- 10 NotZone Name not contained in zone [RFC2136]
- 11 DSOTYPENI DSO-TYPE Not Implemented [RFC8490]
- 12-15 Unassigned
- 16 BADVERS Bad OPT Version [RFC6891]
- 16 BADSIG TSIG Signature Failure [RFC8945]
- 17 BADKEY Key not recognized [RFC8945]
- 18 BADTIME Signature out of time window [RFC8945]
- 19 BADMODE Bad TKEY Mode [RFC2930]
- 20 BADNAME Duplicate key name [RFC2930]
- 21 BADALG Algorithm not supported [RFC2930]
- 22 BADTRUNC Bad Truncation [RFC8945]
- 23 BADCOOKIE Bad/missing Server Cookie [RFC7873]
- 24-3840 Unassigned
- 3841-4095 Reserved for Private Use [RFC6895]
- 4096-65534 Unassigned
- 65535 Reserved, can be allocated by Standards Action [RFC6895]
No Header também temos contadores, são eles:
- QDCOUNT, número de respostas da seção queries
- ANCOUNT, número de respostas da seção answers
- NSCOUNT, número de respostas da seção autoritativos
- ARCOUNT, número de respostas da seção adicional
Os contadores vão retornar o número de registros encontrados na pesquisa
Entendendo um pouco mais das Flags do HEADER
Você verá que na resposta teremos geralmente 4 flags setadas, sao elas:
- qr, rd, ra, ad.
Vamos entendê-las agora
- QR, é uma flag diferente que pode retornar 0 ou 1, 1 significa query
- RD significa "recursive desired", sinaliza que desejamos usar pesquisa recursiva, isso é definido pelo cliente.
- RA significa "recursive available", sinaliza que pesquisa recursiva está disponível, isso é definiado pelo servidor.
- AD significa "authenticated data", sinaliza que os dados de resposta e autoridade foram validados e autenticados pelas políticas de segurança daquele servidor de dns. É setado apenas quando todos os dados da resposta foram devidamente criptografados e verificados. Esse é um recurso do DNSSEC.
Existem ainda as seguintes flags opcionais
- AA, significa servidor autoritativo
- TC, significa mensagem truncada
E no caso de DNSSEC pode conter ainda
- CD, significa "checking disabled", utilizado pelo DNSSEC.
- DO, que significa que a resposta do DNSSEC está ok
Entendendo os status (RCODE) mais comuns
- NOERROR (0), a pesquisa voltou sem erros
- SERVFAIL (2), houve uma falha na resposta do servidor
- NXDOMAN (3), o domínio não foi encontrado ou não existe
- REFUSED (5), o pedido de query foi recusado
QUESTION SECTION
Aqui encontraremos dados de nossa query.
;; QUESTION SECTION:
;gutocarvalho.net. IN A
Uma query é estruturada da seguinte forma:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Vamos entender QNAME, QTYPE e QCLASS.
- QNAME possuirá o domínio que você setou na query
- QTYPE possuirá o tipo de RR que você utilizou na pesquisa
- QCLASS possuirá o tipo de classe de DNS, geralmente IN (internet)
ANSWER SECTION
;; ANSWER SECTION:
gutocarvalho.net. 300 IN A 185.199.108.153
gutocarvalho.net. 300 IN A 185.199.109.153
gutocarvalho.net. 300 IN A 185.199.110.153
gutocarvalho.net. 300 IN A 185.199.111.153
Retorna os registros e informações destes, se houver.
AUTHORITY SECTION
;; AUTHORITY SECTION:
gutocarvalho.net. 3533 IN NS monroe.ns.cloudflare.com.
gutocarvalho.net. 3533 IN NS houston.ns.cloudflare.com.
Retorna dados de autoridade acerca do domínio.
ADITIONAL SECTION
;; ADDITIONAL SECTION:
monroe.ns.cloudflare.com. 107 IN A 172.64.34.153
houston.ns.cloudflare.com. 900 IN A 172.64.35.52
Retorna dados adicionais da query.
QUERY SECTION
;; Query time: 36 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sat Mar 12 19:49:29 -03 2022
;; MSG SIZE rcvd: 109
Retorna métricas da query, auto explicativo.
Glossário
termos comuns
- Zona, Uma zona contém as informações e registros de um domínio
- TTL, significa Time to live, é o tempo de vida de um registro ou zona
- DNSSEC, é um sistema de proteção que aumenta a segurança do DNS
tipos de registros comuns e seus significados
- SOA, Start of Authority ou início de autoridade
- NS, significa nameserver, esse registro aponta para um servidor de DNS
- A, registro tipo endereço ipv4, é associado a um endereço IP
- AAAA, registro tipo endereço ipv6, é associado a um endereço IP
- PTR, registro tipo reverso, ele resolve um IP para um nome
- CNAME, nome canônico, ele resolve um nome para outro nome.
- MX, significa mail exchange, aponta para o servidor de correio
- TXT, registros de texto, podem ter qualquer tipo de informação
tipos de registro para DNSSEC
- DNSKEY: keeps the public key to verify RRSIGs
- DS: keeps the digest of a DNSKEY RR
- RRSIG: keeps the digital signature of an RRset
- NSEC: used for authenticated denial existence, meaning to show an RRset is not part of a signed zone
tipos de pesquisa de DNS
- Iterative approach: where the resolver/client repeatedly queries different servers until it finds the answer
- Recursive approach: where the resolver/client sends the query only to a single server, but the server repeatedly queries different servers until it finds and returns the answer to the resolver
Quais outras ferramentas uso para troubleshooting de DNS?
ferramentas clássicas
ferramentas extras para testes do lado do cliente
ferramentas extras para testes em seu servidor de dns
Quais os comandos que eu mais uso no dia-a-dia?
$ dig +short lb.gutocarvalho.net
$ dig -x 200.150.204.87
$ dig mx gutocarvalho.net
$ dig ns gutocarvalho.net
Amarrando as pontas
Esse post é uma tentativa de dar um norte ou um caminho para fazer um bom troubleshooting de DNS.
Volte aqui sempre que precisar :)
Aquele abraço!
Mando aquele abraço para o professor MESTRE Ulysses Almeida (@ulyssesalmeida) que me ensinou a usar o DIG lá no início do século.
Mando aquele abraço pro @gomex e @badtux que via exemplo me fazem contribuir mais e mais e mais :)
Mando aquele abraço para todos que leram, comentaram, revisaram e contribuíram de alguma forma com esse post!
DNS RFC's
References
Este post é do tipo #Mindnodes, entenda aqui.
Se gostou manda um alô no twitter @gutocarvalho ou deixa um comentário bacana :)
[s]
Guto
Gostou do conteúdo?
Você também me encontra nessas redes!
Mastodon
@gutocarvalho@bolha.us
PixelFed
@gutocarvalho@bolha.photos
Lemmy
@gutocarvalho@bolha.forum
WriteFreely
@gutocarvalho@bolha.blog
@notamental@bolha.blog
@poesias@bolha.blog
@contos@bolha.blog
Bookwyrm
@gutocarvalho@bolha.review
Peertube
@gutocarvalho@bolha.tube
Friendica
@gutocarvalho@bolha.network
Quer saber mais sobre mim?
Visite meus sites!
E meus blogs:
Conhece o Coletivo Bolha?
Então vem conhecer o bolha.io ou bolhaverso!
- fediverso
- chat
- vídeo
- frontends
- translations
- editors
- secrets sharing
- pastbin
- terminal recorder
- anti paywall
Nós temos muito mais para compartilhar contigo!
Quer apoiar nosso trabalho? Você pode!
Te vejo no mastodon da bolha.us!
[s]