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

Contents
  1. 1. Tor 的节点分为三种
  2. 2. 混淆插件
  3. 3. VPS 对于 Tor 的支持
  4. 4. 准备
  5. 5. 添加软件源
    1. 5.1. 添加 obfs4proxy
    2. 5.2. Debian 9
    3. 5.3. Ubuntu 18.04
  6. 6. 添加 key
  7. 7. 下载并安装 Tor 和 obfs
  8. 8. 配置 Tor Bridge
  9. 9. 记录必要信息
  10. 10. 防火墙配置
  11. 11. 使用网桥
  12. 12. CentOS 7
    1. 12.1. 1. 下载并安装 Tor
    2. 12.2. 2. 安装 obfs4
    3. 12.3. 3. 配置 Tor Bridges
    4. 12.4. 4. 使用网桥
  13. 13. References

本文最后更新于 2019 年 3 月 21 日


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

Debian 和 Ubuntu 用户:请先参照 Ubuntu (Debian) 服务器的初始化配置 一文对服务器进行各种必要的配置。本文以 sammy 用户为例,进行 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 18.04 和 Centos 7(不推荐)为例,说明如何搭建 Tor Bridge 。

Debian 和 Ubuntu

准备

切换为 root 用户:

1
su -

输入 root 用户密码。

安装必要的软件:

1
apt update && apt install apt-transport-https -y

添加软件源

添加 obfs4proxy

1
sh -c 'printf "deb https://deb.torproject.org/torproject.org obfs4proxy main" > /etc/apt/sources.list.d/obfs4proxy.list'

Debian 9

1
sh -c 'printf "deb https://deb.torproject.org/torproject.org stretch main" > /etc/apt/sources.list.d/tor.list'

Ubuntu 18.04

1
sh -c 'printf "deb https://deb.torproject.org/torproject.org bionic main" > /etc/apt/sources.list.d/tor.list'

添加 key

1
2
curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
1
2
apt update
apt install deb.torproject.org-keyring -y

下载并安装 Tor 和 obfs

1
2
apt update
apt install tor obfs4proxy -y

配置 Tor Bridge

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

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

1
vim /etc/tor/torrc
/etc/tor/torrc
1
2
3
4
5
6
7
8
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 服务:

1
systemctl restart tor

记录必要信息

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

1
2
3
4
5
6
7
[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's identity fingerprint(本例中是 530FA95A79B9145D315F15F01215BE2F3BE921EB),也复制下来。

防火墙配置

上步骤中得到了端口 46396

1
ufw allow 46396

使用网桥

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

/var/lib/tor/pt_state/obfs4_bridgeline.txt
1
Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

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

本例中最后成品(可在 Tor browser 上使用的):

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

愉快使用吧。

CentOS 7

注意:不推荐使用 CentOS 。

1. 下载并安装 Tor

/etc/yum.repos.d/ 目录下,创建名为 torproject.repo 的文件,内容如下:

/etc/yum.repos.d/torproject.repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[tor]
name=Tor repo
enabled=1
baseurl=https://deb.torproject.org/torproject.org/rpm/el/7/$basearch/
gpgcheck=1
gpgkey=https://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc

[tor-source]
name=Tor source repo
enabled=1
autorefresh=0
baseurl=https://deb.torproject.org/torproject.org/rpm/el/7/SRPMS
gpgcheck=1
gpgkey=https://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc

yum 提示的指纹应为:

3B9E EEB9 7B1E 827B CF0A  0D96 8AF5 653C 5AC0 01F1

编辑 /etc/yum.repos.d/epel.repo ,在 [epel] 下添加一行:

/etc/yum.repos.d/epel.repo
1
Exclude=tor

安装tor:

1
yum install tor -y

2. 安装 obfs4

安装所需软件:

1
yum install make automake gcc python-pip python-devel libyaml-devel

开始安装 obfs4proxy:

1
pip install obfsproxy

3. 配置 Tor Bridges

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

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

/etc/tor/torrc
1
2
3
4
5
6
7
8
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 服务:

1
systemctl restart tor

4. 使用网桥

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

1
2
3
4
5
6
7
[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 文件中可以看到类似如下的内容:

/var/lib/tor/pt_state/obfs4_bridgeline.txt
1
Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=6LMNcXh6MIfApbZiMksnS4Kj+2sffZ5pybSqtcOO5YoHgfrMpkBJqvLxhuR2Ppau0L2seg iatmode=0

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

本例中最后成品:

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

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

1
vim /etc/firewalld/zones/public.xml

添加如下行:

/etc/firewalld/zones/public.xml
1
2
3
4
<port protocol="tcp" port="ORPort端口"/>
<port protocol="udp" port="ORPort端口"/>
<port protocol="tcp" port="obfs4端口"/>
<port protocol="udp" port="obfs4端口"/>

使新规则生效:

1
firewall-cmd --complete-reload

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

References

Tor Project: Debian/Ubuntu Instructions

obfs4proxy bridge deployment guide

Obfsproxy Instructions

Tor packages for RPM-based linux distributions.

关于搭建 Tor Relay 的一点胡扯——以及为什么现在 Tor Bridges 更好