User:光速火箭/OpenVPN + sniproxy搭建加速器教程

来自魔法纪录中文Wiki
跳转至: 导航 搜索

使用OpenVPN + sniproxy (适用于Debian/Ubuntu)

小科普:OpenVPN是一种开放的VPN协议,功能强大,可以根据IP地址来判定是否通过代理。一般来说,普通的路由器不会过滤掉OpenVPN的包,但是由于特征明显,OpenVPN早已无法用于翻墙。sniproxy是一种基于https的代理。由于你游实质上是一个网页游戏,因此只要对网页做代理就可以了,而sniproxy就是做这个的。

本教程无关翻墙,如果把本教程运用在境外服务器上,后果自负(OpenVPN很容易被检测出来,请勿作死)

docker的安装

首先要卸载旧版的docker(如果有)

$ sudo apt-get remove docker docker-engine docker.io

解释: $ 指的是你的shell在普通权限下运行,不用复制进去。sudo代表用等同于root的权限执行。apt-get是Debian/Ubuntu发行版用于管理软件包的命令,remove是apt-get中用于卸载的参数。后面三个是旧版的docker程序。

之后安装这些软件包

$ sudo apt-get update
$ sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common

解释: update是apt-get中用于更新列表的参数。“\”用于换行。

接下来添加docker的GPG key

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -

解释: curl用于从互联网上获取文件并将其在屏幕上打印出来。“|”是管道,用于在两个命令之间传输信息。apt-key用于管理apt的密钥。mirrors.ustc.edu.cn是中国科大的开源镜像站,如果你的服务器靠近北京,可以改为清华大学的镜像mirrors.tuna.tsinghua.edu.cn。如果你用的是Ubuntu,请将debian改为ubuntu。

接下来添加软件源

$ sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
   $(lsb_release -cs) \
   stable"

解释:lsb_release用于获取你当前系统的版本号。如果你用的是Ubuntu,请将debian改为ubuntu。

接下来安装docker

$ sudo apt-get update
$ sudo apt-get install docker-ce

接下来测试docker是否正常安装

$ sudo docker run hello-world

如果出现

Hello from Docker!
This message shows that your installation appears to be working correctly.

及下面一堆内容,则表面docker已经正常安装。

如果你的机器访问国外较慢,可以编辑/etc/docker/daemon.json。在其中加入

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}

重新启动docker

$ sudo systemctl reload docker

解释:systemctl是用于控制系统服务的程序。清华大学没有提供Docker Hub的源,因此这里使用中国科大的。


sniproxy的配置

先在本地加一个监听用的IP地址

$ sudo ip a add 192.168.142.1 dev lo

解释:ip是linux系统上用于配置网络的命令。dev是设备名,lo指本地环回。192.168.142.1可以更换成任意的内网地址。

创建运行的目录

$ sudo mkdir /srv/docker
$ sudo mkdir /srv/docker/sniproxy
$ sudo mkdir /srv/docker/sniproxy/conf
$ sudo mkdir /srv/docker/sniproxy/log

解释:mkdir相当于windows系统上的md,用于创建目录。

接下来创建/srv/docker/sniproxy/conf/sniproxy.conf

$ sudo vim /srv/docker/sniproxy/conf/sniproxy.conf

点击a可以开始编辑,ESC键可以退出编辑。退出编辑之后,ZZ命令是保存。如果你没有编辑,可以用:q退出。如果你不想保存编辑的内容,请使用:q! 在其中写入

resolver {
    nameserver 106.186.17.181
    mode ipv4_first
}

access_log {
    filename /var/log/sniproxy_access.log
}

listen 192.168.142.1:80 {
    proto http
    table all
    source 172.19.121.21
}

listen 192.168.142.1:443 {
    proto tls
    table all
    source 172.19.121.21
}

table all {
    .* *
}

解释:nameserver指的是DNS服务器。202.38.93.153是中国科大提供的。如果你的服务器靠近北京,请使用清华大学提供的101.6.6.6。listen是监听的地址,请使用你刚才添加的IP地址。source指的是外接网卡的IP地址,172.19.121.21是笔者的机器,请更换为你的云服务器的IP。可以使用ip a来查看。注:因为科大和清华的DNS解析出来的你游地址是香港的,而阿里云和腾讯云到香港会绕日本,因此改用OpenNIC的日本DNS 106.186.17.181

就绪之后,就可以运行了。

$ sudo docker run -itd \
        --restart=always \
        --name=sniproxy \
        --net=host \
        -v /srv/docker/sniproxy/conf:/etc/sniproxy \
        -v /srv/docker/sniproxy/log:/var/log \
        gaoyifan/sniproxy

解释:--name是你这个实例的名字。-v指的是真实环境到docker虚拟出来的环境的映射。gaoyifan/sniproxy是docker的镜像名称。

检查运行状态

$ sudo docker ps

如果看到STATUS一栏是Up多少时间,那么表面sniproxy运行成功了

如果想要停止运行,则可以使用

$ sudo docker rm sniproxy

bind9的配置

前面已经配置完代理了,现在要将访问指向这个代理,那么就需要用bind9来做了。

$ sudo mkdir /srv/docker/bind

在本地增加一个IP地址用于bind9的监听

$ sudo ip a add 192.168.142.254 dev lo

拉取bind的配置

$ git clone https://github.com/yangzhaofeng/bind-magireco.git

/srv/docker/bind/named.conf.options中的配置改为

options {
        directory "/var/cache/bind";
        forwarders {
                101.6.6.6;
        };
        dnssec-validation no;
        auth-nxdomain no;
        listen-on {
                192.168.142.254;
        };
        response-policy { zone "rpz"; };
};

/etc/bind/named.conf.local中的配置改为

zone "rpz" {
        type master;
        file "/etc/bind/db.rpz";
        allow-query { none; };
};

编辑 /etc/bind/db.rpz

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1

*.magi-reco.com                 A       192.168.142.1

启动bind9

$ sudo docker run -itd \
	--restart=always \
	--name=bind9 \
	--net=host \
	--privileged \
	-v /srv/docker/bind:/etc/bind \
	yangzhaofengsteven/bind9

查询一次DNS

$ dig @192.168.142.254 android.magi-reco.com

如果返回的结果含有

;; ANSWER SECTION:
android.magi-reco.com.  5       IN      A       192.168.142.1

则说明配置成功。

这样,sniproxy的配置就完成了。

OpenVPN的配置

安装easyrsa

sudo apt-get install easy-rsa

创建密钥对

$ sudo mkdir /srv/docker/openvpn/
$ sudo cp -r /usr/share/easy-rsa/ /srv/docker/openvpn/

编辑/srv/docker/openvpn/easy-rsa/vars,将密钥信息改为下面的内容

export KEY_COUNTRY="CN"
export KEY_PROVINCE="Shanghai"
export KEY_CITY="Shanghai"
export KEY_ORG="None"
export KEY_EMAIL="steve@example.com"
export KEY_CN=MyVPN
export KEY_ALTNAMES=AltMyVPN
export KEY_NAME=MyVPN
export KEY_OU=MyVPN

上述内容全部都可以自定义,但是建议填写服务器所在地的城市和你自己的邮件地址

接下来就可以创建密钥对了

$ cd /srv/docker/openvpn/easy-rsa/
# source vars
# ./clean-all
# ./build-ca
# ./build-key-server server
# ./build-dh
$ cd keys/
$ sudo cp server.crt server.key ca.crt dh2048.pem /srv/docker/openvpn/

服务器的密钥对就创建好了。

接下来创建客户端的密钥对。

$ cd /srv/docker/openvpn/easy-rsa/
# source vars
# ./build-key client1

/srv/docker/openvpn/ca.crt/srv/docker/openvpn/easy-rsa/keys/client1.crt/srv/docker/openvpn/easy-rsa/keys/client1.key就是客户端所需要用到的密钥文件。建议给每一个使用者都创建一个密钥对

修改配置文件和系统配置

接下来编辑/srv/docker/openvpn/server.conf

port 1194

;proto tcp
proto udp

;dev tap
dev tun

ca ca.crt
cert server.crt
key server.key

dh dh2048.pem

topology subnet

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "route 10.8.0.0 255.255.255.0"
push "route 192.168.142.0 255.255.255.0"

push "dhcp-option DNS 192.168.142.254"

push "block-outside-dns"

;client-to-client

duplicate-cn

keepalive 10 120

persist-key
persist-tun

;status openvpn-status.log

log		openvpn.log
log-append	openvpn.log

verb 3

分号代表不会读取之后的内容。可以根据自己的需要将分号去掉。比如你还需要组建局域网打游戏,可以将client-to-client前的分号去掉。

创建日志目录

$ sudo mkdir /var/log/openvpn/

编辑/etc/sysctl.conf 确保

net.ipv4.ip_forward=1

前面没有“#”,以及后面的数字是1

重新加载sysctl

$ sudo sysctl -p

接下来启动OpenVPN服务

$ docker run -itd \
	-v /srv/docker/openvpn/:/etc/openvpn/:ro \
	-v /var/log/openvpn:/var/log/openvpn \
	--net=host \
	--restart=always \
	--privileged \
	--name=openvpn \
	--sysctl net.ipv6.conf.all.disable_ipv6=0 \
	yangzhaofengsteven/docker-openvpn \
	/usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf

客户端的配置

读取服务器上的/srv/docker/openvpn/ca.crt/srv/docker/openvpn/easy-rsa/keys/client1.crt/srv/docker/openvpn/easy-rsa/keys/client1.key

本地的client1.ovpn里面这样写

client

proto udp

remote 你的服务器的公网IP 1194

nobind

persist-key
persist-tun

dev myvpn
dev-type tun

<ca>
ca.crt中的全部内容
</ca>

<cert>
client1.crt中的全部内容
</cert>

<key>
client1.key中的全部内容
</key>

这样客户端的配置文件就写好了。

iOS的用户请在此处下载OpenVPN客户端(需要非中国区的Apple ID)。

安卓的应用分为社区维护的版本公司维护的版本。两个版本都是开源的。没有Google play的QB可以在这里下载社区版的OpenVPN应用。

使用模拟器的用户可以在这里找到Windows版OpenVPN的下载。

一键安装

如果你使用debian系统,我已经写好了一键安装的脚本

$ git clone https://github.com/yangzhaofeng/install-ovpn-sni-debian.git
$ cd install-ovpn-sni-debian
$ sudo ./install.bash