一、首先购买一个海外vps ,安装centos7系统
VPS有:BandwagonHost,dataocean,vultr,linode。选择服务器地址时,可以先测试一下速度,选速度快的机房。
二、登录vps 并加固
1、利用SSH远程 登入 centos7,方便后续操作。(有些vps的ip可能被屏蔽了,所以需要换一个vps试试看)
SSH远程连接入门
2、加固 centos7 安全性:
(1)、更新centos7系统。
(2)、解决系统编码问题。
(3)、开启 防火墙。
systemctl start firewalld
3、安装VNC软件,进行远程访问。(可选操作,如果不适应用命令行操作,可以借助vnc 进行远程桌面操作)
(为了提高安全性,使用SSH端口转发,登入服务器)
vnc远程连接配置与入门
三、安装shadowsocks服务端
我们安装的是python版本的。因为centos7 默认自带了 python,所以不需要安装了。如果没有安装的话,可以运行
yum install python
这样子 也可以检查出,是否安装了python。
安装 pip :
1、可以用 VNC 远程登录 vps 主机,然后用浏览器 下载 pip 安装包。
下载页面:https://pypi.org/project/pip/9.0.1/
文件链接地址:https://files.pythonhosted.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz
为什么不选最新版,因为最新版pip 和 python 有一点 兼容性问题。
也可以在SSH中用命令行的方式 下载文件:
curl https://files.pythonhosted.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz -o pip.tar.gz --progress
文件下载完,可以用 VNC 桌面方式进行 解压。或者 在 SSH 中 用命令行 进行解压。
tar zxvf pip-9.0.1.tar.gz -C /root/mydir
将文件 解压到了mydir目录下面。
解压完成后,进入 mydir 文件夹。可以用vnc 直接进入。也可以用命令行
cd /root/mydir
只有进入到 mydir文件夹以后,下面的安装才能成功。
在SSH下或者vnc的终端运行命令行:
python setup.py install
(其实 用命令行 可以直接装 pip,但是安装的是最新版的pip,好像与python存在兼容性问题)
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" python get-pip.py
2.安装 shadowsocks
在SSH或者VNC的终端下运行如下代码:
安装 加密软件 库 用于支持 aes-256-gcm 加密方式 (带#的,都是注释,不需要打 ) yum install epel-release yum install libsodium 安装 或升级 最新 软件 版本 pip install --upgrade git+https://github.com/shadowsocks/shadowsocks.git@master
3.配置shadowsocks
SSH下:
[bash] # 创建 /etc/shadowsocks.json vim /etc/shadowsocks.json [/bash]
上面就创建了配置文件,然后用 vim 编辑 下面内容就行了。
{
"server": "0.0.0.0",
"server_port": 3678,
"password": "sdfsndsfoni",
"method": "aes-256-cfb"
}
多余多个端口可以如下:(顺便说了一下,可以添加PID_FILE和LOG_FILE)
pidfile
{
"server": "0.0.0.0",
"port_password": {
"8850":"hehe2016"
},
"method": "aes-256-gcm",
"PID_FILE": "/var/run/shadowsocks_ssserver.pid",
"LOG_FILE": "/var/run/shadowsocks_ssserver.log"
}
添加PID_FILE,是因为 执行下面这句话时,需要PID 文件,否则会报错。
ssserver -c /etc/shadowsocks.json -d stop
这个时候,服务器就可以使用了:
##### 开启 shadowsocks 服务 ssserver -c /etc/shadowsocks.json -d stop ##### 关闭 shadowsocks 服务 ssserver -c /etc/shadowsocks.json -d start
后面提到的shadowsocks.service是另一种启动方式。
##### 查看 shadowsocks 状态 #####(如果 我用ssserver -c /etc/shadowsocks.json -d start 启动,那么这里查看的启动状态是 dead 的,两种启动方法 应该隶属于 不同的管理方式中) systemctl status shadowsocks ##### 启动 shadowsocks 服务 systemctl start shadowsocks ##### 关闭 shadowsocks 服务 systemctl stop shadowsocks
注意: 加密方式(method),密码(password),服务器端口(server-port)都可以自己设置,只要客户端相同就行。服务器端口 1024以下是系统保留的,从1024-65535是用户使用的。密码 建议选择 aes 系列。method为加密方法,可选aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb, rc4-md5, chacha20, salsa20, rc4, table
vim编辑器用法可以查看:vim入门基础
VNC桌面环境就直接创建json文件就行了。
4.配置开机自启动。SSH和VNC操作都行。
新建启动脚本文件/etc/systemd/system/shadowsocks.service,内容如下:
[Unit] Description=Shadowsocks [Service] TimeoutStartSec=0 ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json [Install] WantedBy=multi-user.target
然后 , 在SSH或者VNC终端下:输入命令
systemctl enable shadowsocks systemctl start shadowsocks
为了检查 shadowsocks 服务是否已成功启动,可以继续执行以下命令查看服务的状态:
systemctl status shadowsocks -l
如果服务启动成功,则控制台显示的信息可能类似这样:
● shadowsocks.service - Shadowsocks Loaded: loaded (/etc/systemd/system/shadowsocks.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2015-12-21 23:51:48 CST; 11min ago Main PID: 19334 (ssserver) CGroup: /system.slice/shadowsocks.service └─19334 /usr/bin/python /usr/bin/ssserver -c /etc/shadowsocks.json Dec 21 23:51:48 morning.work systemd[1]: Started Shadowsocks. Dec 21 23:51:48 morning.work systemd[1]: Starting Shadowsocks… Dec 21 23:51:48 morning.work ssserver[19334]: INFO: loading config from /etc/shadowsocks.json Dec 21 23:51:48 morning.work ssserver[19334]: 2015-12-21 23:51:48 INFO loading libcrypto from libcrypto.so.10 Dec 21 23:51:48 morning.work ssserver[19334]: 2015-12-21 23:51:48 INFO starting server at 0.0.0.0:8388
不过此时还连接不上服务器,因为CentOS 7默认防火墙是阻止SS端口的,这里需要放行SS端口,由于CentOS 7的防火墙升级为Firewall了,操作方式与之前的iptables有所不同(3678为文中shadowsocks服务器配置端口号,这里要改为你安装SS时设置的端口):
firewall-cmd –permanent –add-port=3678/tcp
firewall-cmd –reload
四、安装kcp加速插件
由于原生shadowsocks速度慢,所以用kcp 插件加速。
访问链接,选择linux-amd64 下载,centos7系统 是 64位的linux系统。
https://github.com/shadowsocks/shadowsocks-windows/releases
解压后有两个文件,其中类似server_linux_amd64这样的文件就是服务端程序了,另一个类似client_linux_amd64的就是客户端程序了。如果客户端在Windows上使用要下载Windows版本的哦。
SSH 里面可以用 tar命令进行解压(前面解压pip文件已经提到过了), ls 命令可以查看 当前目录所有文件 cd 命令表示进入某目录。可以搜索一下bash常用命令操作。
VNC里面直接可视化操作就行了。
先来创建服务端配置文件,创建开机启动项如下供参考:
[bash] vim /etc/systemd/system/kcptun.service [/bash]
然后 配置启动文件如下:
[Unit] Description=kcptun [Service] TimeoutStartSec=20 ExecStart=/usr/bin/server_linux_amd64 -t "0.0.0.0:3678" -l ":5678" -mode fast2 [Install] WantedBy=multi-user.target
其中TimeoutStartSec为延时启动的时间,这里由于需要等待ShadowSocks启动完成后再启动,所以配置20秒的延迟。ExecStart后的server_linux_amd64为你刚刚下载的文件的位置,建议放到相应的文件夹以便管理。-t后的是服务器的IP和ShadowSocks服务的端口,这里IP配置为本机IP即可。-l表示KCP服务使用的端口,-mode表示速度的模式,从快到慢依次是fast3 > fast2 > fast > normal > default,fast3一般用于游戏,不想要任何的延迟(no lag),但这也意味浪费的流量会增多,这里我选择fast2就够用了。
[bash] systemctl daemon-reload # 创建开机启动 systemctl enable kcptun # 启动kcp服务。 systemctl start kcptun # 防火墙 开放 kcp 端口 (kcp 是 udp 协议,shadowsocks 是tcp协议) firewall-cmd –permanent –add-port=5678/udp # 防火墙 重新 加载 配置 firewall-cmd –reload [/bash]
五、安装客户端
安卓版本:(个人用 3.3.1 版本,因为 好像 不需要 google play 插件吧。并且内置kcp 插件)
https://github.com/shadowsocks/shadowsocks-android/releases
windows版本:
https://github.com/shadowsocks/shadowsocks-windows/releases
需要下载kcp客户端单独进行集成。(Windows-386 32位系统,Windows-amd64 64位系统)
https://github.com/xtaci/kcptun/releases
集成方法可以参考链接:
(总体思路是本地shadowsocks先连接本地的kcptun,然后kcptun 连接 代理服务器的 kcptun,
接着 代理服务器的kcptun 连接 代理服务器的 shadowsocks)
https://blog.csdn.net/farawayzheng_necas/article/details/63255799
mac版本:(内置kcp插件)
https://github.com/shadowsocks/ShadowsocksX-NG
ios版本:
因为大陆已经下架,需要在其他地区搜索:Shadowrocket 等 支持shadowsocks的 应用软件。
之前3.几的安卓客户端,kcp与客户端是集成的,配置文件中,shadowsocks服务器端口就填shadowsocks端口。kcp配置:需要配置kcp端口,kcp参数:
--crypt aes-192 --key "hello"
到了安卓4.x版本,kcp是插件化了。无法启动kcp,可能是1、shadowsocks卸载重装2、手机管家的自启动的链式启动,允许kcptun。
如果要添加kcp插件,那么shadowsocks的端口就要填 kcp的端口,kcp的插件需要配置:[注意与3.x的配置不同,这里的密码,不再需要添加引号了]
key=hello;crypt=aes-192
六、安装obfs 混淆,这个只能与 kcp 二选一
服务器:centos
sudo yum install gcc autoconf libtool automake make zlib-devel openssl-devel asciidoc xmlto git clone https://github.com/shadowsocks/simple-obfs.git cd simple-obfs git submodule update --init --recursive ./autogen.sh ./configure && make sudo make install ### 会报错 缺少 libev,于是 猜测 shadowsocks libev版本有, ### 于是安装 shadowsocks libev 的依赖库 yum install gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto c-ares-devel libev-devel libsodium-devel mbedtls-devel -y
服务器配置:
因为是独立模式:vim /etc/systemd/system/obfs-server.service
[Unit] Description=Simple-obfs After=network.target [Service] Type=simple-obfs User=nobody CapabilityBoundingSet=CAP_NET_BIND_SERVICE ExecStart=/usr/local/bin/obfs-server -s 0.0.0.0 -p 443 --obfs tls -r 127.0.0.1:8866 [Install] WantedBy=multi-user.target
监听 1024以下端口 需要 root 用户权限,所以采用下面的方法:(应该是绑定服务吧)
setcap cap_net_bind_service=+ep /usr/local/bin/obfs-server
### 最后更新服务并启动: sudo systemctl enable obfs-server sudo systemctl daemon-reload sudo systemctl restart obfs-server
特别注意:复制粘贴时的 问题:【正常情况应该不会出现这个问题,然后我把vim后面的空格给删了,然后用打了一个空格,结果就好了,可以新建文件了】
[root@superguy ~]# vim /etc/systemd/system/obfs-server.service -bash: vim /etc/systemd/system/obfs-server.service: No such file or directory
这里有编译好的软件可直接放到目标位置 obfs-local 和 obfs-server
有可能 443端口被占用了,导致绑定出错,可以换其他端口再重试。
# 查看端口被占用方法
lsof -i:443
客户端:因为是集成插件模式:
1、客户端连接 服务器 端口 就是 443
2、指定 插件为: obfs-local【有些地方填:simple-obfs】 ; 并配置插件参数 ,如下面的示例。
--plugin-opts "obfs=tls;obfs-host=www.bing.com"
备注:obfs 类型有 tls和http 主要是 服务器 和客户端 类型要统一。
参考教材:
###Plugin mode with shadowsocks ###Add respective item to --plugin and --plugin-opts arg or as value of plugin and plugin_opts in JSON. ### On the client: ss-local -c config.json --plugin obfs-local --plugin-opts "obfs=http;obfs-host=www.bing.com" ### On the server: ss-server -c config.json --plugin obfs-server --plugin-opts "obfs=http" ### Standalone mode ### On the client: obfs-local -s server_ip -p 8139 -l 1984 --obfs http --obfs-host www.bing.com ss-local -c config.json -s 127.0.0.1 -p 1984 -l 1080 ### On the server: obfs-server -s server_ip -p 8139 --obfs http -r 127.0.0.1:8388 ss-server -c config.json -s 127.0.0.1 -p 8388
七、nginx与shadowsocks共用443端口伪装
1、shadowsocks 转发给 nginx
最近突发奇想把网站改为https,不可避免的遇到了与shadowsocks的443端口冲突问题(443端口不容易被检出)。废了好大劲才发现原来ss的simple-obfs已经带有非ss流量转发功能。
shadowsocks
# HTTP only with plugin mode ss-server -c config.json --plugin obfs-server --plugin-opts "obfs=http;failover=example.com:80" # Both HTTP and HTTPS with standalone mode obfs-server -s server_ip -p 80 --obfs http -r 127.0.0.1:8388 --failover example.com:80 obfs-server -s server_ip -p 443 --obfs tls -r 127.0.0.1:8388 --failover example.com:443 # suppose you have an HTTP webserver (apache/nginx/whatever) listening on localhost:8080 and HTTPS on 8443 # (you probably shouldn't expose these ports) obfs-server -s server_ip -p 80 --obfs http -r 127.0.0.1:8388 --failover 127.0.0.1:8080 obfs-server -s server_ip -p 443 --obfs tls -r 127.0.0.1:8388 --failover 127.0.0.1:8443
这样便将web流量转发到了8443端口
nginx
user xx xx;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
types_hash_max_size 1024;
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri; #redir to https
# #charset koi8-r;
# #access_log logs/host.access.log main;
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root /usr/share/nginx/html;
#}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
server {
listen 8443 ssl http2;
server_name localhost;
ssl_certificate /etc/letsencrypt/live/cclin.net/fullchain.pem; #managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/cclin.net/privkey.pem; #managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
uwsgi_pass 127.0.0.1:3031;
include uwsgi_params;
}
}
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
}
}
2、利用nginx转发到shadowsocks
下面的方法 可以 ,即访问网站,同时又 ss。 也就是说 simple-obfs 支持 http代理 转发
server {
listen 80;
server_name localhost;
# server_name www.huaijiujia.com;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
if ($http_upgrade = "websocket") {
proxy_pass http://127.0.0.1:8443;
}
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "upgrade";
}
…..
}
下面的 方法 不行,只能访问 网路,但是无法 使用 ss。也就是说 simple-obfs 不支持 tls 代理 转发
server {
listen 443 default_server;
server_name _;
ssl_certificate https_cert/huaijiujia_ca_chained.crt;
ssl_certificate_key https_cert/huaijiujia_private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
# return 404;
# return 301 https://www.amazon.com;
location = / {
if ($http_upgrade = "websocket") {
proxy_pass https://127.0.0.1:8443;
}
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "upgrade";
}
return 301 https://www.amazon.com;
}
因为,安卓手机的功能不完善,不完全支持 simpobfs功能,所以需要重新下个 改进版的。点击下载: Simple-obfuscation-fix
补充:
如果 shadowsocks需要支持 aes-256-gcm加密的话:
For CentOS 7, if you need AEAD ciphers(支持aes-256-gcm加密), you need install libsodium
yum install libsodium python34-pip pip3 install git+https://github.com/shadowsocks/shadowsocks.git@master