安装Shadowsocks-libev、Nginx、acme.sh SSL认证;使用 v2ray-plugin 协议
云服务商提前做好DNS解析域名到VPS
数据包的流向
{浏览器} <--socks--> {SS客户端+v2ray-plugin} <--websocket+tls--> {服务器nginx} <--> {SS服务端+v2ray-plugin} <--> {目标网站}
SS v2ray-plugin 也是可以不使用nginx做转发, 直接到SS服务端, 证书需要直接添加到SS服务端, 和上面稍有区别
{浏览器} <--socks--> {SS客户端+v2ray-plugin} <--websocket+tls--> {SS服务端+v2ray-plugin} <--> {目标网站}
1,安装Nginx
Debian及Ubuntu添加Nginx官方源
和CentOS类似,我们也需要更改系统的源仓库文件,只是我们按照习惯,可以不用新建文件,直接在现有的源仓库文件上添加两行就行了。
用编辑器打开/etc/apt/sources.list\,Debian添加如下内容:
deb http://nginx.org/packages/debian/ codename nginx
deb-src http://nginx.org/packages/debian/ codename nginx
Ubuntu添加如下内容:
deb http://nginx.org/packages/ubuntu/ codename nginx
deb-src http://nginx.org/packages/ubuntu/ codename nginx
然后根据实际发行版代号,替换上面的code\为实际的发行版代号,相关代号可以用命令cat /etc/os-release\查询得到。
添加完成之后,还需要添加Nginx官方的Key,不然会提示Key错误,命令如下:
wget https://nginx.org/keys/nginx_signing.key -O /tmp/nginx_signing.key
apt-key add /tmp/nginx_signing.key
添加完成之后,要先更新仓库源信息才能安装Nginx:
apt-get update
apt upgrade nginx
安装之后,可以通过如下命令查看Nginx的版本:
nginx -v
1.1创建Web目录
所有的网站将会存放到 /var/www 下, example网站将会存放到 /var/www/example下面。
mkdir /var/www
mkdir /var/www/example
1.2修改nginx服务器配置文件
这里使用了nano编辑器,如何没有安装可以使用 apt-get install nano 安装,或者使用你喜欢的 vim编辑器。
nano /etc/nginx/nginx.conf
# user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 3000;
multi_accept on;
}
http {
##
# Basic Settings
##
aio threads;
sendfile on;
tcp_nopush on;
charset UTF-8;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings: nginx访问日志存放地址
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings: 开启gip压缩
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
#注释掉默认的引用文件
#include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
#****************************OnceAI***************************
# default_server 代表默认服务器
# 比如从IP访问时,并没有匹配 onceai.com 的域名,但也会代理到 /var/www/onceai 网站目录
# 如果去掉 default_server,此服务器将只会处理onceai.com域名的请求,
# 请将onceai.com换成你自己的域名。
#**************************************************************
server {
listen 80 default_server;
server_name xxxxxx;
location / {
root /var/www/example;
index index.html;
}
}
}
1.3 测试nginx配置文件
nginx -t -c /etc/nginx/nginx.conf
1.4 测试通过,重启nginx服务器
/etc/init.d/nginx restart
1.5 创建默认 index.html 网页
nano /var/www/example/index.html
#可以写入文字在主页显示,必须是index.html名称
使用公网IP域域名访问测试你的服务器,查看 index.html 是否显示
2,申请ssl证书
2.1 安装 acme.sh
安装很简单, 一个命令:
curl https://get.acme.sh | sh
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
~/.acme.sh/
创建 一个 bash 的 alias, 方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
2.2 生成证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.
http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
acme.sh --issue -d xxxxxx --webroot /var/www/example --keylength ec-256
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
Nginx 的配置 ssl_certificate
使用 fullchain.cer
,而非 /etc/nginx/ssl/.cer
,否则 SSL Labs 的测试会报 Chain issues Incomplete
错误。
2.3 修改 /etc/nginx/nginx.conf 为 443 SSL 协议
在1.2的基础上主要修改server部分,修改结果如下。可以全部替换上面写的
nano /etc/nginx/nginx.conf
# user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
charset UTF-8;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings: nginx访问日志存放地址
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings: 开启gip压缩
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
#注释掉默认的引用文件
#include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
#****************************OnceAI***************************
# default_server 代表默认服务器
# 比如从IP访问时,并没有匹配 onceai.com 的域名,但也会代理到 /var/www/onceai 网站目录
# 如果去掉 default_server,此服务器将只会处理onceai.com域名的请求,
# 请将onceai.com换成你自己的域名。
#**************************************************************
server {
listen 443 ssl http2 reuseport fastopen=256;
listen [::]:443 ssl http2 reuseport fastopen=256;
ssl_certificate /root/.acme.sh/xxxxxx/fullchain.cer;
ssl_certificate_key /root/.acme.sh/xxxxxx/xxxxxx.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:40m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
#ssl_dhparam /etc/nginx/nginx.pem;
resolver 127.0.0.1;
resolver_timeout 10s;
server_name xxxxxx;
#add_header alt-svc 'quic=":443"; ma=2592000; v="46"';
#add_header X-Frame-Options SAMEORIGIN always;
#add_header X-Content-Type-Options "nosniff" always;
#add_header X-XSS-Protection "1; mode=block" always;
#add_header Referrer-Policy "no-referrer";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
#add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://ssl.google-analytics.com https://assets.zendesk.com https://connect.facebook.net; img-src 'self' https://ssl.google-analytics.com https://s-static.ak.facebook.com https://assets.zendesk.com; style-src 'self' https://fonts.googleapis.com https://assets.zendesk.com; font-src 'self' https://themes.googleusercontent.com; frame-src https://assets.zendesk.com https://www.facebook.com https://s-static.ak.facebook.com https://tautt.zendesk.com; object-src 'none'";
#add_header Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr none;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;";
#if (\$http_user_agent ~* (wget|curl) ) { return 403; }
#if (\$http_user_agent = "") { return 403; }
location / {
root /var/www/example;
index index.html;
}
location /v2ray { #/ws为v2ray路径,随便填写比如/v2ray/,但要记住后面要用
if ($http_upgrade != "websocket") {
return 301 https://www.12306.cn/index/;
}
proxy_redirect off;
proxy_pass http://127.0.0.1:8008; #你的v2ray入站端口,随意设置,要记住后面要用
proxy_http_version 1.1; #websocket还是http1.1的,但在服务器内部进行,几乎没有影响啦~
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}
server {
listen 80;
listen [::]:80;
server_name xxxxxx;
return 301 https://xxxxxx;
}
}
#测试并重启
nginx -t -c /etc/nginx/nginx.conf
/etc/init.d/nginx restart
3, 更新 acme.sh
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
升级 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手动升级, 可以开启自动升级:
acme.sh --upgrade --auto-upgrade
之后, acme.sh 就会自动保持更新了.
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
4,安装原始版本shadowsocks-libev 最新版
4.1采用官方推荐方法,较为繁琐
安装 snap(一种沙盘包安装方式,不用编译)
sudo apt update
sudo apt install snapd
sudo snap install core
安装 ss-libev
sudo snap install shadowsocks-libev
配置 ss-libev
配置文件 config.json 放在 /snap/bin/ 中
nano /snap/bin/config.json
配置文件
{ "server": ["::0", "0.0.0.0"], #ipv6,ipv4两种接入方式 "nameserver": "1.1.1.1", "server_port": 443, "password": "xxxxx", "method": "rc4-md5", "no_delay": true, "reuse_port": true, "timeout": 600, #公共代理,需要低一些 "mode": "tcp_and_udp", #如果发现运营商Qos,可以设置成tcp "plugin":"/var/snap/shadowsocks-libev/common/v2ray-plugin", #不使用v2ray-plugin,要删除 "plugin_opts":"server;path=/v2ray;host=xxxxxx;loglevel=none" #不使用v2ray-plugin,要删除 } #其他设置说明在https://wiki.archlinux.org/index.php/Shadowsocks_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
可以选择的加密方式: rc4-md5,
aes-128-gcm, aes-192-gcm, aes-256-gcm, aes-128-cfb, aes-192-cfb, aes-256-cfb, aes-128-ctr, aes-192-ctr, aes-256-ctr, camellia-128-cfb, camellia-192-cfb, camellia-256-cfb, bf-cfb, chacha20-ietf-poly1305, xchacha20-ietf-poly1305, salsa20, chacha20 and chacha20-ietf. The default cipher is aes-256-gcm.
对于科学上网,TFO(fast_open)不建议开启(指的是客户端不开启,服务器端可以开启)。根据 [shadowsocks-libev](https://github.com/shadowsocks/shadowsocks-libev/issues/1669) 的反馈,TFO在中国移动数据网络下不能正常工作,而且长城防火墙会识别和丢弃TFO的包,开启TFO只会自找麻烦。
#### 4.2安装 Golang最新版
snap install go —classic
永久修改当前用户PATH
nano ~/.bashrc
最后一行添加以下命令
export PATH=”$PATH:/snap/bin”
关闭保存,执行以下命令生效:
```bash
source ~/.bashrc
go version #检查版本
4.3 编译安装最新v2ray-plugin
git clone https://github.com/shadowsocks/v2ray-plugin.git
cd v2ray-plugin
go mod download
go build
cp v2ray-plugin /var/snap/shadowsocks-libev/common/v2ray-plugin
#snap包安装完成后,它的文件系统被划分为只读和可读写的两种不同权限的区域,一般情况下只读区域为/snap/xxxxx目录,可读写区域就是/var/snap/xxxx/common/
4.4 验证配置全部正确
/snap/bin/shadowsocks-libev.ss-server -c /snap/bin/config.json
#没有tls命令,因为nginx已经使用tls,但客户端需要有tls,看后续步骤
建立systemd 启动管理项目
nano /lib/systemd/system/shadowsocks-libev.service
#填入以下内容保存
[Unit]
Description=shadowsocks-libev
After=network.target
[Service]
ExecStartPre=/bin/sh -c 'ulimit -n 51200'
ExecStart=/snap/bin/shadowsocks-libev.ss-server -c /snap/bin/config.json
Restart=on-abort
[Install]
WantedBy=multi-user.target
#如果使用ipv6(参考https://maofun.com/1496.html),需要将ExecStart=/snap/bin/shadowsocks-libev.ss-server -c /snap/bin/config.json 改成ExecStart=/snap/bin/shadowsocks-libev.ss-server -c /snap/bin/config.json -6。打开https://www.google.com/search?hl=en&q=what+is+my+ip,如果显示的您的 IP 地址为 IPv6 格式说明您是以 IPv6 的形式接入的,否则为 IPv4 形式
#-6 也可以使用DAEMON_ARGS参数设置,不能在json文件中添加
然后必须
systemctl enable shadowsocks-libev.service
#Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系
#systemctl cat命令可以查看配置文件的内容
systemctl cat shadowsocks-libev.service
systemctl restart shadowsocks-libev.service
systemctl status shadowsocks-libev.service
#status必须显示active,否则找错误
#systemctl stop shadowsocks-libev.service
如果修改了shadowsocks-libev.service,需要执行
# 重新加载配置文件
systemctl daemon-reload
# 重启相关服务
systemctl restart shadowsocks-libev.service
5, 替换锐速内核
推荐bbrplus旧版,卸载内核
wget -N --no-check-certificate "https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcp.sh" && chmod +x tcp.sh && ./tcp.sh
需要重启一次,再进入脚本./tcp.sh
开启锐速,然后选择加速核心和优化系统2个选项,再重启。
6, 保护shadowsocks,防止被嗅探(适合固定ip访问)
设置理由:
https://gfw.report/blog/gfw_shadowsocks/zh.html
具体操作方法你可以使用iptables命令:
禁止所有人访问你的ss 443端口
iptables --append INPUT --protocol tcp --dport 443 --jump DROP
这条命令的意思是仅允许1.1.1.1访问你ss 443端口
iptables --append INPUT --protocol tcp --src 1.1.1.1 --dport 443 --jump ACCEPT
#或者选择ip段,http://ip.bczs.net/和http://apps.neu.edu.cn/netaggr/
iptables --append INPUT --protocol tcp --src 0.0.0.0/10 --dport 443 --jump ACCEPT
查看443端口连接ip状态命令
ss -o state established '( sport = :http or sport = :https )'
查看iptables规则
命令后面的line-number为显示行号(将规则一则一则输出,并显示行号),可选,方便后文的删除指令。
iptables -L -n --line-numbers
清除已有iptables规则
iptables -F
7, 客户端使用
客户端要选择tls,但不需要加载证书,因为nginx已经使用tls协议,注意Path 填写/v2ray,下边为例子。
由于最常用的还是Android, 所以简单介绍一下, 从google play商店下载 SS, v2ray-plugin(这个是插件, 安装后无图标)
SS的配置和以前一样, 只是多一个插件,
SS配置, 服务器, 远程端口:443(使用websocket+tls), 加密方式, 及以密码
在插件部分选择v2ray, 点击配置进行修改, 运输方式: websocket-tls, Hostname: yourhost, Path: nginx转发路径(/sspath)
举例截图:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!