---
layout: post
title: Tor在服务器上的使用体验
tags: [tor, 网络]
---

  就像和普通网络一样使用Tor吧<!--more-->    

# 起因
  前段时间全世界最大的电子书图书馆——Zlibrary的域名被FBI回收了，以致于想要访问它只能用Tor（洋葱路由器）或者Tor2Web访问它的Onion域名。 ~~（众所周知，只有恋童癖，瘾君子和读书人才会用Tor🤣）~~ 当然，想要访问洋葱网络用Tor2Web最简单，但是最不安全，太容易被中间人攻击了，或者安装洋葱浏览器也很简单，只不过我有个理念就是一个设备不应该安装超过一个浏览器，正因如此，我也很不喜欢Electron的软件。既然我使用Windows本身就已经有个Egde浏览器了，我为什么还要安装其他浏览器呢？所以我就想能不能用更加简单的方式来访问Onion域名。   

# 探索过程
  要想不使用洋葱浏览器访问也可以，只要装一个Tor核心，然后让浏览器去连它的Socks代理就可以了，只不过……在国内想要连接洋葱网络实在是太麻烦了，还要整网桥（前置代理）啥的。不过要说代理……我自己倒是有一个，那这么说来我干脆把代理和Tor组合到一起都放到服务器上，然后我只要连代理就可以同时访问外网和洋葱网络了吧，还不影响我访问其他网站的速度。   
  那应该怎么做呢？Tor安装倒是很简单，大多数软件包管理器都能直接安装，甚至可以什么都不配置就可以用9050端口访问它的Socks5代理了，我的话虽然之前用的是[wssocks](/2022/01/16/wssocks.html)，但是并发效果很差，也没有手机客户端，所以最后还是换成了v2ray。像v2ray这种相比其他的还有一个优点就是它的路由配置功能还挺强大的，这次也是用到了它的路由功能。其实去看官网文档上也有关于[将Tor和v2ray配合使用的教程](https://guide.v2fly.org/advanced/tor.html)，只是不知道为什么它那个配置文件里面只有关于客户端的路由，没有服务端的路由……不过不影响，v2ray作为一个服务端和客户端等价的程序稍微改下那个配置文件就可以用了：
```json
{
  "log": {
    "loglevel": "warning"
  },
  "routing": {
    "domainStrategy": "AsIs",
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "domain": [
            "regexp:\\.onion$"
          ],
          "outboundTag": "tor"
        },
        {
          "type": "field",
          "outboundTag": "block",
          "protocol": [
            "bittorrent"
          ]
        }
      ]
    }
  },

  "inbounds": [
    {
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "listen": "/dev/shm/proxy.sock",
      "protocol": "vless",
      "settings": {
        "udp": false,
        "clients": [
          {
            "id": "***",
            "alterId": 0,
            "flow": ""
          }
        ],
        "decryption": "none",
        "allowTransparent": false
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "***",
          "headers": {
            "Host": "***"
          }
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    },
    {
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 9050
          }
        ]
      },
      "tag": "tor"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}
```
  顺便我为了避免不小心服务器被封也屏蔽了bt下载（其实也许把bt流量转发到洋葱网络里面也可以？）。配置好之后试着找了些Onion网站试了试，还不错，访问速度一般，也不影响我访问其他网站。   
  不过需要注意的一点是这个方法**不能匿名**，仅仅是作为访问Onion网站的手段，因为普通的浏览器不会有那么多保护隐私的机制，这样的配置方法很容易会导致IP泄露（就算是有代理也会有WebRTC泄露的可能性），想匿名还是用洋葱浏览器+前置代理或者Tor做透明代理会更好一些。

# 使用Tor进行建站
  既然在服务器上安装了Tor，正好我之前用[mkp224o](https://github.com/cathugger/mkp224o)算了几个vanity address，这次可以直接拿已经算好了私钥开网站。方法也很简单，在`HiddenServiceDir`后面加私钥的存放位置，然后在`HiddenServicePort`后面加想要服务的端口号和被映射的端口，一般教程会说用nginx映射127.0.0.1:80，而我会建议使用Unix domain Socket，更加安全，性能也会更好，像我就会配成：
```
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 unix:/dev/shm/nginx.sock
```
  顺便加两句反蜜罐配置：
```
ExcludeNodes {cn},{hk},{mo},{kp},{ir},{sy},{pk},{cu},{vn}
StrictNodes 1
```
  nginx的监听也要注意监听/dev/shm/nginx.sock，这样能保证即使在服务器内扫描端口也不会泄露你的网站😆。   
  其实我本来想让v2ray的连接Tor也通过Unix domain Socket走，但是很遗憾的是我没找到v2ray的Outbound怎么样设置Unix domain Socket连接……

# 感想
  感觉洋葱网络其实还是对用户挺友好的，使用起来还是挺方便的，就像访问普通网络那样，大概也正是这种原因它才能成为匿名网络中最受欢迎的吧。
