Ubuntu 安装 shadowsocks Simple-obfs 插件客户端配置
用shadowsocks翻墙,为什么还要用混淆插件
普通用户上网,多数是访问的 http://kige.com 或 https://kige.com 这样的网址,每个人访问了什么页面,有关方面是一清二楚,毫无秘密可言
用了 shadowsocks 加密访问以后,白脸知道我们访问了海外的某个 IP 地址,并不知道我们通地这个 IP 地址在做什么,比如访问了什么页面,页面上有什么,他们是不知道的
有人推测,如果较多的流量访问海外某 IP 不常用端口,可能会被怀疑,你不浏览网页(他们不知道你是在翻墙浏览网页),这是在干啥呢,难道是不是良民?
于是有人就提出一个混淆流量的设想,把 shadowsocks 加密后的流量混淆一下,白脸喜欢在管理后台偷偷观察我们在网上干什么,加密的数据再混淆一下,白脸在后台看到我们只是在普通的上网,有时打开我们经常上的网站看开一下,一个美女也没有,又是一个无趣至极的人!!
Simple-obfs 就是 shadowsocks 的一个混淆流量的插件
Ubuntu 给 shadowsocks-libev 安装 simple-obfs 混淆流量插件
安装环境: Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-34-generic x86_64)
sudo apt-get install simple-obfs
Preparing to unpack .../simple-obfs_0.0.5-2_amd64.deb ...
Unpacking simple-obfs (0.0.5-2) ...
Setting up simple-obfs (0.0.5-2) ...
打印一下命令行选项:
obfs-server --help
-s <server_host> Host name or IP address of your remote server.
-p <server_port> Port number of your remote server.
-l <local_port> Port number of your local server.
-r <addr>:<port> Forward traffic to this remote server address.
--obfs <http|tls> Enable obfuscating: HTTP or TLS (Experimental).
[-a <user>] Run as another user.
[-f <pid_file>] The file path to store pid.
[-t <timeout>] Socket timeout in seconds.
[-c <config_file>] The path to config file.
[-n <number>] Max number of open files.
[-b <local_address>] Local address to bind.
[-6] Resovle hostname to IPv6 address first.
[-d <addr>] Name servers for internal DNS resolver.
[--fast-open] Enable TCP fast open.
with Linux kernel > 3.7.0.
[--mptcp] Enable Multipath TCP on MPTCP Kernel.
[-v] Verbose mode.
[-h, --help] Print this message.
Linux Ubuntu server Showdosocks-libev 启用 siimple-obfs 混淆插件
kige@ubuntu:~$ cd /etc/shadowsocks-libev
kige@ubuntu:/etc/shadowsocks-libev$ ls
config.json config-obfs.json
查看一下 config.obfs.json 的默认设置:
cat config.obfs.json
{
"server":"127.0.0.1",
"server_port":8388,
"local_port":1080,
"password":"veotFuFl",
"timeout":600,
"method":"chacha20-ietf-poly1305",
"mode":"tcp_and_udp",
"fast_open":true,
"plugin":"obfs-server",
"plugin_opts":"obfs=tls;failover=127.0.0.1:8443;fast-open"
}
我们要把 simple-obfs 作为 shadowsocks-libevr 的插件使用,shadowsocks-libev 的默认配置文件是 config.json,所以要把 config.obfs.json 的内容合并到 config.json:
# nobfs means not obfsed
sudo cp config.json config.nobfs.json
sudo cp config.obfs.json config.json
sudo vi config.json
# 修改成类似如下值
{
"server": ["[::0]", "0.0.0.0"],
"server_port": 1098,
"password": "killgfw",
"timeout": 600,
"method": "chacha20-ietf-poly1305",
"mode": "tcp_and_udp",
"fast_open": true,
"ipv6_first": true,
"plugin": "obfs-server",
"plugin_opts": "obfs=http;fast-open=true"
}
其中 server_port, password, method 可以自定义一下
["[::0]", "0.0.0.0"]
意思是让 simple-obfs 服务端监听本地,优先IPv6
操作系统开启 TCP fast_open 后才能在 config.json | shadowsocks.json 中设置
"fast_open": true
TFO开启成功以后,shadowsocks服务端和客户端数据交换的速度会更快一点,也就是翻墙会更加流畅一些
设置 Linux nginx 反向代理到 obfs-server
假设你的服务端已经安装了 nginx,并有了默认网站 kige.com, /etc/nginx/sites-availabe/kige.com 是你的网站配置文件
先备份一下原来的网站配置文件:
cd /etc/nginx/sites-available
sudo cp kige.com kige.com.nobfs
nobfs means not obfsed
到域名管理面板给网站 kige.com 增加一个子域名,这里是 32.kige.com
ping 32.kige.com
如果正常,ping 子域名可以看到服务端 IP 和响应时间
在 /etc/nginx/sites-available/kige.com
文件中加入一个新的 server 段代表新建的子域名。为了管理方便,我们不把设置加到既有 server 段中。反向代理主要设置在 / location {}
里
首先要理解 反向代理 的概念。我们浏览一个网页,一般是通过 nginx 把内容传送到我们的计算机上,这是从服务端 nginx 到我们计算机的数据流动,这种情况可以视为 正向代理,nginx 充当了信息传递的代理人
反向代理时,nginx 不是向外部的我们传递数据,而是向内部的一个程序传递数据,方向是不是反过来了?在这里,nginx 是向 simple-obfs 的服务端 obfs-server 传递数据
下面开始编辑 /etc/nginx/sites-available/kige.com,添加一个 server 段
sudo vi kige.com
# reverse proxy settings in / location field
server {
listen 80;
server_name 32.kige.com;
charset utf-8;
gzip on;
keepalive_timeout 120s;
location / {
if ($http_upgrade = "") {
return 301 https://www.kige.com$request_uri;
}
proxy_pass http://[::0]:1098;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
下面是 https 版本的加密反向代理(2024-08-19):
server {
server_name kige.com;
listen [::]:443 ssl;
listen 443 ssl;
location / {
if ($http_upgrade = "") {
return 301 https://kige.com$request_uri;
}
proxy_pass http://[::1]:1096;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
ssl_certificate /etc/letsencrypt/live/kige.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kige.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host ~ ^[^.]+\.kige\.com$) {
return 301 https://kige.com/;
}
listen 80;
listen [::]:80;
server_name kige.com;
}
注意,nginx 配置是空格比较敏感的,if (
中间有个空格
reverse proxy 反向代理用到 nginx 的一个模块,一般 nginx 版本已经自带,用法见下面的链接
相关资源:
- https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
- https://www.digitalocean.com/community/tutorials/understanding-nginx-http-proxying-load-balancing-buffering-and-caching
- http://nginx.org/en/docs/http/websocket.html
- https://github.com/shadowsocks/simple-obfs/
- https://github.com/aa65535/openwrt-simple-obfs
- https://zenandidi.com/archives/1789