Tor로 블로그를 숨겨진 서비스로 직접 호스팅하기
Self-Hosting on the Dark Web

이 사이트는 이제 Tor 네트워크 안에서만 접근 가능한 .onion 주소로도 열린다. 인증 기관도, DNS도, 노출된 IP도 없이 공개 키에서 주소가 파생되고 Tor가 종단 간 암호화를 제공한다. /etc/tor/torrc에 HiddenServiceDir과 HiddenServicePort를 설정하고 nginx를 127.0.0.1:8080에 바인딩한 뒤, Hugo로 onion 주소를 baseURL로 삼아 한 번 더 빌드하면 클리어넷과 Tor 버전이 자동으로 동기화된다.
Tor relays and encrypts your traffic as it passes through thousands of volunteer-run servers, so that no single party can link who you are to what you are doing; a hidden service extends that anonymity to the server itself.
HN 토론
109- p4bl0
제 개인 웹사이트는 수년째 Tor에 호스팅되어 있습니다. NAT 뒤에 있어도 집에서 쉽게 할 수 있는데, 사용자 입장에서는 나가는 연결이기 때문입니다(이 덕분에 NAT 뒤에 있고 고정 IP가 없어도 로컬 서비스를 노출하는 훌륭한 방법이기도 합니다). 그리고 설계상 개인 IP가 방문자에게 숨겨집니다.
거의 10년 전(벌써?!)에 2600에 이에 대해 썼습니다. 제 글 사본은 여기에서 볼 수 있습니다: https://pablorauzy.fr/outreach/2600/how-to-run-a-tor-hidden-...
웹사이트의 Onion 사본이 있다면 Onion-Location HTTP 헤더를 잊지 마세요. 그러면 Tor Browser 사용자가 클리어넷 주소로 방문하더라도 자동으로 웹사이트의 onion 버전으로 리다이렉트됩니다.
관심 있는 분들이 있다면 I2P에 관한 후속 글도 있습니다: https://pablorauzy.fr/outreach/2600/how-to-run-an-i2p-hidden...
- ivanmontillam
제가 Onion 사이트에서 정말 좋아하는 점은, 규모가 충분히 커지면 성능 엔지니어링이 정말 Tor 특화된다는 것입니다. 몇 가지 예를 들면:
- 애셋을 base64로 임베드하기(헤더 로고의 img src를 base64로, 모든 CSS는 인라인으로, 등).
- CSS를 최대한 활용하기(애니메이션과 트랜지션을 사용한다면 가능한 한 CSS로 처리하고, 이를 위해 JS는 피하세요).
- 웹사이트가 대부분 백엔드에서 렌더링되도록 하세요. JS를 두더라도 JS 없이도 웹사이트가 작동해야 합니다.
- 보안이 정말 재미있어집니다. 즉, XSS, CSRF, SQL Injection 공격 및 기타 인젝션을 최대한 피하세요.
다른 댓글[0]에서 누군가 요약했듯이, chattiness를 최소한으로 유지하세요. 여기서 chattiness란 같은 Keep-Alive 연결에 가능한 한 많은 데이터를 담으라는 뜻으로 이해합니다. 새로운 HTTP 요청을 최대한 피하세요. 각 요청이 새로운 Onion 경로에 할당되어 느려질 수 있기 때문입니다.
웹사이트를 단일 연결로 브라우저에 전달할 수 있다면, 이긴 것입니다.
저는 이런 대형 Onion 사이트들의 성능에 항상 감탄해 왔습니다. 이런 제약과 Tor의 특성 속에서 소프트웨어 엔지니어링 창의성의 한계를 정말 밀어붙입니다.
--
[0]: https://news.ycombinator.com/item?id=49872320
EDIT: 불릿 포인트 서식 수정.
- basilikum
클리어넷 사이트에 Onion-Location 헤더를 추가하는 게 좋을 것입니다. 그러면 Tor Browser가 방문자에게 자동으로 이를 알려줄 수 있습니다: https://community.torproject.org/onion-services/advanced/oni...
- mzajc
별도 포트를 사용하는 것 외에도, 숨겨진 서비스를 127.0.0.1이 아닌 바인드 주소에서 실행하는 것을 권합니다. 혹시 나중에 그 포트에 다른 것을 호스팅하고 숨겨진 서비스를 비활성화하는 것을 잊어버릴 경우를 대비해서요:
> HiddenServicePort 80 127.13.37.1:8080
> listen 127.13.37.1:8080;
이렇게 하면 포트를 재사용하기로 하고 숨겨진 서비스를 비활성화하는 것을 잊더라도 낯선 사람들이 127.0.0.1에 바인딩된 서비스에 연결할 수 없습니다.
또한 여러 숨겨진 서비스를 호스팅하면서 사람들이 서로 연관 짓지 못하게 하려면 별도 포트 및/또는 바인드 주소를 사용해야 합니다. nginx가 Host 헤더와 일치하지 않으면 알파벳 순으로 먼저 오는 사이트를 제공하기 때문입니다.
- dherls
같은 도메인의 콘텐츠에 상대 링크를 사용하는 대신, 동일한 웹사이트를 다른 호스트명으로 두 번 만드는 것의 이점은 무엇인가요?
- tombert
블로그를 셀프 호스팅하던 시절에 이걸 할까 생각한 적이 있습니다. 순전히 "나는 다크 웹에 사이트가 있다"고 솔직히 말할 수 있는 멋짐이 있을 것 같아서요.
결국 블로그를 Cloudflare Pages로 옮겼는데, 주로 댓글 처리를 위해 Cloudflare Workers를 쓰고 싶었기 때문입니다. 그래도 해봤다고 말할 수 있으려고 이중 게시를 여전히 고려하고 있습니다.
- coldblues
사람들이 I2P와 Yggdrasil도 시도해보길 권합니다. 특히 Yggdrasil을요. 속도와 지연 시간에서는 타협이 없지만, 익명성은 없습니다.
- sowbug
이런 가이드에서는 생성된 개인 키를 백업하라고 강조하는 게 도움이 될 수 있습니다. 이를 잃으면 onion 주소를 바꿔야 하니까요.