视频教程

youtube播放地址:https://youtu.be/lOLJ70bc-pA

GIA高速VPS推荐: https://d.m123.org
家宽住宅VPS推荐: https://v.m123.org
自用专线机场推荐: https://b.m123.org

tor网络

安装x-ui

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

安装tor

(apt update && apt install -y tor) || (yum update -y && yum install -y tor) || (dnf update -y && dnf install -y tor)

或者使用官方源:https://support.torproject.org/zh-CN/apt/ https://support.torproject.org/zh-CN/rpm/

检测是否连上tor网络

https://check.torproject.org/?lang=zh_CN

tor官方推荐网址

https://community.torproject.org/onion-services/

手搓配置

前置代理+tor网络

{
  "api": {
    "services": [
      "HandlerService",
      "LoggerService",
      "StatsService"
    ],
    "tag": "api"
  },
  "burstObservatory": null,
  "dns": null,
  "fakedns": null,
  "inbounds": [
    {
      "allocate": null,
      "listen": "127.0.0.1",
      "port": 62789,
      "protocol": "dokodemo-door",
      "settings": {
        "address": "127.0.0.1"
      },
      "sniffing": null,
      "streamSettings": null,
      "tag": "api"
    },
    {
      "allocate": {
        "concurrency": 3,
        "refresh": 5,
        "strategy": "always"
      },
      "listen": null,
      "port": 54701,
      "protocol": "shadowsocks",
      "settings": {
        "clients": [
          {
            "email": "pziqletm",
            "method": "",
            "password": "KMW2djHGMlEooAHNiB4FSnxG78oUFC2I6rNBF7MVeFU="
          },
          {
            "email": "toruser",
            "method": "",
            "password": "ExLav0MGff+rF4UgWsk56Q1bg3+RM0+2nRyQWUNsp+8="
          }
        ],
        "ivCheck": false,
        "method": "2022-blake3-aes-256-gcm",
        "network": "tcp,udp",
        "password": "Ur88nrUnNSkOBYFaec/wB+3dY5Kx65nQVEiw3q5VyOw="
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "enabled": false,
        "metadataOnly": false,
        "routeOnly": false
      },
      "streamSettings": {
        "network": "tcp",
        "security": "none",
        "tcpSettings": {
          "acceptProxyProtocol": false,
          "header": {
            "type": "none"
          }
        }
      },
      "tag": "inbound-54701"
    }
  ],
  "log": {
    "access": "none",
    "dnsLog": false,
    "error": "",
    "loglevel": "warning",
    "maskAddress": ""
  },
  "observatory": null,
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "AsIs",
        "noises": [],
        "redirect": ""
      },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    },
    {
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "localhost",
            "port": 9050,
            "users": []
          }
        ]
      },
      "tag": "tor"
    }
  ],
  "policy": {
    "levels": {
      "0": {
        "statsUserDownlink": true,
        "statsUserUplink": true
      }
    },
    "system": {
      "statsInboundDownlink": true,
      "statsInboundUplink": true,
      "statsOutboundDownlink": false,
      "statsOutboundUplink": false
    }
  },
  "reverse": null,
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api",
        "type": "field"
      },
      {
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "blocked",
        "type": "field"
      },
      {
        "outboundTag": "blocked",
        "protocol": [
          "bittorrent"
        ],
        "type": "field"
      },
      {
        "domain": [
          "domain:onion"
        ],
        "outboundTag": "tor",
        "type": "field"
      },
      {
        "outboundTag": "tor",
        "type": "field",
        "user": [
          "toruser"
        ]
      }
    ]
  },
  "stats": {},
  "transport": null
}
JSON

前置代理+tor网络+后置代理

{
  "api": {
    "services": [
      "HandlerService",
      "LoggerService",
      "StatsService"
    ],
    "tag": "api"
  },
  "burstObservatory": null,
  "dns": null,
  "fakedns": null,
  "inbounds": [
    {
      "allocate": null,
      "listen": "127.0.0.1",
      "port": 62789,
      "protocol": "dokodemo-door",
      "settings": {
        "address": "127.0.0.1"
      },
      "sniffing": null,
      "streamSettings": null,
      "tag": "api"
    },
    {
      "allocate": {
        "concurrency": 3,
        "refresh": 5,
        "strategy": "always"
      },
      "listen": null,
      "port": 54701,
      "protocol": "shadowsocks",
      "settings": {
        "clients": [
          {
            "email": "pziqletm",
            "method": "",
            "password": "KMW2djHGMlEooAHNiB4FSnxG78oUFC2I6rNBF7MVeFU="
          },
          {
            "email": "toruser",
            "method": "",
            "password": "ExLav0MGff+rF4UgWsk56Q1bg3+RM0+2nRyQWUNsp+8="
          }
        ],
        "ivCheck": false,
        "method": "2022-blake3-aes-256-gcm",
        "network": "tcp,udp",
        "password": "Ur88nrUnNSkOBYFaec/wB+3dY5Kx65nQVEiw3q5VyOw="
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "enabled": false,
        "metadataOnly": false,
        "routeOnly": false
      },
      "streamSettings": {
        "network": "tcp",
        "security": "none",
        "tcpSettings": {
          "acceptProxyProtocol": false,
          "header": {
            "type": "none"
          }
        }
      },
      "tag": "inbound-54701"
    },
    {
      "allocate": {
        "concurrency": 3,
        "refresh": 5,
        "strategy": "always"
      },
      "listen": null,
      "port": 19276,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "email": "jq8fcm9a",
            "id": "58cb22ea-bf6e-424c-83f8-1b6c24c27f23"
          }
        ]
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "enabled": false,
        "metadataOnly": false,
        "routeOnly": false
      },
      "streamSettings": {
        "network": "tcp",
        "security": "none",
        "tcpSettings": {
          "acceptProxyProtocol": false,
          "header": {
            "type": "none"
          }
        }
      },
      "tag": "inbound-19276"
    }
  ],
  "log": {
    "access": "none",
    "dnsLog": false,
    "error": "",
    "loglevel": "warning",
    "maskAddress": ""
  },
  "observatory": null,
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "AsIs",
        "noises": [],
        "redirect": ""
      },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    },
    {
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "localhost",
            "port": 9050,
            "users": []
          }
        ]
      },
      "tag": "tor"
    },
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "45.77.242.212",
            "port": 19276,
            "users": [
              {
                "id": "58cb22ea-bf6e-424c-83f8-1b6c24c27f23",
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "none",
        "sockopt": {
          "addressPortStrategy": "none",
          "dialerProxy": "tor",
          "penetrate": false,
          "tcpFastOpen": false,
          "tcpKeepAliveInterval": 0,
          "tcpMptcp": false
        },
        "tcpSettings": {
          "header": {
            "type": "none"
          }
        }
      },
      "tag": "vmess-jq8fcm9a"
    }
  ],
  "policy": {
    "levels": {
      "0": {
        "statsUserDownlink": true,
        "statsUserUplink": true
      }
    },
    "system": {
      "statsInboundDownlink": true,
      "statsInboundUplink": true,
      "statsOutboundDownlink": false,
      "statsOutboundUplink": false
    }
  },
  "reverse": null,
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api",
        "type": "field"
      },
      {
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "blocked",
        "type": "field"
      },
      {
        "outboundTag": "blocked",
        "protocol": [
          "bittorrent"
        ],
        "type": "field"
      },
      {
        "domain": [
          "domain:onion"
        ],
        "outboundTag": "tor",
        "type": "field"
      },
      {
        "outboundTag": "vmess-jq8fcm9a",
        "type": "field",
        "user": [
          "toruser"
        ]
      }
    ]
  },
  "stats": {},
  "transport": null
}
JSON

视频文稿(忽略)

上期给大家介绍了什么是暗网以及如何访问暗网,有些人对其嗤之以鼻,认为这是一个充斥着色情暴力犯罪的法外之地,教授访问暗网就是在助纣为虐,确实由于其不受监管,不法分子会利用暗网来进行非法活动,但这并不是tor的问题,tor的初衷是为了更好的保护用户隐私,曝光美国棱镜监视计划的爱德华斯诺登就曾多次公开推荐使用 Tor 来保护隐私和匿名通信,而且暗网也只是tor的一个应用,只不过很多教程都直接把tor网络和暗网画上等号,导致很多人对tor网络存在误解,事实上tor不仅可以用来访问暗网,也能访问表网,还能用来代理ssh、ftp等其他tcp流量,比特币钱包还能针对tor节点进行单独配置,我们熟悉的singbox也支持tor出站,但默认编译的版本没有嵌入tor,需要自己编译或者从外部载入

接下来就来教大家脱离洋葱浏览器直接使用tor网络,事先声明,教程仅供技术交流学习探讨,不提倡使用tor网络从事任何违法活动,虽说tor网络可以完美隐匿你在网络上的行踪,但你的数据会因为你的各种不当操作而从tor网络中泄漏出去,请勿以身试法

开始之前再简单讲讲tor网络的工作原理,你可以把它看做是一个免费的三层链式代理,当我将访问谷歌的请求发送给tor的时候,他会从tor网络中随机选择三个中继节点并建立链接,然后通过握手协商获取每个节点的共享密钥,首先使用节点3的密钥对数据进行加密,然后在这个基础上再使用节点2的密钥对数据进行加密,最后使用节点1的密钥对数据进行加密,加密后的数据将会发给tor网络里的中继节点1,这个节点也称为守卫节点,由于数据你是直接发给他的,所以他是唯一知道你ip地址的节点,守卫节点拿到数据后,会使用他的密钥对数据进行解密,获取到了经过节点2密钥加密的数据,由于节点1并没有节点2的密钥,所以无法解密,节点1无法看到里面的内容,解密之后的数据会发给节点2,节点2会使用他的密钥进行解密,获取到了节点3加密的内容,同样的,节点2无法看到被节点3加密的内容,同时数据是节点1发给他的,所以他不知道你的真实ip,解密后的数据将会发给节点3,节点3使用密钥进行解密,得到了你的意图是访问谷歌,于是帮你访问谷歌,谷歌会认为是节点3在访问他,节点3是出口节点,他知道你要访问谷歌,但不知道你的真实ip,因为数据是从节点2发给他的,在这种情况下如果想追踪你是谁,在访问哪?就必须同时控制这三台中继节点,并且tor每隔十分钟就会更换节点,也可以随时手动切换节点,在这个由志愿者组成的去中心化网络想要追踪你几乎是不可能的

为了屏蔽本地系统差异可能出现的各种问题,教程选择将tor网络搭建在节点上,首先我们需要搭建一个普通的节点,以xui面板为例,在vps上执行这条指令安装xui面板,这些用到的信息我会放在视频下方的说明栏,接着访问连接进入面板,来到入站列表,我这里视频演示就随便搭建一个ss节点,将这个节点导入代理工具,测一下延迟,有延迟说明可以正常使用,接着我们就可以启用这个节点进行科学上网了,这台vps的ip尾数是212,访问ping0查询一下节点ip,ip地址确实是212,此时这就是一个普通的ss节点,并不能访问暗网,暗网必须要先连接tor网络才能访问,可以访问这个网址来检测一下,网页提示我们没有使用tor,也可以在这里获取一些暗网网址,比如访问暗网版bbc,就会显示无法访问

接下来让这个节点支持访问暗网,首先使用这条指令安装tor,安装完成后稍等片刻,执行lsof -i:9050指令,如果和我一样返回了这个tor的进程,说明tor已经安装好了并且成功启动了,默认情况下tor会在9050端口开启socks代理,也就是你通往tor网络的入口,只要将你需要进入tor网络的流量交给9050端口就行了,利用xray的路由功能可以轻松实现这个目的,回到xui面板,来到xray设置,在出站规则下添加tor的入口,协议选择socks,随便给个标签,地址和端口就填写tor监听的入口,填localhost或者127.0.0.1都可以,点击添加,接着来到路由规则页面添加一个路由,在domain这里输入domain:onion,outbound tag选择刚才添加的tor出站,点击添加,点击保存,并且重启xray,如果你和我一样点击重启后卡住了,那是因为我们一边正在使用这个节点,一边又要重启这个节点,类似自己把自己抬起来,不符合常理,所以你可以先切换到其他节点再点击重启,或者直接在vps上执行x-ui restart,此时就算是配置好了,

这样通过节点访问onion域名的流量都会进入tor网络,首先刷新检测网页,提示我们没有连接tor,因为这个检测网页是org的表网域名,并不是暗网,所以数据并没有发送到tor网络里,接着尝试刷新onion结尾的暗网域名,就成功的通过谷歌浏览器进入了暗网版bbc,不需要使用洋葱浏览器,不过这样的隐匿性没有使用洋葱浏览器好,因为谷歌可能会收集你的访问数据,也就是知道访问了哪些暗网网站,洋葱浏览器不会收集这些信息,这里还列举了一些其他的暗网网站,都是正规的,同样也都可以正常访问了,虽然速度有点慢,现在的配置相当于访问暗网的流量会进入tor网络,访问其他表网还是直接使用vps,但如果你希望访问表网也通过tor网络,则还需要进一步设置, 回到xui,给这个ss节点再添加一个客户端,将电子邮件设置为toruser,点击添加,将其导入代理工具,目前他还只是一个普通的节点,来到xray设置,出站我们刚才已经添加好了tor节点,添加一条路由规则,在user这里填入刚才设置的电子邮件toruser,出站选择tor,意思是不管你是访问表网还是暗网,还是诸如ssh、ftp之类的需要被代理的流量,只要使用这个节点,数据全都会通过tor网络代理,点击添加,然后保存并重启xray,此时就算是配置好了,接着我只要切换到toruser的节点,所有代理数据都会通过tor网络,再来检测一下,可以看到显示我们的数据经过了tor网络,不过网页会提醒我们没有使用洋葱浏览器,如果要更强的隐私保护则推荐使用洋葱浏览器,这个尾数198的ip就是洋葱网络的出口节点,respect,包括其他表网检测到的也将会是tor节点的ip,相当于对外隐藏了我vps的ip地址,由于用tor网络来干坏事的人太多,ip风险程度爆表100%是预期效果,等会我也会教大家通过后置代理解决这个问题,表网都是用tor那暗网更是没问题了,可以正常访问, 这就是将所有流量导入tor网络的配置方式,如果你只希望访问暗网才通过tor网络就用刚才配置的第一个ss节点

有些朋友不想使用面板,希望自己手搓配置实现,我会将对应的配置文件提取出来,供大家手搓参考,不过毕竟手搓的受众比较小,我将继续使用xui面板来为大家做演示

安卓手机就以nekobox为例,将节点导入nekobox,选中节点并开启代理,有延迟,接着打开浏览器,可以通过tor网络访问表网谷歌,并且可以看到出口节点的ip已经发生了改变,上期也讲过tor网络的节点会定时自动更换防止被追踪,但由于ip太脏了要进行烦人的人机验证,建议我们跳过这个环节,尝试访问暗网版brave,提示无法加载,因为域名无法解析到ip,这是因为暗网域名只能在tor网络中路由,并没有对应的ip地址,由于手机默认使用的是需要在本地进行dns的tun模式,而dns找不到暗网对应的ip,于是就报错了,这种情况下需要开启fakeip模式,进入nekobox的设置,在下面找到启用fakedns的选项,也就是fakeip,启用他,此时的onion域名将会交给节点处理,本地不会解析,而节点收到onion域名将会根据路由转发到tor网络中,应用之后重新访问暗网,就可以成功通过普通浏览器访问暗网网站了,这就是安卓的配置方法

刚才电脑用的是socks代理模式,socks不需要在本地进行dns解析,可以直接将暗网域名交给节点处理,如果你要开tun的话需要将onion域名配置为fakeip模式,至于啥是fakeip三言两语讲不清,可以回看这期经典老番,这里就不再啰嗦了

至于ios的话我使用safari和chrome尝试了一下,发现他们不管是不是fakeip,压根就不处理onion域名,可能是系统限制,所以只能访问表网无法访问暗网

刚才我也说了tor网络的出口节点对于表网来说无一例外,注意是无一例外全都是高风险的ip,比如访问这个网站查看ip的评分,可以看到是信任分为0的高风险ip,即使出口ip又发生了改变,甚至可以在这里看到检测出了这是tor节点,包括滥用、攻击、代理等点亮的小红灯,用这个ip访问表网的话很多网站都会被限制,所以接下来教大家通过后置代理解决这个问题,先看操作,在面板上再随便添加一个节点,比如vmess,复制节点链接,来到xray设置下的出站规则,点击添加出站,将刚才复制的节点链接粘贴上去,点击右边的图标解析,点击添加出站,接着重新编辑该节点,启用sockopts,dialer proxy选择tor,点击确定,来到路由规则,修改刚才toruser节点的出口,将其改成刚才添加的vmess节点,点击确定,最后点击保存并重启xray,这样就算是配置好了

此时的效果相当于,我通过ss节点访问谷歌,由于使用的是toruser的节点,而toruser的路由是从vmess出去,于是数据将通过vmess进行加密发送,但是vmess节点设置了通过tor节点代理,于是这条经过vmess加密的数据会发送到tor网络,经过tor的三层代理来到了vmess节点,也就是他自己,使用vmess解密后发现是访问谷歌的,于是通过直连帮我们访问了谷歌,对于谷歌来讲和他通信的ip是这台vps,而不是高风险的tor出口ip,这就是后置代理的通信过程

尝试查询ip,可以看到落地是使用vps的ip,而不是tor网络的出口ip,虽然这个ip的纯净度也不咋地,检测页面显示没有使用tor网络,那是因为落地并不是tor出口ip,但是我们中间确实使用了tor网络,暗网也是可以正常访问的,有些朋友可能有疑问,入口是vps的ip,出口又是vps的ip,那为啥不直接访问,还要到tor网络里转一圈?为了降低网速吗?有没有用先放一边,你就说这操作六不六吧,当然也可以套个cdn啥的,这里就不再拓展了,大家自行发挥

另一种场景是使用不同的vps实现后置代理,比如我这里有一个住宅ip的socks节点,但是我不想让这个socks节点知道我的前置代理ip,就可以通过tor网络连接,在面板里添加一个socks出站,将这个住宅ip的信息填进去,同样启用sockopts,dialer proxy选择tor,点击添加,来到路由规则,你可以单独添加一个规则,或者修改toruser节点,将这个用户的出口改成住宅ip的socks代理,最后保存并重启xray,此时再来检测ip落地就是干净的美国住宅ip了,前置代理是vps,落地的后置代理是住宅ip,住宅ip不知道数据是从前置代理发过来的,由于ip比较干净就不会像tor出口一样被表网各种阻挡了

最后讲一下怎么搭建暗网网站,非常简单,在vps上修改这个torrc的配置文件,搜索hidden,找到这个位置,将这三行前面的#号注释删掉,第一行是数据保存的目录位置,第二和第三行表示端口映射,访问暗网的80端口就相当于访问本机的80端口,你可以使用nginx在这台vps的80端口上搭建一个网站,我就直接转发xui的端口做演示了,复制xui使用的端口,粘贴到这里,先复制这个路径,等会要用,修改完成后保存退出,然后执行这条指令重新运行tor,接着使用这条指令查看这个路径下的hostname,这个就是我的暗网域名,复制到浏览器中访问,如果发现没有反应的话,看看是不是浏览器自动加上了https,我的xui是没有配置tls的,所以要改成http,再次访问网页返回一片空白,因为缺少了路径,将xui的路径加上,就能成功进入暗网版的xui面板了

如果你想贡献vps到tor网络中当中继节点,请自行查阅相关文档,tor的配置参数非常多,可以实现更细致的设定,比如手动切换链路,屏蔽某些地区的节点或者只连接某些地区的节点,感兴趣的朋友可以自行研究。

最后修改:2025 年 06 月 19 日 01 : 54 PM