6P by GN⁺ | ★ favorite | 댓글 1개
  • dns.toys는 DNS 질의를 명령 인터페이스처럼 활용해, 터미널에서 dig만으로 작은 유틸리티를 실행하게 해주는 DNS 서버임
  • 세계 시간, 날씨, 70개 이상 단위 변환, 일일 환율 기반 통화 변환처럼 검색 페이지를 열기 번거로운 작업을 바로 처리할 수 있음
  • 개발자에게 필요한 CIDR 범위 계산, UUID v4·NanoID 생성, Unix epoch 변환, 진법 변환 같은 기능도 함께 제공함
  • 호출은 @dns.toys를 지정하는 방식이며, Bash·Fish·Zsh에서는 dy alias를 추가해 더 짧게 사용할 수 있음
  • 실무 도구라기보다 터미널 안에서 빠르게 확인·계산하는 재미와 편의성을 노린 서비스로, 간단한 조회 작업에 잘 맞음

DNS 질의로 실행하는 터미널 유틸리티

  • dns.toys는 여러 기능을 DNS 서버로 제공하며, 도메인 형식의 질의를 dig로 보내 실행함
  • 시간·날씨·변환

    • dig mumbai.time @dns.toys: 도시의 현재 시간 조회
    • dig 2023-05-28T14:00-mumbai-paris/fr.time @dns.toys: 도시 간 시간대 변환
    • dig mumbai.weather @dns.toys: 도시 날씨 조회
    • dig 42km-mi.unit @dns.toys: 70개 이상 단위 간 변환
    • dig 100USD-INR.fx @dns.toys: 일일 환율 기반 통화 변환
    • dig -4 ip @dns.toys: IPv4 또는 IPv6 주소 확인
  • 계산·개발자용 기능

    • dig 10.0.0.0/24.cidr @dns.toys: 서브넷에서 첫 번째와 마지막 사용 가능 IP 계산
    • dig 100dec-hex.base @dns.toys: hex, dec, oct, bin 간 진법 변환
    • dig 784783800.epoch @dns.toys: Unix timestamp를 읽을 수 있는 날짜로 변환
    • dig 5.uuid @dns.toys: UUID v4 생성
    • dig 5.10.nanoid @dns.toys: 지정 길이와 개수로 NanoID 생성
  • 장난감 기능

    • dig pi @dns.toys: Pi 숫자 출력
    • dig 3d20/2.dice @dns.toys: 지정한 개수와 면수로 주사위 굴림
    • dig 2.coin @dns.toys: 동전 던지기
    • dig 1-100.rand @dns.toys: 범위 내 난수 생성
    • dig excuse @dns.toys: 임의의 개발자 변명 출력

짧게 호출하기 위한 셸 alias

  • dy 단축 명령을 추가하면 dy mumbai.weather처럼 더 짧게 호출 가능함
    • Bash: alias dy="dig +short @dns.toys"~/.bashrc에 추가
    • Fish: alias dy="dig +noall +answer +additional $argv @dns.toys"~/.config/fish/config.fish에 추가
    • Zsh: alias dy="dig +short @dns.toys"~/.zshrc에 추가
  • 터미널에서 많은 시간을 보내는 사용자는 무거운 검색 페이지를 열지 않고 단위 변환이나 날씨 확인 같은 작업을 빠르게 처리할 수 있음

댓글과 토론

Hacker News 의견들
  • 예전에 동적 DNS 유틸리티를 직접 만들면서 내 머신의 IP 주소를 “안정적으로” 계산하려고 썼던 작은 트릭이 떠오름
    OpenDNS 리졸버(resolver1.opendns.com 등)는 myip.opendns.com을 실제 IP 주소로 해석해 줌. 연결 상태에 따라 A 또는 AAAA 레코드가 나오고, 이 리졸버들의 IP는 보통 애니캐스트 IP라 언제든 죽을 수 있는 중앙 HTTP 서비스에 요청하는 것보다 약간 빠를 거라고 믿고 싶었음
    물론 OpenDNS도 언제든 사라질 수 있지만, 수많은 “내 IP 주소가 뭐지?” HTTP 서비스보다 그 위험이 더 낫다고 봄. DNS가 원래 도메인 이름보다 더 넓은 범위의 데이터를 다루도록 의도됐다는 얘기도 들은 적이 있는데, TXT 레코드 같은 것이 그 흔적임. 이 사이트는 DNS로 얻을 수 있는 유용성을 잘 보여줌

    • Google과 Akamai도 DNS 서비스를 제공함
      dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
      dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
    • OpenDNS와 YouTube 중 뭐가 더 내려갈 가능성이 높을까
      curl -4si0A "" https://www.youtube.com|sed -n '/ip=/{s/.*ip=//;s/\.*//p;};'|uniq
      OpenDNS와 Cloudflare 중 뭐가 더 내려갈 가능성이 높을까. 아래 방식은 어떤 Cloudflare IP 주소에서도 동작하고 TLS도 필요 없음
      printf 'GET /cdn-cgi/trace HTTP/1.0\r\nHost: cloudflare.com |nc -vvn 104.18.25.13 80 |sed -n /ip=/p
      Cloudflare IP 목록은 curl -4si0A "" https://api.cloudflare.com/client/v4/ips로 받을 수 있음. 클라이언트 IP 주소를 웹페이지나 HTTP 헤더에 찍어 주는 웹사이트는 아주 많고, 꼭 “What is my IP” 사이트일 필요도 없음
      Cloudflare로 특정 요청을 막는 웹사이트도 선택지가 됨. 예를 들어 StackOverflow에 User-Agent 헤더 없이 HTTP 요청을 보내면 됨
      curl -si40A "" http://stackoverflow.com|sed -n '/cf-footer-ip">/{s/.*">//;s/<.*//p;}'
      자기 IP 주소가 수십만 개 웹사이트에 표시되는데도 “What is my IP” 사이트들이 성공한 건 꽤 놀라움. DNS의 유용성에 관해서는 https://www.netmeister.org/blog/dns-rrs.html도 참고할 만함
    • IP를 얻는 HTTP 서비스 대부분은 가동 시간 측면에서 그다지 믿음직해 보이지 않는다는 말에 동의함
      다만 Cloudflare가 운영하는 https://icanhazip.com/도 있고, 이쪽은 더 안정적일 가능성이 높아 보임
      https://ipv4.icanhazip.com/
      https://ipv6.icanhazip.com/
    • 아주 좋은 아이디어임. STUN 프로토콜보다 훨씬 단순해 보임
  • Julia Evans의 열렬한 팬인데, DNS 관련 유용한 장난감도 몇 개 만들었음
    https://jvns.ca/
    https://dns-lookup.jvns.ca/
    https://messwithdns.net/

  • 관련 글들임
    DNS Toys - https://news.ycombinator.com/item?id=31704789 - 2022년 6월, 댓글 104개
    DNS Toys: Useful utilities and services over DNS - https://news.ycombinator.com/item?id=31637226 - 2022년 6월, 댓글 1개

  • 이 프로젝트의 작성자가 최근에 한 발표인데, 프로젝트가 어떻게 생겼는지에 대한 재미있는 뒷이야기가 나옴
    https://youtu.be/ANmFZ8rbmnc?si=ndEWH4xY2oxJuEnB

  • 이상하게도
    dig A0.0,0.0/0.0,90.0.aerial @dns.toys

    dig A0.0,0.0/90.0,0.0.aerial @dns.toys
    둘 다 TXT "aerial distance = 10007.06 KM"를 반환함
    적도 둘레는 40,075.017km이고 극 둘레는 40,007.863km임. 지구가 가상의 소 모양이라고 가정해도 큰 해는 없고, 타원체 표면을 따라 두 점 사이의 최단거리를 구하는 난감한 급수를 피할 수 있긴 함

    • 흥미롭네. 저 둘레 값들이 내가 생각했던 것보다 실제로 훨씬 더 가까움
  • 약간 관련해서, 영국 사업자 목록을 DNS 조회로 제공하는 서비스도 있음. DNS 서비스로 DNS가 아닌 데이터를 제공한다는 같은 아이디어임
    https://www.num.uk/
    다만 로드맵을 보면 더 이상 서비스를 유지하지 않는 것 같기도 함

    • “남용”이라는 단어는 “SOAP과 XHR이 HTTP의 ‘남용’이다” 같은 의미가 아니라면 쓰지 않는 편이 좋음
      IN(internet) 클래스가 지금은 진화적으로 우뚝 선 삼나무 같지만, 캄브리아기에는 CH(chaos)와 HS(hesiod) 클래스도 있었음. 그 프로젝트들의 목적과 목표를 다시 살펴볼 만함
      오히려 오늘날의 남용은 재전송을 위한 10밀리초 창이나 qname 최소화처럼 클라우드 기반 웹 서비스, 즉 “happy eyeballs”에만 최적화하면서 다른 모든 것을 희생하는 형태에 가까움. 예를 들어 버퍼블로트 같은 것도 잘 의식하지 않는 듯함. A/AAAA 해석 바깥에도 완전히 다른 세계가 있음
      인터넷 회의 복도에서 포켓 프로텍터를 찬 두 사람이 칼싸움, 적어도 연필로 서로 찌르는 모습을 보는 것도 드문 일은 아님. RFC는 “Request For Comments”이고, BCP(Best Current Practice)는 일상적으로 무시됨
  • 마음에 듦. 다만 dig가 모든 플랫폼에 설치돼 있으면 좋겠음
    Windows에서 쓸 수 없어서 늘 짜증나고, 확인해 보니 Debian에도 기본으로 들어 있지는 않음. 물론 쉽게 설치 가능함. OpenBSD와 Mac OS X에는 있으니 그건 좋음

    • Dog는 크로스 플랫폼이고 JSON 출력 같은 괜찮은 기능도 있음
      https://dns.lookup.dog/
    • dig를 쓸 필요는 없음. nslookup이나 host도 동작함
      Windows에도 DNS 조회 도구는 뭔가 있을 것임
  • 이 스레드의 바보를 위해 다섯 살짜리에게 설명하듯 말해 줄 수 있을까. 재미용인 건 알지만 이해가 안 됨. 어떻게 동작하는지도 모르겠고, 내 무지 때문인 건 알고 있음

    • 본질적으로는 커스텀 DNS 서버를 통해 존재하지 않는 도메인을 해석하는 것임
      예를 들어 dig 100USD-INR.fx @dns.toys는 “dns.toys를 DNS 서버로 사용해서 100USD-INR.fx를 해석하라”는 뜻임. 그러면 실제 답이 담긴 TXT 레코드를 반환함
      .fx는 존재하지 않는 도메인이므로 누군가를 사칭하는 것도 아니고, @dns.toys@8.8.8.8 같은 것으로 바꾸면 아무것도 해석되지 않음
    • news.ycombinator.com 같은 사이트를 떠올리면 됨. 브라우저는 그 이름으로 특수한 서버에서 IP를 조회함. 그 도메인에는 대략 이런 식으로 저장돼 있을 수 있음
      A IP = ...1
      AAAA IP = ...2
      여기서 A는 레코드 종류임. 하지만 다른 레코드 종류도 있음
      TXT gender = 'male'
      보통 DNS에 대해 암묵적으로 참이라고 여기는 가정이 몇 가지 있음. 사람들은 DNS를 다른 서비스로 가는 교환대처럼 쓰고, 교환대 안의 값은 대체로 정적이라는 것임
      여기서는 도메인에 따라 바뀌는 값을 반환하므로 완전히 다른 일을 하고 있음. 이렇게 하려면 직접 만든 DNS 서버가 필요하지만, DNS 프로토콜 자체는 꽤 단순함
      이 해킹이 영리한 이유는, DNS가 가장 널리 쓰이고 지원되는 프로토콜 중 하나라 주류 프로그래밍 라이브러리가 모두 지원하고 운영체제에 이미 들어 있는 명령줄 도구도 많기 때문임. DNS 위에서 서비스로 제공하면 최소 의존성으로 도구와 라이브러리에서 접근할 수 있음
      또한 DNS를 일반 인터넷 서비스의 교환대가 아니라 응용 서비스로 직접 쓰게 만들어, DNS 시스템을 어떻게 써야 하는지에 대한 일반적인 가정을 뒤집음. 기존 소프트웨어에 붙일 때도 복잡한 통합이 필요 없고, DNS 요청은 일반적인 웹 API보다 더 직관적이라고 볼 수 있음. 검열 저항성 측면의 이점도 있을 가능성이 큼
    • DNS 서버를 다른 포트와 다른 프로토콜을 쓰는 특수한 웹 서버라고 생각하면 됨
      HTTP로 웹 서버에 요청하듯, DNS 프로토콜로 DNS 서버와 상호작용함. telnet으로 HTTP나 SMTP 요청을 흉내 내는 것과 비슷하게, 특정 규칙 집합으로 특정 종류의 서버와 통신하는 것임
      이 서버는 결과를 내기 전에 어느 정도 계산을 수행하는데, 보통 정적이라고 기대하는 대부분의 DNS 레코드와 다른 부분임
    • DNS 프로토콜은 단순히 UDP 위의 텍스트임. DNS 요청을 만들 때 시스템은 소켓을 열고 그 안에 google.com을 쓰고 응답을 읽음
      서버가 DNS 서버로 제대로 설정돼 있으면 적절한 DNS 레코드를 다시 텍스트로 응답함. google.com은 부하 분산에 쓰이는 어떤 하위 도메인을 가리키는 CNAME이므로, 서버는 CNAME blabla.google.com 같은 식으로 답하고 원하면 blabla.google.com까지 같이 해석해서 추가 요청의 수고를 덜어 줄 수 있음
      어떤 RFC에 정의된 DNS 프로토콜은 요청과 응답을 특정 방식으로 하라고 정함. 그중 하나는 존재하지 않는 최상위 도메인, 예를 들어 현재 존재하지 않는 .time에 대해 서버가 nxdomain을 응답해야 한다는 것임. 하지만 현실적으로는 서버가 현재 시간 같은 아무 값이나 응답하는 것을 막는 기술적 장치는 없음
      일반적으로 보면, 공개든 사설이든 DNS 운영자가 엉터리 데이터를 반환하지 않을 것이라는 기대만이 사용자를 막아 주는 전부임. HTTPS가 어느 정도 완화해 주지만, DNS 레코드 자체는 사실상 무한히 위조 가능하고 되돌릴 방법도 없음
  • 이 기능들이 dns.toys의 어떤 하위 도메인으로도 제공되지 않는 게 놀라움. 그러면 특별한 이름 서버를 쓰지 않아도 해석될 텐데

    • 기본 이름 서버를 쓰면 캐싱 같은 일반적인 DNS 복잡성이 모두 끼어들게 됨
  • 요즘은 이걸 주로 씀
    https://addr.tools/
    https://dnscheck.tools/
    https://myip.addr.tools/help