難しい設定なしでWindows・Mac・Linux・Android・iOS同士をVPNで接続できる「ZeroTier」 – GIGAZINE

難しい設定なしでWindows・Mac・Linux・Android・iOS同士をVPNで接続できる「ZeroTier」 – GIGAZINE

仮想的にプライベートネットワークを構築してデータを直接的にやりとりするVirtual Private Network(VPN)は非常に便利ですが、仮想ネットワークの構築作業に知識が必要で、作業自体も複雑という欠点があります。しかし、オープンソースソフトの「ZeroTier」を使えば、そんなVPNの構築作業をほとんど行うことなく、ネットワーク情報を指定するだけで、WindowsはもちろんMac、Linux、Androidなどの端末同士を暗号化された状態で簡単にVPNで接続できるとのことなので、さっそくWindows端末とAndroid端末を使ってVPN接続を試してみました。

ZeroTier | Software Defined Networking
https://www.zerotier.com/

上記公式サイトの「Try for Free」をクリック。

ZeroTierの使い方に移動するので、まずはクライアントPC用のソフトウェアをダウンロードします。Step1の「Download ZeroTier One」をクリック。

今回はWindows 7で使うので、「Windows.MSI|7+|Intel 32/64-bit」をクリック。

ダウンロードしたインストーラーを実行します。

セキュリティ警告が出た場合は、「実行」をクリック。

「Install」をクリック。

「インストール」をクリック。

「Finish」をクリックして、ZeroTier Oneを起動させます。

これがZeroTier Oneの起動画面。

公式ページにテスト用に公開されている「8056c2e21c000001」をバーチャルネットワークに指定してみます。

テキストボックスに「8056c2e21c000001」と入力して、「Join」をクリック。

すると、Statusが「OK」となって仮想ネットワークに接続できました。

なお、公式ページにある「http://earth.zerotier.net/」にアクセスして……

ウェルカムページが開き、仮想のIPアドレスが表示されれば正しく接続されていることが確認できます。

次に、AndroidのZeroTier Oneアプリを使って同じ仮想ネットワークの接続先に指定してみます。公式ページの「Download ZeroTier One」をタップ。

「Android->via Google Play Store」をタップ。

Google PlayのZeroTier Oneアプリページが開くので、「インストール」をタップ。

「インストール」をタップ。

「OK」をタップ。

インストールが完了したら、「開く」をタップしてアプリを起動させます。

アプリが起動したら、「Connect」をタップ。

「OK」をタップ。

「Disconnect」と表示されるのを確認して……

画面右上の「+」アイコンをタップ。

「NETWORK ID」の指定画面が開くので……

Windows 7のPCと同じく、「8056c2e21c000001」と指定して、「Join Network」をタップ。

無事、仮想ネットワークに接続できました。

これで、Windows 7のPCとAndroid端末が同一の仮想ネットワークに接続できました。接続が正しくできているかを確認するために、コマンドプロンプトを使ってWindows 7端末からAndroid端末へPingを打ってみると、Pingが返ってきました。Android端末のネットワークを解除するとPingが返ってこなくなるので、両端末が仮想ネットワークで接続できているようです。

なお、仮想ネットワークから切断するには「Leave」をクリックするだけ。

「Join」「Leave」のボタンを使って、仮想ネットワークへの接続・解除を簡単に行うことができます。

特別な設定をすることなく簡単に仮想ネットワークに接続できる「ZeroTier」を使えば、同一ネットワーク内にあることが前提のソフトウェアを使ったり、外部ネットワークから閉じられたネットワ
ク内の個別の端末をダイレクトに指定したりといった作業が、非常に簡単にできそうです。もちろん公式ページの仮想ネットワーク以外にも、自分で建てたサーバーを使って簡単にVPNネットワークを構築することも可能です。

ZeroTierはオープンソースで開発が行われており、GitHubで公開中。近日中にiOSアプリもリリースされる予定となっています。

GitHub – zerotier/ZeroTierOne: A Smart Ethernet Switch for Earth
https://github.com/zerotier/ZeroTierOne

難しい設定なしでWindows・Mac・Linux・Android・iOS同士をVPNで接続できる「ZeroTier」 – GIGAZINE

Ubuntu 安装部署 GoVPN,建立突破网络封锁和审查的 VPN 隧道 — Steemit

<base href="https://steemit.com/govpn/@curl/ubuntu-govpn-vpn“>Ubuntu 安装部署 GoVPN,建立突破网络封锁和审查的 VPN 隧道 — Steemit

Ubuntu 安装部署 GoVPN,建立突破网络封锁和审查的 VPN 隧道

2 months ago

关于 GoVPN

GoVPN 是由俄罗斯 “快乐黑客” Sergey Matveev 使用 Go 语言开发的开源免费的 VPN 软件。

GoVPN 简单、安全,可以防止 DPI 深度包检测,可以对抗网络封锁和审查,GoVPN 使用 UDP 协议加密传输流量。

GoVPN 项目官方网站 http://www.govpn.info/

GoVPN 源代码由开发者自我托管,代码仓库 http://git.cypherpunks.ru/cgit.cgi/govpn.git/

GoVPN 最新版本 govpn-7.4 (August 27, 2017)

(题外话,Sergey Matveev 因不认同 GitHub 的某些政策和做法,从 GitHub 仓库删除了 GoVPN 源代码。)

服务器端和本地客户端环境

服务器环境和客户端系统为 Ubuntu 17.04,服务器用户名为 bob,本地客户端用户名为 alice

Arch Linux 操作系统参见:Arch Linux 安装部署 GoVPN 客户端,建立突破网络封锁和审查的 VPN 隧道

服务器(VPS)可以自由访问国际互联网,有公网 IP,假设为 12.34.56.78,防火墙开放端口 1194(或自定义其他端口)

本地网关为 192.168.1.1,有无公网 IP 无所谓。

建立的 VPN 隧道 IP 段为 172.16.0.1/24,可以自定义为其他内网网段。


设置服务器端和本地客户端的系统环境

首先更新系统

[bob@server ~]$ sudo apt-get update  [bob@server ~]$ sudo apt-get -y upgrade  

安装 Go 1.9

[bob@server ~]$ wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz  [bob@server ~]$ sudo tar -xvf go1.9.linux-amd64.tar.gz  [bob@server ~]$ sudo mv go /usr/local  [bob@server ~]$ export GOROOT=/usr/local/go  [bob@server ~]$ export GOPATH=$HOME/work  [bob@server ~]$ export PATH=$GOPATH/bin:$GOROOT/bin:$PATH  

验证 Go 安装是否成功

[bob@server ~]$ go version  

打印输出内容如下,Go 安装成功

go version go1.9 linux/amd64  

检查 Go 的环境变量配置

[bob@server ~]$ go env  

打印输出内容如下,Go 环境变量配置正确

GOARCH="amd64"  GOBIN=""  GOEXE=""  GOHOSTARCH="amd64"  GOHOSTOS="linux"  GOOS="linux"  GOPATH="/home/bob/work"  GORACE=""  GOROOT="/usr/local/go"  GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"  GCCGO="gccgo"  CC="gcc"  GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"  CXX="g++"  CGO_ENABLED="1"  CGO_CFLAGS="-g -O2"  CGO_CPPFLAGS=""  CGO_CXXFLAGS="-g -O2"  CGO_FFLAGS="-g -O2"  CGO_LDFLAGS="-g -O2"  PKG_CONFIG="pkg-config"  

Go 安装并配置完毕后,安装编译 GoVPN 所需的依赖包

[bob@server ~]$ sudo apt make make-guile  

创建 work 目录,下载 GoVPN 源码并编译

[bob@server ~]$ mkdir ~/work  [bob@server ~]$ chmod a+x work  [bob@server ~]$ cd work  [bob@server ~]$ wget http://www.govpn.info/download/govpn-7.4.tar.xz  [bob@server ~]$ wget http://www.govpn.info/download/govpn-7.4.tar.xz.sig  [bob@server ~]$ gpg --verify govpn-7.4.tar.xz.sig govpn-7.4.tar.xz  [bob@server ~]$ tar xf govpn-7.4.tar.xz  [bob@server ~]$ make -C govpn-7.4 all  [bob@server ~]$ cd govpn-7.4  

在本地客户端

在 govpn-7.4 目录中创建客户端 Alice 连接服务器密码短语 key.txt

[alice@client ~]$ vi key.txt  

假定密码短语为 govpntest(也可以是长度为 32 个字符的 Base64 编码)

govpntest  

在客户端,生成客户名为 Alice 的验证文件:

[alice@client ~]$ ./utils/newclient.sh Alice  Passphrase:  

Passphrase: 提示输入密码短语,和上面创建的 key.txt 内容一致,即 govpntest,打印输出内容如下

Your client verifier is: $balloon$s=32768,t=16,p=2$pqrN42u1ruKOWDQUFlEMgg  Place the following YAML configuration entry on the server's side:      Alice:          up: /path/to/up.sh          iface: or TUN/TAP interface name          verifier: $balloon$s=32768,t=16,p=2$pqrN42u1ruKOWDQUFlEMgg$b0QwK15I7VanKqDAyATrE5VHyL5a+r6h4M8cevPNrxo  

Alice 的验证文件值为:

$balloon$s=32768,t=16,p=2$pqrN42u1ruKOWDQUFlEMgg$b0QwK15I7VanKqDAyATrE5VHyL5a+r6h4M8cevPNrxo  

在服务器端

在 govpn-7.4 目录中为客户端节点 Alice 创建配置文件,保存的文件名为 alice.yaml

[bob@server ~]$ vi alice.yaml  

verifier: 之后的内容为客户段生成的参数值,和上面的内容一致

Alice:      iface: tap10      verifier: $balloon$s=32768,t=16,p=2$pqrN42u1ruKOWDQUFlEMgg$b0QwK15I7VanKqDAyATrE5VHyL5a+r6h4M8cevPNrxo  

在服务器端添加虚拟网卡,设置流量转发和 iptables 规则

虚拟网卡为 tap10,设置隧道 IP 段为 172.16.0.1/24

[bob@server ~]$ sudo ip tuntap add dev tap10 mode tap  [bob@server ~]$ sudo ip addr add 172.16.0.1/24 dev tap10  [bob@server ~]$ sudo ip link set up dev tap10  

设置服务器的 NAT 流量转发

[bob@server ~]$ sudo vi /etc/sysctl.conf  

找到这一行 #net.ipv4.ip_forward = 1 去掉注释符 “#”

net.ipv4.ip_forward = 1  

执行 sysctl 并生效

[bob@server ~]$ sudo sysctl -p  

添加 iptables 规则,将 tap10 请求的流量全部通过 ens4(物理网卡)转发

[bob@server ~]$ sudo iptables -A FORWARD -i tap10 -j ACCEPT  [bob@server ~]$ sudo iptables -A FORWARD -o tap10 -j ACCEPT  [bob@server ~]$ sudo iptables -t nat -A POSTROUTING -o tap10 -j MASQUERADE  [bob@server ~]$ sudo iptables -t nat -A POSTROUTING -o ens4 -j MASQUERADE  

在服务器端启动 GoVPN 的守护进程

[bob@server ~]$ sudo ./govpn-server -conf alice.yaml -bind 0.0.0.0:1194  

在本地客户端

在客户端,为虚拟网卡 tap10 设置 IP 和路由

[alice@client ~]$ sudo ip tuntap add dev tap10 mode tap  [alice@client ~]$ sudo ip addr add 172.16.0.2/24 dev tap10  [alice@client ~]$ sudo ip link set up dev tap10  [alice@client ~]$ sudo ip route add 0/1 via 172.16.0.1  [alice@client ~]$ sudo ip route add 128/1 via 172.16.0.1  [alice@client ~]$ sudo ip route add 12.34.56.78 via 192.168.1.1  [alice@client ~]$ sudo ip route del default  [alice@client ~]$ sudo ip route add default dev tap10  

在客户端的 govpn-7.4 目录中启动 govpn-client

-key 值为启动客户端的密码短语
-verifier 值为验证密钥
-iface 值为虚拟网卡名称
-remote 值为远程服务器的公网 IP

[alice@client ~]$ sudo ./govpn-client       -key /home/alice/work/govpn-7.4/key.txt      -verifier '$balloon$s=32768,t=16,p=2$pqrN42u1ruKOWDQUFlEMgg'       -iface tap10       -remote 12.34.56.78:1194  

或者不带换行符的启动命令

[alice@client ~]$ sudo ./govpn-client -key key.txt -verifier '$balloon$s=32768,t=16,p=2$pqrN42u1ruKOWDQUFlEMgg' -iface tap10 -remote 12.34.56.78:1194  

至此,服务器端和本地客户端的 VPN 隧道已建立完成


在本地客户端,测试 VPN 隧道的连接状态

Ping 服务器端地址 172.16.0.1

[alice@client ~]$ ping 172.16.0.1  

ping 输出如下

PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.  64 bytes from 172.16.0.1: icmp_seq=1 ttl=44 time=83.5 ms  64 bytes from 172.16.0.1: icmp_seq=2 ttl=44 time=83.0 ms  64 bytes from 172.16.0.1: icmp_seq=3 ttl=44 time=83.0 ms  64 bytes from 172.16.0.1: icmp_seq=4 ttl=44 time=83.1 ms  64 bytes from 172.16.0.1: icmp_seq=5 ttl=44 time=83.2 ms  64 bytes from 172.16.0.1: icmp_seq=6 ttl=44 time=83.3 ms  64 bytes from 172.16.0.1: icmp_seq=7 ttl=44 time=83.1 ms  64 bytes from 172.16.0.1: icmp_seq=8 ttl=44 time=83.1 ms  ^C  --- 172.16.0.1 ping statistics ---  8 packets transmitted, 8 received, 0% packet loss, time 7007ms  rtt min/avg/max/mdev = 83.038/83.212/83.592/0.261 ms  

说明 VPN 隧道已通

用 curl 命令测试隧道的流量转发状态

[alice@client ~]$ curl ifconfig.me  

显示 IP 为服务器的公网 IP

12.34.56.78  

curl 获取到了服务器的公网 IP,流量转发成功


Disable GoVPN,禁用 GoVPN 守护进程

删除添加的虚拟网卡、IP 和路由,或者重启系统,将恢复默认设置

服务器端

sudo ip link del dev tap10  

本地客户端

sudo ip link del dev tap10  sudo ip route del 12.34.56.78 via 192.168.1.1  sudo ip route del default  sudo ip route add default via 192.168.1.1  

其他

GoVPN 设计原理和使用方法参考 http://www.cypherpunks.ru/govpn/index.html

如果拥有 IPv4 和 IPv6,设置方法参考开发者给出的示例 http://www.cypherpunks.ru/govpn/Example.html#Example

GoVPN 目前不支持 Windows,Android 以及 iOS 系统。

GoVPN 在数字权利遭受强权政府日益侵害的国家,能有效捍卫网络用户的数字权利。

GoVPN 在中国、俄罗斯、伊朗等网络审查严重的国家,能有效突破网络封锁,突破 GFW 封锁,加密访问被封锁的网站,自由使用互联网。


原创内容,转载请注明出处。
内容修订请浏览 https://github.com/aturl/awesome-anti-gfw

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!

Ubuntu 安装部署 GoVPN,建立突破网络封锁和审查的 VPN 隧道 — Steemit

在 Ubuntu 部署 VPN 隧道 WireGuard — Steemit

<base href="https://steemit.com/cn/@curl/ubuntu-vpn-wireguard“>在 Ubuntu 部署 VPN 隧道 WireGuard — Steemit

关于 WireGuard

WireGuard 是简单、快速、高效并且安全的开源 VPN 软件,它采用先进的加密协议,基于 Linux 内核实现。

WireGuard 项目官方网站 https://www.wireguard.com/

WireGuard 源代码由开发者自我托管,代码仓库 https://git.zx2c4.com/WireGuard/

WireGuard 源代码在 GitHub 的镜像仓库 https://github.com/WireGuard

在服务器端部署 WireGuard

WireGuard 跨平台,参照官方给出的快速安装指南 https://www.wireguard.com/install/


服务器环境以 Ubuntu 系统为例

生成公钥、私钥、共享密钥

sudo mkdir -p /etc/wireguard && sudo chmod 0777 /etc/wireguard && cd /etc/wireguard  umask 077  wg genkey | tee privatekey | wg pubkey > publickey | wg genpsk > presharedkey  

打印输出私钥

cat privatekey  +Cr59JzbCKz9rESqimHGi5C2QfIRYZ5xVMssiTAEqV4=  

打印输出公钥

cat publickey  bco6xIgfp++iFBj6vmDr27tAXfgYsppn/wyUJRcFgUc=  

打印输出共享密钥(可以不生成,配置文件中不是必须的)

cat presharedkey  Vv0MdBNolqbnsBPQPf0ttJecOw2QC8QqWBVieNtvoIo=  

编辑并保存 wg0 配置文件 wg0.conf

sudo vi wg0.conf  

wg0.conf 配置文件内容如下:

ListenPort = 监听端口 1194

PrivateKey = 服务器私钥

PrivateKey = 连接节点公钥(由客户端生成)

AllowedIPs = VPN 隧道的内网 IP 段

[Interface]  ListenPort = 1194  PrivateKey = +Cr59JzbCKz9rESqimHGi5C2QfIRYZ5xVMssiTAEqV4=    [Peer]  PublicKey = 1lq23n/oNwYosnf0xMadtrIcC+droND9fg/wiS0aEhw=  AllowedIPs = 10.100.0.1/24  

设置服务器的 NAT 流量转发

sudo vi /etc/sysctl.conf  

找到这一行 #net.ipv4.ip_forward = 1 去掉注释符 “#”

net.ipv4.ip_forward = 1  

执行 sysctl 并生效

sudo sysctl -p  

在服务器端添加虚拟网卡 wg0,设置隧道 IP 和 iptables 规则

sudo ip link add dev wg0 type wireguard  sudo ip address add dev wg0 10.100.0.1/24  sudo ip link set wg0 up  sudo wg setconf wg0 /etc/wireguard/wg0.conf  sudo iptables -A FORWARD -i wg0 -j ACCEPT  sudo iptables -A FORWARD -o wg0 -j ACCEPT  sudo iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE  sudo iptables -t nat -A POSTROUTING -o ens4 -j MASQUERADE  

检查 wg 设置是否正常

sudo wg show  

正常情况应该输出以下内容:

interface: wg0    public key: 1lq23n/oNwYosnf0xMadtrIcC+droND9fg/wiS0aEhw=    private key: (hidden)    listening port: 1194    peer: 8+9jGlxuwyGUWtUk8/NZMAl1Ax577KAvnXJY0EeuNkQ=    endpoint: 12.34.56.78:61353    allowed ips: 10.100.0.0/24    latest handshake: 0 days, 8 minutes, 19 seconds ago    transfer: 0.60 GiB received, 0.93 GiB sent  

服务器端设置完成。


设置客户端

客户端系统 Ubuntu/Debian/ArchLinux 参照官方给出的快速安装指南 https://www.wireguard.com/install/

sudo mkdir -p /etc/wireguard && sudo chmod 077 /etc/wireguard && cd /etc/wireguard  umask 077  wg genkey | tee privatekey | wg pubkey > publickey  

打印输出私钥

cat privatekey  SHBjWA3uAYAZc+TUvr6PcTA5SVQnt+aSVkdlZhlg1Hk=  

打印输出公钥

cat publickey  8+9jGlxuwyGUWtUk8/NZMAl1Ax577KAvnXJY0EeuNkQ=  

编辑并保存 wg0 配置文件 wg0.conf

sudo vi wg0.conf  

wg0.conf 配置文件内容如下:

ListenPort = 监听端口 1194

PrivateKey = 本地客户端私钥

PrivateKey = 服务器端公钥(由服务器端生成)

AllowedIPs = VPN 隧道的内网 IP 段

Endpoint = 远程服务器公网 IP 和端口

PersistentKeepalive = 连接心跳包的唤醒间隔

[Interface]  ListenPort = 1194  PrivateKey = SHBjWA3uAYAZc+TUvr6PcTA5SVQnt+aSVkdlZhlg1Hk=    [Peer]  PublicKey = bco6xIgfp++iFBj6vmDr27tAXfgYsppn/wyUJRcFgUc=  AllowedIPs = 0.0.0.0/0  Endpoint = 12.34.56.78:1194  PersistentKeepalive = 25  

在本地客户端

在客户端,添加虚拟网卡 wg0 并设置 IP 和路由

sudo ip link add dev wg0 type wireguard  sudo ip address add dev wg0 10.100.0.101/24  sudo ip link set wg0 up  sudo wg setconf wg0 /etc/wireguard/wg0.conf  sudo ip route add 12.34.56.78 via 192.168.1.1  sudo ip route del default  sudo ip route add default dev wg0  

客户端设置完成,Ping 测试 VPN 隧道

ping 10.100.0.1  

ping 输出如下

PING 10.100.0.1 (10.100.0.1) 56(84) bytes of data.  64 bytes from 10.100.0.1: icmp_seq=1 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=2 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=3 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=4 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=5 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=6 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=7 ttl=44 time=103.50 ms  64 bytes from 10.100.0.1: icmp_seq=8 ttl=44 time=103.50 ms  ^C  --- 10.100.0.1 ping statistics ---  8 packets transmitted, 8 received, 0% packet loss, time 828ms  rtt min/avg/max/mdev = 103.50/103.50/103.50/0.00 ms  

说明 VPN 隧道已通

用 curl 命令测试隧道的流量转发状态

显示 IP 为服务器的公网 IP

12.34.56.78  

curl 获取到了服务器的公网 IP,流量转发成功


Disable WireGuard,禁用 WireGuard

删除添加的虚拟网卡、IP 和路由,或者重启系统,将恢复默认设置

服务器端

sudo ip link del dev wg0  

本地客户端

sudo ip link del dev wg0  sudo ip route del 12.34.56.78 via 192.168.1.1  sudo ip route del default  sudo ip route add default via 192.168.1.1  

其他

WireGuard 设计原理和使用方法参考 https://www.wireguard.com/

WireGuard 支持各种 Linux 发行版,目前 Windows 和 macOS 客户端(Go 实现)以及 Android 应用都在开发中。

WireGuard 在数字权利遭受强权政府日益侵害的国家,能有效捍卫网络用户的数字权利。

WireGuard 在中国、俄罗斯、伊朗等网络审查严重的国家,能有效突破网络封锁,突破 GFW 封锁,加密访问被封锁的网站,自由使用互联网。


原创内容,转载请注明出处。
内容修订请浏览 https://github.com/aturl/awesome-anti-gfw

在 Ubuntu 部署 VPN 隧道 WireGuard — Steemit

简单介绍一下网络连接的封锁与反封锁 — Steemit

<base href="https://steemit.com/cn/@v2ray/6knmmb“>简单介绍一下网络连接的封锁与反封锁 — Steemit

最近一段时间,针对网络连接的战争愈演愈烈,双方都在尝试不同的策略。以至于对于新人来说,很难理解哪些已经发生过,哪些还在尝试中。于是我打算写篇文章来简单介绍一下整个故事的来龙去脉。

史前时代

最早的封锁大约是 DNS 投毒和 IP 黑名单。具体细节这里不表,简单来说就是 1) 对于特定域名比如 google.com,你的浏览器解析不到正确的 IP 地址; 2) 即使碰巧解析到了正确的 IP 地址,由于 Google 在亚洲地区的 IP 地址就那么几个,发往这几个 IP 地址的数据包被全部丢弃(或 TCP Reset),也就导致了用户死活访问不到 google.com

攻防战 1.0

由于被封的 IP 依然是少数,而 Google 在全球的 IP 数量庞大,于是网友们很快想到了解决方案,就是使用 hosts 文件指定 IP 地址。虽然亚洲地区的 IP 被封了,但美国、欧洲甚至是南美洲依然有可以访问的地址,速度慢是慢了点,但总比上不去的好。于是 hosts 文件这个方案流行了那么一段时间。

后来封锁升级了,不是针对 IP 地址的了,而是针对每一个网络连接。受限于为数不多的几个出入境节点,网民的每一个出境网络连接实际上都被扫描过一遍。于是网络协议最初设计时,并未考虑封锁这回事,无论是 HTTP 还是 HTTPS,只需要扫描每个连接的前几十个字节,就可以得到其目标地址(域名)。HTTP 是通过其 Host 头,而 HTTPS 是通过 SNI

至此,针对域名,没有封不掉的,只有不想封的。

在直线连接几乎不可能的之后,那就只能绕路了,也就是代理。代理的主要三种模式是 Socks、HTTP 和 VPN。三种模式各有利弊:

  • Socks 可以代理 TCP 和 UDP 连接,但其数据包是明文的,依然逃不过上述检测;
  • HTTP 可以有 TLS 加持,但只能代理 TCP 连接,对 UDP 无效;
  • VPN 可以代理包含 TCP / UDP 在内的各种连接,但 VPN 会转发几乎所有的数据,在可以访问 Google 的同时,可能就不能访问优酷了(地区限制)。

然后 Shadowsocks 横空出世。

Shadowsocks 本质上是 Socks 的加密版本,可选择多种加密方式。一旦加了密,其传输的数据就无法被第三方检测了。并且 Shadowsocks 在转发数据之前,可以对其目的地进行判断,比如可以只转发去往 Google 的流量,而优酷的流量依然直连。在经常一段时间的优化之后,Shadowsocks 可以达到一个全局较快的连接速度,比上述的几个代理方式都要好。

由于 Shadowsocks 太过火爆,其作者被公安机关约谈,勒令不得继续参于相关项目的开发。

攻防战 2.0

中国那么多人,要把相关人员一一找出来喝茶,也不是一件容易的事。封锁这事,还得从网络连接着手。

对于一台国内的机器往一个国外的服务器发送数据的网络连接,有两种检测方式,被动式和主动式。

被动式是指检测方只观察连接中传输的内容,当内容符合某种模式(比如关键字)的时候,就把连接中断,或者服务器 IP 列入黑名单。上述的所有封锁方式均为被动式。

而主动式指的是,当观察到一个不可识别的连接时,检测方主动发起一个去往服务器的连接,通过一些编造的数据,探测出服务器是不是一台代理服务器。

Shadowsocks 协议曾被指出一个严重的安全性问题。只需要不到 16 次主动探测,就可以 100% 断定服务器是否在运行 Shadowsocks。具体来说,初版 Shadowsocks 协议依赖于连接头部的某一个字节来读取目标地址,这个字节的取值只有三种。当这个字节的取值不合法时,Shadowsocks 会快速中断连接,否则继续读取剩下的内容。于是这一特征可被用于探测一个服务器是否为 Shadowsocks 代理。

为了应对这一探测方式,Shadowsocks 对其加密方式升级了两次(OTA 和 AEAD)。目前看来这一漏洞,以及其它可能的主动探测方式,都被避免了。

同时期还有多个流行的翻墙工具,其原理和 Shadowsocks 大同小异,这里略过。

番外篇 1.0

既然代理工具有漏洞,那么检测工具也一会有漏洞。只要发现并利用这些漏洞,一样可以突破封锁。

曾经有一个
目“西厢计划”,就是利用了检测工具的漏洞,伪造了一些数据包,使它在检测方看上去上一个网络连接,但在目的服务器看来又是另一回事。检测方以为自己已经封锁了该连接,但实际上并没有。

和 Shadowsocks 的升级一样,检测方的算法也一样可以升级。升级之后,西厢计划便失效了。

攻防战 3.0

从信息学的角度来说,Shadowsocks 协议是一个近乎完美的协议。它的数据完全随机,无法 100% 确定这个网络连接是否为 Shadowsocks。但从另一方面来说,网络数据并不是均匀分布的,保守来说,HTTP 和 HTTPS 流量占据了 70% 以上。而如果一个服务器接收的流量 90% 是杂乱无章的,那么它就很可疑了。虽然检测方不能严格证明那就是 Shadowsocks,但秀才遇到兵啊……

既然随机数据可疑,那我们就把数据伪装成 HTTP 或者 HTTPS 好了。由于 HTTPS 是大势所趋,并且 HTTPS 传输的内容天生不可能被破解,把代理数据伪装成 HTTPS 也是一个比较合理的选择。

由于检测方无法判断一个 HTTPS 连接是正常的网站流量,还是代理。如果封锁所有的 HTTPS 流量,那无疑是一个杀敌五百,自损一千的昏招。当然急病乱投医也是有可能的……

第二战场 1.0

所有的代理工具都不是系统自带的,用户使用代理工具之前,需要先下载和安装。于是封锁下载途径也是一种封锁。Apple 就按要求移除了所有 VPN 应用。此战场防御方完败 😂

目前明面上的攻防到此为止,接下来说说一些想法和揣测

攻防战 4.0

虽然流量经过了加密,但加密的只是内容,不能排除还有其它的特征。比如 TLS (HTTPS 所用的加密协议)的握手环节,客户端和服务器互相发送的数据是有规律的。比如握手三次,每一次的数据量大致是固定的。如果有一个连接,也有三次握手,每一次的数据量和 TLS 相当,但是内容是混乱的,那么这个连接是不是 Shadowsocks 连接呢?当然 Shadowsocks 有一些额外的数据,这个另说。

目前翻墙圈在这一问题上有很大的争论。对于检测方是否足够强的技术做类似的检测,以及是否有足够的把握只封代理都存在疑惑。但毫无疑问,这将是下一个值得研究的领域。

另一个热点是分布式或者P2P。

这一领域已经被 Tor 证明为成功或者失败了(取决于你怎么看待 Tor)。我个人不喜欢 Tor 因为它速度太慢。虽然 P2P 这一术语最近很热,听上去也很有希望,但实际上它并不适用于翻墙。翻墙的过程需要【墙内的P】2【墙外的P】,并不是任意两个 P 都可以自由组合的。

目前对翻墙 P2P 的研究和应用都比较少,前景不明朗,观望中。

以上是对翻墙历史的简单总结,希望对新人有帮助。

简单介绍一下网络连接的封锁与反封锁 — Steemit

Shadowsocks, WireGuard, GoVPN, OpenVPN 这几款翻墙软件共存在同一台服务器 — Steemit

<base href="https://steemit.com/cn/@curl/shadowsocks-wireguard-govpn-openvpn“>Shadowsocks, WireGuard, GoVPN, OpenVPN 这几款翻墙软件共存在同一台服务器 — Steemit

china-gfw.jpg
(Images via Google search)

这几款翻墙软件可以同时安装在同一台服务器上,只需要为每款软件定义不同的端口就行。

Shadowsocks 是 Socks5 代理,WireGuard 和 GoVPN 是全局代理,走 UDP 协议,OpenVPN 支持 TCP/UDP 协议。UDP 协议很容易被宽带运营商 QoS 限速,在高峰期丢包严重,很影响速度,不过大多数翻墙软件在省际或国际出口都会收到 GFW 干扰。

Shadowsocks 在跨平台、速度和性能上都非常优秀,WireGuard, GoVPN, OpenVPN 这三款在翻墙速度上还是劣于 Shadowsocks,在加密和安全方面好像没有放在一起的对比评测,但 OpenVPN 有权威的安全审计,WireGuard 使用了分析工具 Tamarin 进行协议验证,Shadowsocks 在安全方面有争议也有不断改进,GoVPN 用户很少,开发者在默默无闻的开发。

这几款翻墙软件共存在同一台服务器并不会占用过多服务器资源,但可以充分应付不同客户端的使用场景,如移动设备,Android TV,路由器设备和桌面系统都有对应的解决方案。

Shadowsocks 和 OpenVPN 有无数种安装和使用方法,Google 搜索有很多结果。

WireGuard 和 GoVPN 也能 Google 搜索到一些非常可行的参考内容,或者参考在 Steemit 发布的内容:

Ubuntu 安装部署 GoVPN,建立突破网络封锁和审查的 VPN 隧道 https://steemit.com/govpn/@curl/ubuntu-govpn-vpn

在 Ubuntu 部署 VPN 隧道 WireGuard https://steemit.com/cn/@curl/ubuntu-vpn-wireguard

Shadowsocks, WireGuard, GoVPN, OpenVPN 这几款翻墙软件共存在同一台服务器 — Steemit