搭建利用 obfs4 混淆的 Tor bridge 的过程

本文以 Debian 9 、Ubuntu 16.04 和 CentOS 7 为例,说明如何搭建 Tor Bridge。

Tor 的目的在其匿名性,众所周知,如果我们想连接到 Tor 网络可能需要一个网桥,一般的网桥还不行,因为会被检测到 Tor 流量,ip 直接被 ban 掉,当我还知之甚少的时候,一个 VPS 的 ip 就被某知名防火墙封禁了3天,当然恢复后,这个 ip 也不好再用了。

Tor 的节点分为三种

  1. 作为出口节点,Exit Nodes 。出口节点实际上是暴露于互联网的,相当于最后真正去访问站点的那个人。

  2. 在 Tor directory 中列出的中继节点,叫 Tor Relay 。IP 很可能被检测到,很可能被屏蔽。

  3. 在 Tor directory 中不列出的中继节点,叫 Bridges Relay,也就是我们这篇文章重点介绍的节点。它可以帮助你绕过网络运营商对于 Tor 的封锁。

混淆插件

在过去的几年中,审查者开始可以屏蔽即使使用了 Bridges 的 Tor clients 。故,在严格审查的环境下,我们应该使用混淆插件进行规避,比如 meek,比如 obfs4,在这里,将着重介绍如何使用 obfs4。

VPS 对于 Tor 的支持

并非所有 VPS 商都允许使用 Tor,所以应该事先了解政策支持情况,下面表格列出了常用的 VPS 支持情况:

VPSBridgesRelayExit
DigitalOceanYESYESNO
VultrYESYESNO
LinodeYESYESAmbiguous

获取更多信息,可以参考支持/禁封列表

下面便以 Debian 9 (推荐)、 Ubuntu 16.04 和 Centos 7 为例,说明如何搭建 Tor Bridge。

Debian 9

1. 下载并安装 Tor 和 obfs

apt update && apt install tor obfs4proxy -y

2. 配置Tor Bridges

首先,确认服务器上的时钟日期是正确的。

然后编辑/etc/tor/torrc,定义一个 ORPort,不作为出口节点,设置成Bridge:

Log notice file /var/log/tor/notices.log
RunAsDaemon 1
ORPort 443
Exitpolicy reject *:*
BridgeRelay 1
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ExtORPort auto
PublishServerDescriptor 0

重启 Tor 服务:

systemctl restart tor

3. 使用网桥

查看日志文件,命令:tail -F /var/log/tor/notices.log,当看到有类似的输出,证明很成功:

[notice] Your Tor server's identity key fingerprint is 'Unnamed 530FA95A79B9145D315F15F01215BE2F3BE921EB'
[notice] Your Tor bridge's hashed identity key fingerprint is 'Unnamed 83D1AC9EC2F15D7024278461DC91A8B2E9BBF43A'
[notice] Registered server transport 'obfs4' at '[::]:46396'
[notice] Tor has successfully opened a circuit. Looks like client functionality is working.
[notice] Bootstrapped 100%: Done
[notice] Now checking whether ORPort <redacted>:443 is reachable... (this may take up to 20 minutes -- look for log messages indicating success)
[notice] Self-testing indicates your ORPort is reachable from the outside. Excellent.

记住输出中 obfs4 监听的端口(本例中是 46396)。并且还能找到你的server identity fingerprint(本例中是 530FA95A79B9145D315F15F01215BE2F3BE921EB),也复制下来。

/var/lib/tor/pt_state/obfs4_bridgeline.txt文件中可以看到类似如下的内容:

Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

把 Bridge 去了,ip 换了,端口写对了,fingerprint 粘贴了,之后,把这行复制即可,这个,就是你的网桥了。

本例中最后成品:

obfs4 123.456.789.10:46396 530FA95A79B9145D315F15F01215BE2F3BE921EB cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

愉快使用吧。

Ubuntu 16.04

1. 下载并安装 Tor

sources.list 中添加源:

deb http://deb.torproject.org/torproject.org xenial main
deb-src http://deb.torproject.org/torproject.org xenial main

添加gpg key:

gpg --keyserver keys.gnupg.net --recv A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -

安装tor:

apt update && apt install tor deb.torproject.org-keyring -y

2. 下载并安装 obfs4

sources.list 添加源:

deb http://deb.torproject.org/torproject.org obfs4proxy main

安装

apt update && apt install obfs4proxy

3. 配置Tor Bridges

首先,确认服务器上的时钟日期是正确的。

然后编辑 /etc/tor/torrc,定义一个 ORPort,不作为出口节点,设置成 Bridge:

Log notice file /var/log/tor/notices.log
RunAsDaemon 1
ORPort 443
Exitpolicy reject *:*
BridgeRelay 1
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ExtORPort auto
PublishServerDescriptor 0

重启 Tor 服务:

systemctl restart tor

4. 使用网桥

查看日志文件,命令:tail -F /var/log/tor/notices.log,当看到有类似的输出,证明很成功:

[notice] Your Tor server's identity key fingerprint is 'Unnamed 530FA95A79B9145D315F15F01215BE2F3BE921EB'
[notice] Your Tor bridge's hashed identity key fingerprint is 'Unnamed 83D1AC9EC2F15D7024278461DC91A8B2E9BBF43A'
[notice] Registered server transport 'obfs4' at '[::]:46396'
[notice] Tor has successfully opened a circuit. Looks like client functionality is working.
[notice] Bootstrapped 100%: Done
[notice] Now checking whether ORPort <redacted>:443 is reachable... (this may take up to 20 minutes -- look for log messages indicating success)
[notice] Self-testing indicates your ORPort is reachable from the outside. Excellent.

记住输出中 obfs4 监听的端口(本例中是 46396)。并且还能找到你的server identity fingerprint(本例中是 530FA95A79B9145D315F15F01215BE2F3BE921EB),也复制下来。

/var/lib/tor/pt_state/obfs4_bridgeline.txt文件中可以看到类似如下的内容:

Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

把 Bridge 去了,ip 换了,端口写对了,fingerprint 粘贴了,之后,把这行复制即可,这个,就是你的网桥了。

本例中最后成品:

obfs4 123.456.789.10:46396 530FA95A79B9145D315F15F01215BE2F3BE921EB cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

愉快使用吧。

Centos 7

1. 下载并安装Tor

安装tor:

yum install tor -y

2. 编译安装obfs4

安装所需软件:

yum install git mercurial golang -y

开始安装 obfs4proxy:

export GOPATH=`mktemp -d`
go get git.torproject.org/pluggable-transports/obfs4.git/obfs4proxy
cp $GOPATH/bin/obfs4proxy /usr/local/bin/

3. 配置Tor Bridges

首先,确认服务器上的时钟日期是正确的。

然后编辑 /etc/tor/torrc,定义一个 ORPort,不作为出口节点,设置成 Bridge:

Log notice file /var/log/tor/notices.log
RunAsDaemon 1
ORPort 443
Exitpolicy reject *:*
BridgeRelay 1
ServerTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy
ExtORPort auto
PublishServerDescriptor 0

重启 Tor 服务:

systemctl restart tor

4. 使用网桥

查看日志文件,命令:tail -F /var/log/tor/notices.log,当看到有类似的输出,证明很成功:

[notice] Your Tor server's identity key fingerprint is 'Unnamed 530FA95A79B9145D315F15F01215BE2F3BE921EB'
[notice] Your Tor bridge's hashed identity key fingerprint is 'Unnamed 83D1AC9EC2F15D7024278461DC91A8B2E9BBF43A'
[notice] Registered server transport 'obfs4' at '[::]:46396'
[notice] Tor has successfully opened a circuit. Looks like client functionality is working.
[notice] Bootstrapped 100%: Done
[notice] Now checking whether ORPort <redacted>:443 is reachable... (this may take up to 20 minutes -- look for log messages indicating success)
[notice] Self-testing indicates your ORPort is reachable from the outside. Excellent.

记住输出中 obfs4 监听的端口(本例中是 46396)。并且还能找到你的server identity fingerprint(本例中是 530FA95A79B9145D315F15F01215BE2F3BE921EB),也复制下来。

/var/lib/tor/pt_state/obfs4_bridgeline.txt文件中可以看到类似如下的内容:

Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

把 Bridge 去了,ip 换了,端口写对了,fingerprint 粘贴了,之后,把这行复制即可,这个,就是你的网桥了。

本例中最后成品:

obfs4 123.456.789.10:46396 530FA95A79B9145D315F15F01215BE2F3BE921EB cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

另外还需要注意对防火墙的配置:

vi /etc/firewalld/zones/public.xml

添加如下行:

<port protocol="tcp" port="ORPort端口"/>
<port protocol="udp" port="ORPort端口"/>
<port protocol="tcp" port="obfs4端口"/>
<port protocol="udp" port="obfs4端口"/>

使新规则生效:

firewall-cmd --complete-reload

至此,网桥配置完毕。愉快使用吧。