Self-Hosting on the Dark Web
Tor에서 직접 웹사이트 호스팅하기
정적 사이트를 Tor onion service로 공개하는 설정과 배포 과정을 소개합니다. Tor가 서버 IP와 인증서 없이 연결을 암호화하지만, 느린 응답을 고려해 사이트를 별도로 빌드하고 요청 수를 줄여야 합니다.
- 주제
AI 요약
작성자는 자신의 정적 웹사이트를 Tor 네트워크에서만 접근할 수 있는 onion service로 공개했습니다. onion 주소는 공개 키에서 만들어지며 일반 DNS나 인증 기관, 외부에 드러나는 서버 IP가 필요하지 않습니다. Tor가 연결을 암호화하고 트래픽을 중계하므로 사용자뿐 아니라 서버도 익명성을 얻습니다.
Tor hidden service 설정
먼저 Tor 설정 파일인 /etc/tor/torrc에 hidden service 디렉터리와 포트 전달 규칙을 추가합니다.
``text
HiddenServiceDir /var/lib/tor/blog/
HiddenServicePort 80 127.0.0.1:8080
``
서비스 디렉터리는 웹 루트와 분리해야 합니다. Tor는 이곳에 서비스 개인 키와 주소가 적힌 hostname 파일을 저장하며, 디렉터리를 소유하고 권한을 관리합니다. 작성자는 debian-tor 사용자가 소유하는 전용 경로를 사용하고, Tor를 재시작한 뒤 /var/lib/tor/blog/hostname에서 생성된 .onion 주소를 확인합니다.
웹 서버와 정적 사이트
Tor는 onion 서비스의 80번 포트 요청을 로컬의 127.0.0.1:8080으로 전달합니다. 따라서 Nginx는 해당 주소에서 수신하도록 설정하면 됩니다. 예시 설정은 onion 주소를 server_name으로 지정하고 사이트 파일의 루트를 /srv/tor.david.alvarezrosa.com으로 둡니다. 이 구성에서는 Nginx에 TLS, HTTP/2, QUIC을 설정하지 않습니다. Tor가 연결을 암호화하고, onion 서비스는 일반 TCP를 사용하기 때문입니다.
정적 사이트는 절대 URL을 빌드 결과에 넣으므로 clearnet용 파일을 그대로 onion 사이트에 배포하면 링크가 일반 도메인으로 향할 수 있습니다. 작성자는 Hugo를 onion 주소를 baseURL로 지정해 한 번 더 실행합니다. 배포 파이프라인은 푸시할 때마다 clearnet용과 Tor용 사이트를 각각 빌드하고, 서로 다른 웹 루트에 rsync로 복사합니다. RSS 주소나 canonical 링크, Open Graph의 og:url, microformats 같은 절대 URL도 onion 사이트 안에 머물게 하려는 목적입니다.
운영 시 고려할 점
댓글에서는 onion v3 주소를 말로 전달하기 어렵고 지연 시간이 커서 요청이 잦은 사이트가 불편하다는 경험담이 나왔습니다. 반면 CGNAT 환경에서는 포트 포워딩 없이 서비스를 공개할 수 있다는 장점도 언급됐습니다. 작성자는 자신의 사이트가 약 반년 동안 문제없이 운영됐다고 답했습니다.
한 댓글은 onion 사이트의 응답 속도를 높이려면 이미지와 CSS를 합치고, 애니메이션은 JavaScript보다 CSS를 쓰며, 서버 렌더링을 우선하고 새 HTTP 요청을 줄이는 편이 좋다고 제안했습니다. Tor에서는 요청이 많아질수록 지연이 커질 수 있다는 설명입니다. 다만 다른 사용자는 이런 최적화가 Tor에만 해당하는지 물었고, 제안자는 CDN이 보편적인 clearnet에서는 덜 중요하다고 답했습니다.
서비스 역할에 관한 질문도 나왔습니다. 웹사이트를 hidden service로 운영한다고 Tor exit node가 되는 것은 아닙니다. exit relay는 별도로 운영하는 역할이며, 한 댓글은 hidden service와 exit node를 함께 운영하지 않는 편이 보안상 좋다고 설명했습니다. 설정 측면에서는 Onion-Location 헤더를 clearnet 사이트에 추가해 Tor Browser가 onion 주소를 알리게 하라는 제안이 나왔고, 작성자는 이를 적용했다고 밝혔습니다.
Hacker News 반응
- @hndhyc0bdt — 작은 onion 사이트를 몇 년 운영했는데, 공인 IP나 인증서를 건드리지 않아도 되는 점이 좋습니다. 단점은 onion v3 주소를 말로 전달하기 거의 불가능하고 지연 시간 때문에 요청이 잦은 사이트가 고장 난 것처럼 느껴진다는 점입니다. 솔직히 정적 페이지에만 적합합니다.
- @someonebaggy — 요청이 잦지 않게 해야 하지만 SSR도 많이 잘 작동합니다. Dread는 SSR을 사용하고 JavaScript를 켰을 때 경고까지 띄웁니다.
- @hn9zmdcaou — 포트 포워딩을 건너뛸 수 있다는 점이 좋습니다. ISP가 CGNAT 뒤에 두는 환경에서는 특히 그렇습니다. 다만 hidden service가 중단돼도 누군가 알려주기 전까지 모를 텐데, 가동 시간은 보통 어떻게 관리하나요?
- @dalvrosa — 동의합니다. 제 사이트는 지금까지 약 반년 동안 문제없이 운영됐습니다. CGNAT을 위한 해결책도 있습니다.
- @dherls — 콘텐츠에 상대 링크를 쓰면 되는데, 호스트 이름만 다른 똑같은 웹사이트를 두 번 빌드하는 이유가 있나요?
- @dalvrosa — 좋은 지적입니다. RSS나 canonical 링크,
og:url, microformats 같은 작은 부분에는 절대 URL이 필요합니다..onion에 들어온 뒤에는 계속.onion안에 머물게 하려는 목적입니다.
- @dalvrosa — 좋은 지적입니다. RSS나 canonical 링크,
- @comrade1234 — 페이지에 접속하는 것 말고도 무작위 사용자가 서버를 exit node로 쓸 수 있나요? 익명 네트워크의 exit node를 운영하다 경찰에 상황을 설명하느라 힘들었다는 사람을 스위스에서 만났습니다.
- @dalvrosa — 그건 exit relay입니다. 저는 혹시 몰라서 지금 운영하지 않습니다.
- @fishgoesblub — Tor exit node 운영은 수동으로 선택하는 일입니다. 웹사이트나 채팅 서버 같은 hidden service 운영에는 그런 절차가 전혀 없습니다.
- @creatonez — exit node는 Tor 네트워크에서 완전히 선택 사항입니다. relay나 hidden service를 운영해도 exit node 역할까지 맡을 필요는 없습니다. 보안에 영향을 줄 수 있으므로 두 역할을 함께 운영하는 것도 권하지 않습니다.
- @basilikum — clearnet 사이트에
Onion-Location헤더를 추가하면 Tor Browser가 방문자에게 onion 주소를 자동으로 알려줄 수 있습니다.- @dalvrosa — 좋은 제안입니다. 놓쳤네요. 지금 추가하겠습니다.
- @dalvrosa — 이제 적용했습니다.
- @mzajc — 별도 포트를 쓰는 것과 함께 hidden service를
127.0.0.1이 아닌 다른 주소에 바인딩하는 것도 권합니다. 나중에 그 포트를 다른 서비스에 쓰면서 hidden service를 끄지 않는 경우를 대비할 수 있습니다. nginx가 Host 헤더와 일치하는 사이트를 찾지 못하면 알파벳순으로 먼저 나오는 사이트를 내보낼 수 있으므로, 여러 hidden service를 운영하고 서로 연관되는 일을 피하려면 포트나 바인딩 주소를 분리해야 합니다.- @someonebaggy — 설명적인 경로를 붙일 수 있는 Unix 소켓을 쓰는 방법도 있습니다.
- @charcircuit — 페이지 로딩 속도를 높이려면 HTTPS 인증서를 구매해야 합니다. 그래야 HTTP/1.1에 제한되지 않고 HTTP/2의 멀티플렉싱을 쓸 수 있습니다. 또
HiddenServiceExportCircuitID설정으로 회로 ID를 웹 서버에 넘기면 텔레메트리나 악용 방지에 쓸 수 있습니다. 그렇지 않으면 로그에는 모든 사용자가 같은 IP에서 온 것처럼 기록됩니다.- @markasoftware — onion 서비스는 Tor가 이미 암호화하지만 그 안에서 평문 HTTP를 터널링합니다.
.onion도메인에 무료 인증서를 발급하는 인증 기관이 없으니, 자체 서명 인증서를 자동으로 신뢰하면 안 되나요? Tor Project는 onion 서비스의 HTTPS 목적을 HTTP/2 지원보다 다른 부분에 두는 것 같습니다. - @charcircuit — 자체 서명 인증서를 자동으로 신뢰하는 데 찬성합니다. 키가 보통 hidden service 키와 같은 수준으로 보호되기 때문입니다. onion 사이트는 HTTP로 강등돼도 일반 사이트처럼 브라우저 경고가 뜨지 않습니다. 소수인 hidden service도 나머지 웹과 보안 모델을 맞춰야 합니다.
- @markasoftware — onion 서비스는 Tor가 이미 암호화하지만 그 안에서 평문 HTTP를 터널링합니다.
- @ivanmontillam — 큰 onion 사이트를 운영하면 성능 최적화가 Tor 특유의 문제가 됩니다. 로고 이미지를 Base64로 넣고 CSS를 인라인으로 사용하며, 애니메이션과 전환 효과에는 JavaScript보다 CSS를 쓰는 식입니다. 사이트 대부분은 서버에서 렌더링하고 JavaScript 없이도 작동해야 합니다. XSS, CSRF, SQL injection 같은 공격도 최대한 막아야 합니다. 요청이 하나 늘 때마다 새 onion 경로가 배정될 수 있으니 요청 수를 줄이고, 가능하면 한 연결로 페이지를 보내야 합니다.
- @boredatoms — Tor와 무관하게도 좋은 방법 아닌가요?
- @ivanmontillam — 오늘날 clearnet은 CDN을 쓰므로 그런 방법이 그다지 중요하지는 않습니다.
- @superkuh — 집에 있는 컴퓨터로 ham radio와 과학 자료를 올리는
superkuhbitj6tul.onion을 약 10년 운영하며 배운 점은.onion의 모든 것이 일시적이라는 사실입니다. Tor Project가 보안상 충분히 익명적이지 않다고 판단하자 torv2를 폐기했고, 2021년에 torv2를 지원하지 않는 클라이언트를 배포하면서 모든 사이트가 사라졌습니다..onion은 도메인 소유권을 원하는 사람보다 보안을 원하는 사람을 위한 곳입니다. 보안 요구에 따라 모든 결정을 내릴 것이고, 커뮤니티 전체가 사라져도 다시 그렇게 할 겁니다. dark web에 커뮤니티를 세우지 마세요.- @brnt — 소유하려는 도메인 이름에 묶이지 말라는 조언으로 들립니다. clearnet에도 똑같이 적용됩니다. v2 onion 폐기는 미리 공지됐고 많은 사이트가 새 주소를 안내하며 옮겼습니다. 크게 문제 삼은 사람은 없었던 것 같습니다.
원문: David Alvarez Rosa / 번역·요약: Trawling