torrc와 nginx로 개인 블로그를 .onion 히든 서비스로 직접 운영
- 블로그를 Tor 히든 서비스로 올려 .onion 주소에서 서비스한다. /etc/tor/torrc에 HiddenServiceDir /var/lib/tor/blog/와 HiddenServicePort 80 127.0.0.1:8080을 넣고 Tor를 재시작하면 호스트네임 파일에 주소가 생성된다. Tor가 자체 암호화를 하므로 nginx는 TLS 없이 평문 TCP로 127.0.0.1:8080만 listen한다.
- Hugo 사이트를 clearnet과 onion 두 벌로 빌드하고, onion 빌드의 baseURL에 .onion 주소를 넣어 RSS와 canonical, og:url 같은 절대 URL이 onion 밖으로 나가지 않게 한다. 배포 파이프라인이 push마다 대상별로 빌드해 각자의 웹 루트로 rsync한다.
- 댓글에서 clearnet 사이트에 Onion-Location 헤더를 넣으라는 제안이 나왔고 작성자가 바로 반영했다고 답했다. Tor Browser가 방문자에게 onion 주소를 자동으로 알려주는 기능이다.
- ISP가 CGNAT 뒤에 있어도 포트포워딩 없이 사이트를 열 수 있다는 점이 장점으로 꼽혔다. 반면 onion v3 주소는 구두로 전달할 수 없고, 지연 때문에 잦은 요청을 주고받는 사이트는 정적 페이지 위주로 만들어야 한다.
- 10년 가까이 .onion 사이트를 운영한 댓글러는 torv2가 더는 안전하지 않다고 판단하자 Tor 프로젝트가 기존 v2 사이트를 전부 일방적으로 없앴고 2021년에 그 망이 사라졌다며, .onion의 모든 것이 ephemeral하다고 정리했다.
Hacker News opinions
onion 사이트 몇 년 굴려봤는데 좋은 건 공인 IP나 인증서를 아예 안 건드린다는 거임. 대신 v3 주소는 말로 전달할 방법이 없고 지연 때문에 채팅성 기능 넣으면 깨짐. 정적 페이지 전용이 답임.
채팅성만 낮추면 SSR도 잘 돌아감. Dread도 SSR이고 JS 켜져 있으면 잔소리까지 함.
포트포워딩을 건너뛰는 게 제일 큼. ISP가 CGNAT 뒤에 있으면 특히. 근데 업타임은 어떻게 잡는지 궁금함. 히든 서비스 죽어도 누가 알려주기 전까지 모르잖아.
나도 반년째 문제 없이 돌아감. CGNAT 해법은 따로 글 써놨음.
다른 서비스랑 똑같이 모니터링 붙이면 됨. 사용자가 다운됐다고 알려주는 상황이면 이미 다운타임을 엄청 먹고 있는 거임.
같은 사이트를 호스트네임만 바꿔서 두 번 빌드할 이유가 있나? 상대 링크 쓰면 되는 거 아닌가.
RSS나 canonical, og:url 같은 게 절대 URL을 씀. onion에 한 번 들어온 사람이 onion을 벗어나지 않게 하려고 그럼.
onion 쪽에선 사칭이 진짜 큰 문제라, 이렇게 해두면 프론팅하는 쪽이 수고를 더 해야 함.
내 서버가 랜덤한 사람들의 exit node로 쓰이기도 하나? 스위스에서 만난 사람이 익명 exit node 돌리다가 경찰에 설명하느라 힘들었다고 하더라.
그건 exit relay고 나는 안 돌림.
exit node는 선택적인 부분임. 릴레이나 히든 서비스만 돌리면 exit 쪽에 강제로 참여되지 않음. 히든 서비스랑 같이 돌리는 건 보안상 권장 안 함.
clearnet 쪽에 Onion-Location 헤더를 넣으면 Tor Browser가 알아서 알려줌.
놓치고 있었음, 지금 추가하는 중. 고맙다.
일반인이 앱 하나 깔아서 폴더에서 웹사이트 굴릴 수 있으면 좋겠음. CLI는 일반 웹호스팅보다 어려움. 무슨 명령인지도 모르고 치는 건 별로 좋은 생각이 아님.
127.0.0.1 대신 별도 바인드 주소를 쓰는 게 좋음. 127.13.37.1:8080 같은 식으로. 나중에 그 포트를 다른 데 재사용하고 히든 서비스 끄는 걸 잊으면 낯선 사람이 접속하게 됨. 히든 서비스를 여러 개 돌리면 포트나 주소를 나눠야 서로 연관짓지 못하고, nginx가 Host 헤더를 못 맞추면 알파벳 순 첫 사이트를 내보냄.
속도 올리려면 HTTPS 인증서를 사서 HTTP/2를 써야 함. 멀티플렉싱이 onion에서 특히 중요함. HiddenServiceExportCircuitID를 설정하면 circuit id를 웹서버로 넘길 수 있는데, 안 하면 로그상 모든 사용자가 같은 IP로 찍힘.
onion 서비스는 Tor가 항상 암호화하는데 그 안에 평문 HTTP가 터널링되는 구조임. .onion에 무료로 인증서를 발급해주는 CA가 없어서 자체 서명 없이는 HTTP/2를 무료로 못 씀. 자체 서명 인증서를 그냥 신뢰하지 않는 이유가 궁금함.
큰 onion 사이트는 성능 최적화가 Tor 전용이 됨. 에셋은 base64로 박고 CSS는 인라인, 애니메이션은 CSS로, 렌더링은 백엔드에서. JS 없이도 돌아가야 하고, keep-alive 연결 하나에 최대한 몰아넣어야 함. 새 요청마다 다른 Onion 회선이 잡혀서 느려지니까.
DDoS도 문제인데 Tor에 맞는 방식이 따로 있음. 더블 캡차가 필요하고, 모든 사이트에 기생 프론트가 수십 개 붙어 있어서 진짜 주소를 오프사이트로 알려줘야 함. JS를 쓰면 사이트가 바로 의심 대상이 됨.
홈컴퓨터에서 superkuhbitj6tul.onion을 10년 가까이 굴리면서 배운 건 .onion에 있는 모든 게 ephemeral이라는 것임. torv2가 더는 안전하지 않다고 판단하자 Tor 프로젝트가 기존 v2 사이트를 전부 일방적으로 날려버렸고 2021년에 그 망이 조각났음. 다크웹은 도메인 소유하려는 사람을 위한 게 아니라 보안을 위한 것임.