目录
使用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