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

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@curl·
0.000 HBD
Ubuntu 安装部署 GoVPN,建立突破网络封锁和审查的 VPN 隧道
## 关于 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 操作系统参见:<a href="https://steemit.com/cn/@curl/arch-linux-govpn-vpn">Arch Linux 安装部署 GoVPN 客户端,建立突破网络封锁和审查的 VPN 隧道</a>

服务器(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
👍 , , , ,